//+------------------------------------------------------------------+ //| ccfp_сс_v2.mq4 | //| Copyright © 2009,Lexandros | //| | //+------------------------------------------------------------------+ // Модификация : © 2010,GENRO // v2.0 - введена задержка начала работы в минутах // - введена проверка на максимально-допустимый спрэд для открытия позиций // - введена возможность задавать максимальное проскальзывание в пунктах // - при открытии ордера проигрывается звуковой файл // v2.1 - советник работает по 8-и валютам, включая NZD #property copyright "Copyright © 2009,Lexandros" #property link "lexandros@yandex.ru" extern double step=0.0001;//величина, на которую должны разойтись линии валют на индюке, для появления сигнала; extern double start_lot=0.01;//стартовый лот для расчета MM, или если MM отключен - постоянный лот extern double min_lot=0.01;//минимальный лот разрешенный ДЦ; extern int SleepMinsAtStartup = 1;// задержка начала работы в минутах extern int magicnumber=12345; extern bool MM=true;// вкл/откл MM extern int delta=100;//величина на которую должен увеличится/уменьшится баланс для изменения размера лота, при включенном MM extern bool close=true;//вкл/откл закрытия позиция при появлении противосигнала extern bool trail=true;// extern int trailing=15;//уровень трейлинга в пунктах extern int stop=0; extern int profit=0; extern int TradeSpread = 6; //максимальный спрэд, при котором открываются позиции extern int slippage = 100;// Значение максимального проскальзывания в пунктах. double ccfp [8,2],ccfp_old [8,2],cc [8,2],cc_old [8,2],lot[1]; int cnt,n,x,y; string day; string g_str; color clr; bool open; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- g_str= StringConcatenate("Задержка ", SleepMinsAtStartup, " мин до начала работы советника", "\n"); Comment(g_str); Sleep(1000 * (60 * SleepMinsAtStartup)); //Функция задерживает выполнение текущего эксперта или скрипта на определенный интервал.В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды. //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- ///////////Money Management if (MM) { lot[0]=start_lot*MathFloor (AccountBalance()/delta); if (lot[0]MarketInfo(Symbol(),MODE_MAXLOT)) lot[0]=MarketInfo(Symbol(),MODE_MAXLOT); } else lot[0]=start_lot; ///////////////////////////////////////////// //////////трейлинг if (trail) tral(trailing,min_lot,magicnumber); ////////////////////// ///////////////////Вывод информации if (DayOfWeek( )==0) day="Воскресенье"; if (DayOfWeek( )==1) day="Понедельник"; if (DayOfWeek( )==2) day="Вторник"; if (DayOfWeek( )==3) day="Среда"; if (DayOfWeek( )==4) day="Четверг"; if (DayOfWeek( )==5) day="Пятница"; if (DayOfWeek( )==6) day="Суббота"; string info=AccountCompany()+", "+AccountName()+". Счет №: "+AccountNumber()+", Валюта счета: "+AccountCurrency()+", Плечо: "+AccountLeverage()+" Начальный лот="+DoubleToStr(start_lot,2)+". MM="+MM+". Дельта="+delta; if (AccountMargin()!=0) Comment (info,"\n",Hour(),":00. ",Day(),".",Month(),".",Year(),". ",day,"\n","Балланс=",AccountBalance(),"\n","Средства=",AccountEquity(),"\n","Просадка=",NormalizeDouble((AccountBalance()-AccountEquity())/AccountBalance(),2)*100,"%","\n","Lot=",lot[0],"\n","Открытых ордеров=",OrdersTotal(),"\n","Уровень маржи=",AccountEquity()*100/AccountMargin(),"%"); else Comment (info,"\n",Hour(),":00. час начала работы",Day(),".",Month(),".",Year(),". ",day,"\n","Балланс=",AccountBalance(),"\n","Средства=",AccountEquity(),"\n","Просадка=",NormalizeDouble((AccountBalance()-AccountEquity())/AccountBalance(),2),"\n","Lot=",lot[0],"\n","Открытых ордеров=",OrdersTotal(),"\n","Уровень маржи=0"); ////////////////////////////////////////// /////////////Заполнение массива данными индикатора CCFp for (cnt=0;cnt<8;cnt++) { ccfp [cnt,0]=iCustom(NULL,0,"CCFp",1,0,3,5,cnt,1); ccfp [cnt,1]=cnt+1; ccfp_old [cnt,0]=iCustom(NULL,0,"CCFp",1,0,3,5,cnt,2); ccfp_old [cnt,1]=cnt+1; } //////////////////////////////////////// /////////////Заполнение массива данными индикатора CC for (cnt=0;cnt<8;cnt++) { cc [cnt,0]=iCustom(NULL,0,"CC",cnt,1); cc [cnt,1]=cnt+1; cc_old [cnt,0]=iCustom(NULL,0,"CC",cnt,2); cc_old [cnt,1]=cnt+1; } //////////////////////////////////////// /////////////////Проверка сигнала for (x=0;x<8;x++) { for (y=0;y<8;y++) { if (ccfp[x,1]==ccfp[y,1])continue; if (ccfp[x,0]-ccfp[y,0]>step&&ccfp_old[x,0]-ccfp_old[y,0]<=step&&ccfp[x,0]>ccfp_old[x,0]&&ccfp[y,0]step&&cc[x,0]>cc_old[x,0]&&cc[y,0]step&&cc_old[x,0]-cc_old[y,0]<=step&&cc[x,0]>cc_old[x,0]&&cc[y,0]step&&ccfp[x,0]>ccfp_old[x,0]&&ccfp[y,0]step&&ccfp_old[x,0]-ccfp_old[y,0]<=step) {open=false; oper_up(ccfp[x,1],ccfp[y,1],lot[0],stop,profit,close,open,magicnumber);} if (cc[x,0]-cc[y,0]>step&&cc_old[x,0]-cc_old[y,0]<=step) {open=false;oper_up(cc[x,1],cc[y,1],lot[0],stop,profit,close,open,magicnumber);} } } ////////////////////////////////// //---- return(0); } //+------------------------------------------------------------------+ ////////////////////Открытие/закрытие ордеров/////////////////////// //Входные данные: top=номер валюты идущией вверх, down=номер валюты идущей вниз,l=лот,s=стоплосс в пунктах,p=профит в пунктах,cl - флаг, определяющий, закрывать ли позиции при появлении противоположного сигнала void oper_up (int top,int down,double l,int s,int p,bool cl, bool ops, int mn) { string val; int op,k,no_open; string sym; double price,st,pr; //USD if (top==1) { if (down==2){ sym="EURUSD"; op=1;}// продажа if (down==3){ sym="GBPUSD"; op=1;} if (down==4){ sym="USDCHF"; op=0;}// покупка if (down==5){ sym="USDJPY"; op=0;} if (down==6){ sym="AUDUSD"; op=1;} if (down==7){ sym="USDCAD"; op=0;} if (down==8){ sym="NZDUSD"; op=1;} } //EUR if (top==2) { if (down==1){ sym="EURUSD"; op=0;} if (down==3){ sym="EURGBP"; op=0;} if (down==4){ sym="EURCHF"; op=0;} if (down==5){ sym="EURJPY"; op=0;} if (down==6){ sym="EURAUD"; op=0;} if (down==7){ sym="EURCAD"; op=0;} if (down==8){ sym="EURNZD"; op=0; } } //GBP if (top==3) { if (down==1){ sym="GBPUSD"; op=0;} if (down==2){ sym="EURGBP"; op=1;} if (down==4){ sym="GBPCHF"; op=0;} if (down==5){ sym="GBPJPY"; op=0;} if (down==6){ sym="GBPAUD"; op=0;} if (down==7){ sym="GBPCAD"; op=0;} if (down==8){ sym="GBPNZD"; op=0;} } //CHF if (top==4) { if (down==1){ sym="USDCHF"; op=1;} if (down==2){ sym="EURCHF"; op=1;} if (down==3){ sym="GBPCHF"; op=1;} if (down==5){ sym="CHFJPY"; op=0;} if (down==6){ sym="AUDCHF"; op=1;} if (down==7){ sym="CADCHF"; op=1;} if (down==8){ sym="NZDCHF"; op=1;} } //JPY if (top==5) { if (down==1){ sym="USDJPY"; op=1;} if (down==2){ sym="EURJPY"; op=1;} if (down==3){ sym="GBPJPY"; op=1;} if (down==4){ sym="CHFJPY"; op=1;} if (down==6){ sym="AUDJPY"; op=1;} if (down==7){ sym="CADJPY"; op=1;} if (down==8){ sym="NZDJPY"; op=1;} } //AUD if (top==6) { if (down==1){ sym="AUDUSD"; op=0;} if (down==2){ sym="EURAUD"; op=1;} if (down==3){ sym="GBPAUD"; op=1;} if (down==4){ sym="AUDCHF"; op=0;} if (down==5){ sym="AUDJPY"; op=0;} if (down==7){ sym="AUDCAD"; op=0;} if (down==8){ sym="AUDNZD"; op=0;} } //CAD if (top==7) { if (down==1){ sym="USDCAD"; op=1;} if (down==2){ sym="EURCAD"; op=1;} if (down==3){ sym="GBPCAD"; op=1;} if (down==4){ sym="CADCHF"; op=0;} if (down==5){ sym="CADJPY"; op=0;} if (down==6){ sym="AUDCAD"; op=1;} if (down==8){ sym="NZDCAD"; op=1;} } //NZD if (top==8) { if (down==1){ sym="NZDUSD"; op=0;} if (down==2){ sym="EURNZD"; op=1;} if (down==3){ sym="GBPNZD"; op=1;} if (down==4){ sym="NZDCHF"; op=0;} if (down==5){ sym="NZDJPY"; op=0;} if (down==6){ sym="AUDNZD"; op=1;} if (down==7){ sym="NZDCAD"; op=0;} } //************************** //////////////Закрываем открытые ордера no_open=0; for (k=0;kTradeSpread) {Print ("Торговля по инструменту ",sym," запрещена из-за большого спрэда!!!");no_open=1;} if (no_open==0) {Print ("Открываем ",sym," ",op); OrderSend(sym,op,l,price,slippage,st,pr,"",mn);PlaySound("alert2.wav");} } } /////////////////////////////////////////////////// ////////////////Трейлинг (tr=уровень трейлинга в пунктах, ml=минимальный лот) void tral (int tr,double ml,int mn) { int cnt; int k; int x; datetime last_time; double close_lot; for (cnt=0;cnt=tr*MarketInfo(OrderSymbol(),MODE_POINT)) { Print("Двигаем стоп и закрываем половину ",OrderTicket()," ", OrderSymbol()," ",OrderType()); OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID)-tr*MarketInfo(OrderSymbol(),MODE_POINT),MarketInfo(OrderSymbol(),MODE_DIGITS)),0,0); OrderClose (OrderTicket(),close_lot,MarketInfo(OrderSymbol(),MODE_BID),slippage); } } else { if (MarketInfo(OrderSymbol(),MODE_BID)-OrderStopLoss()>=tr*MarketInfo(OrderSymbol(),MODE_POINT)*2) { Print("Двигаем стоп и закрываем половину ",OrderTicket()," ", OrderSymbol()," ",OrderType()); OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID)-tr*MarketInfo(OrderSymbol(),MODE_POINT),MarketInfo(OrderSymbol(),MODE_DIGITS)),0,0); OrderClose (OrderTicket(),close_lot,MarketInfo(OrderSymbol(),MODE_BID),slippage); } } } if (OrderType()==OP_SELL) { if (OrderStopLoss()==0||OrderStopLoss()>OrderOpenPrice()) { if (OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK)>=tr*MarketInfo(OrderSymbol(),MODE_POINT)) { Print("Двигаем стоп и закрываем половину ",OrderTicket()," ", OrderSymbol()," ",OrderType()); OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK)+tr*MarketInfo(OrderSymbol(),MODE_POINT),MarketInfo(OrderSymbol(),MODE_DIGITS)),0,0); OrderClose (OrderTicket(),close_lot,MarketInfo(OrderSymbol(),MODE_ASK),slippage); } } else { if (OrderStopLoss()-MarketInfo(OrderSymbol(),MODE_ASK)>=tr*MarketInfo(OrderSymbol(),MODE_POINT)*2) { Print("Двигаем стоп и закрываем половину ",OrderTicket()," ", OrderSymbol()," ",OrderType()); OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK)+tr*MarketInfo(OrderSymbol(),MODE_POINT),MarketInfo(OrderSymbol(),MODE_DIGITS)),0,0); OrderClose (OrderTicket(),close_lot,MarketInfo(OrderSymbol(),MODE_ASK),slippage); } } } } } ///////////////////////////////////////////////////