//+------------------------------------------------------------------+ //| OrderChase.mq4 | //| Roger | //| http://www.rogersignals.com | //+------------------------------------------------------------------+ #property copyright "Roger" #property link "http://www.rogersignals.com/ru/" //Ýòîò ñîâåòíèê ïðåäíàçíà÷åí äëÿ ïîñëåäîâàòåëüíîãî îòêðûòèÿ îðäåðîâ ïî çàëîæåííîé Âàìè ïðîãðàììå. //Ïðåäâàðèòåëüíî íåîáõîäèìî ïîäãîòîâèòü êîíôèãóðàöèîííûé ôàéë, â êîòîðîì Âû ðàñïèñûâàåòå ñöåíàðèé îòêðûòèÿ îðäåðîâ. //Íàçâàíèå ôàéëà - Chase.csv, ëåæèò îí â ïîääèðåêòîðèè \experts\files\ è ìîæåò âûãëÿäåòü ïðèáëèçèòåëüíî òàê: //1;SELL;0;;1.0;0;1.667;1.6285 //2;BUY;1;TP;2.2;0;1000;650 //3;SELLLIMIT;2;TP;4.0;Bid+500;0;1000 //Ïðîùå âñåãî çàïîëíÿòü ýòîò ôàéë ÷åðåç Excel, íî â ïðèíöèïå âîçìîæíî è ÷åðåç ëþáîé ðåäàêòîð //Íàçíà÷åíèå êîëîíîê ñëåäóùåå: //1 - ïîðÿäêîâûé íîìåð, èäåò ñòðîãî îò 1, 2,3 è äî ìàêñèìàëüíîãî; //2 - òèï îðäåðà (BUY, SELL, BUYLIMIT, SELLLIMIT, BUYSTOP è SELLSTOP), ìîæíî öèôðàìè; //3 - çàâèñèìîñòü îðäåðà, ò.å. åñëè Âû æåëàåòå, ÷òîáû îðäåð âûñòàâèëñÿ ïîñëå îòêðûòèÿ 1-ãî îðäåðà, ñòàâèòñÿ 1; //4 - òèï çàâèñèìîñòè, ìîæåò áûòü OP - îòêðûòèå (èìåííî îòêðûòèå, à íå âûñòàâëåíèå) îðäåðà, SL - çàêðûòèå îðäåðà ïî ñòîïó, //TP - çàêðûòèå îðäåðà ïî òåéêïðîôèòó, CL - ëþáîå çàêðûòèå îðäåðà, CL- è CL+ - çàêðûòèå îðäåðà, ñîîòâåòñòâåííî, â ìèíóñ è â ïëþñ ; //5 - ðàçìåð ëîòà; //6 - öåíà îòêðûòèÿ îðäåðà (äëÿ BUY è SELL îðäåðîâ âñåãäà 0, ïîòîìó êàê îòêðîåòñÿ ïî ðûíêó). Äëÿ îòëîæåííûõ îðäåðîâ âîçìîæíî êîñâåííîå çàäàíèå öåíû // íàïðèìåð, äëÿ BUYLIMIT - ASK-200; //7 - öåíà ñòîïëîññà çàêðûòèÿ îðäåðà (åñëè ñòàâèòå 0 èëè ïóñòîå ìåñòî, çíà÷èò ñòîïà íå áóäåò). Òàêæå âîçìîæíî çàäàíèå ñòîïà â ïèïñàõ öåëûõ ÷èñëîì; //8 - öåíà òåéêïðîôèòà çàêðûòèÿ îðäåðà (òî æå). //Ñîâåòíèê ðàáîòàåò òîëüêî äëÿ îäíîé ïàðû âàëþò, íà ãðàôèê êîòîðîé îí óñòàíîâëåí. //Åñëè öåíû èëè êîëè÷åñòâî ëîòîâ óñòàíîâëåíî íåïðàâèëüíî, îðäåð íå âûñòàâëÿåòñÿ è âñÿ öåïî÷êà íàðóøàåòñÿ. //Áóäüòå âíèìàòåëüíû!!! //Äëÿ çàïóñêà íîâîé öåïî÷êè, íåîáõîäèìî, ÷òîáû âñå îðäåðà, îòêðûòûå ýòèì ñîâåòíèêîì, áûëè çàêðûòû. //Ïåðâûé îðäåð ìîæíî îòêðûâàòü âðó÷íóþ (â îáùåé íóìåðàöèè îí áóäåò íóëåâûì). //Åñëè ïðè çàïóñêå òåðìèíàëà íè îäíîãî îðäåðà íå îòêðûòî (íàïðèìåð ïðè ãýïå çà âûõîäíûå çàêðîþòñÿ âñå îðäåðà), öèêë íà÷íåòñÿ ñ ïåðâîãî îðäåðà. //Âîçìîæíî äîïèñûâàíèå çàäàíèé, íàïðèìåð, ïîñëå îòêðûòèÿ òðåòüåãî îðäåðà äîïèñûâàåòå âåðîÿòíóþ ïîñëåäîâàòåëüíîñòü íà âîçìîæíûå çàêðûòèÿ îðäåðà è //ïåðåçàïóñêàåòå ñîâåòíèê. Êîãäà ñðàáîòàåò ñëåäóþùèé, äîïèñûâàåòå óæå äëÿ ýòîãî îðäåðà è òàê ïîêà íå íàäîåñò. //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int trade[],num[],numfrom[],ortrade[],ortic[],ormag[]; string price[],stopl[],takep[],res[]; double lots[]; int row,flag,flag2,flag3,mag,x,ord; int init() { //---- int handle,maghis,cnt; string str,typord; handle=FileOpen("Chase.csv",FILE_CSV|FILE_READ);//îòêðûâàåì ôàéë if(handle==-1)//à åñòü ëè ýòîò ôàéë âîîáùå { Alert("Ôàéë îòñóòñòâóåò!!!"); flag=1; return(0); } if(FileSize(handle)==0)//à íå ïóñòîé ëè îí { FileClose(handle); Alert("Ôàéë ïóñòîé!!!"); flag=1; return(0); } row=0; while(!FileIsEnding(handle))//íà÷èíàåì ïàðñèòü ñòðîêè { str=FileReadString(handle); if(StrToInteger(str)==0) { FileClose(handle); break; } row++; ArrayResize(num,row);//ðàñøèðÿåì ìàññèâû ArrayResize(numfrom,row); ArrayResize(trade,row); ArrayResize(res,row); ArrayResize(lots,row); ArrayResize(price,row); ArrayResize(stopl,row); ArrayResize(takep,row); num[row-1]=StrToInteger(str); //ñ÷èòûâàåì ïîýëåìåíòíî, ñíà÷àëà íîìåð typord=FileReadString(handle); if(StrToInteger(typord)==0&&typord!="0")trade[row-1]=ordtoint(typord); else trade[row-1]=StrToInteger(typord); numfrom[row-1]=StrToInteger(FileReadString(handle)); res[row-1]=FileReadString(handle); lots[row-1]=StrToDouble(FileReadString(handle)); price[row-1]=FileReadString(handle); stopl[row-1]=FileReadString(handle); takep[row-1]=FileReadString(handle);// è ïîñëåäíèé } x=OrdersTotal(); ord=0; if(x>0)for(cnt=0;cnt<x;cnt++)//ñîñòàâëÿåì ìàññèâ îòêðûòûõ îðäåðîâ íà òåðìèíàëå { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol()) { ord++; ArrayResize(ortrade,ord); ArrayResize(ormag,ord); ArrayResize(ortic,ord); ortic[ord-1]=OrderTicket(); ormag[ord-1]=OrderMagicNumber(); ortrade[ord-1]=OrderType(); } } //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int i,ii,iii,his,hisend,cnt,magic, flag1, flag11; string result; //---- if(flag==1)//åñëè ôàéë áûë ïóñòîé { Alert("Çàïîëíèòå ôàéë Chase.csv ñîãëàñíî èíñòðóêöèè è ïåðåçàïóñòèòå ñîâåòíèê!!"); return(0); } if(flag2==1)return(0); if(ord==0&&flag3==0)flag2=OpenOrders(trade[0],lots[0],price[0],stopl[0],takep[0],1);//åñëè îòêðûòûõ îðäåðîâ íåò, çàïóñêàåì ïåðâûé flag3=1; if(flag2==1) { Alert("Îøèáêà îòêðûòèÿ îðäåðà! Âñÿ öåïî÷êà íàðóøåíà! Ïåðåïðîâåðüòå ôàéë êîíôèãóðàöèè!!"); return(0); } if(x==OrdersTotal()&&x!=0)//ïðîâåðÿåì ñðàáàòûâàíèå îòëîæåííûõ { for(i=0;i<ord;i++) { OrderSelect(ortic[i], SELECT_BY_TICKET); if(ortrade[i]!=OrderType())//åñëè ñðàáîòàë { ortrade[i]=OrderType(); magic=ormag[i]; result="OP"; flag1=1; break; } } } if(x>OrdersTotal())//ïðîâåðÿåì, êàêèå îðäåðà çàêðûëèñü è ñ êàêèì ðåçóëüòàòîì { cnt=x-OrdersTotal(); int nn; for(i=OrdersHistoryTotal()-1;i>OrdersHistoryTotal()-cnt-1;i--) { OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); int mag1[],kol; string res1[]; for(ii=0;ii<ord;ii++) { if(ormag[ii]==OrderMagicNumber()&&Symbol()==OrderSymbol()) { kol++; ArrayResize(res1,kol); ArrayResize(mag1,kol); mag1[kol-1]=ormag[ii]; nn=ii; result="CL"; for(iii=0;iii<row;iii++) { if(num[iii]==mag1[kol-1]) { if((OrderClosePrice()>=OrderOpenPrice()&&OrderType()==0)||(OrderClosePrice()<=OrderOpenPrice()&&OrderType()==1))res1[kol-1]="CL+"; if((OrderClosePrice()>=OrderTakeProfit()&&OrderTakeProfit()!=0&&OrderType()==0)||(OrderClosePrice()<=OrderTakeProfit()&&OrderType()==1))res1[kol-1]="TP"; if((OrderClosePrice()<OrderOpenPrice()&&OrderType()==0)||(OrderClosePrice()>OrderOpenPrice()&&OrderType()==1))res1[kol-1]="CL-"; if((OrderClosePrice()<=OrderStopLoss()&&OrderType()==0)||(OrderClosePrice()>=OrderStopLoss()&&OrderStopLoss()!=0&&OrderType()==1))res1[kol-1]="SL"; //break; } } if(nn>=0)//èçìåíÿåì ìàññèâ îðäåðîâ { while(nn<ord) { if(ortic[nn+1]!=0) { ortic[nn]=ortic[nn+1]; ormag[nn]=ormag[nn+1]; ortrade[nn]=ortrade[nn+1]; ortic[nn+1]=0; ormag[nn+1]=0; ortrade[nn+1]=0; } else break; nn++; } } ord--; ArrayResize(ortrade,ord); ArrayResize(ormag,ord); ArrayResize(ortic,ord); } } } flag11=1; x=OrdersTotal(); } if(x<OrdersTotal())//äîáàâëåì íîâûå îðäåðà ê ìàññèâó { cnt=OrdersTotal()-x; for(i=OrdersTotal()-1;i>OrdersTotal()-1-cnt;i--) { OrderSelect(i, SELECT_BY_POS); if(Symbol()==OrderSymbol()) { ord++; ArrayResize(ortrade,ord); ArrayResize(ormag,ord); ArrayResize(ortic,ord); ortic[ord-1]=OrderTicket(); ormag[ord-1]=OrderMagicNumber(); ortrade[ord-1]=OrderType(); } } x=OrdersTotal(); } if(flag1==1)//åñëè óñëîâèÿ íàñòóïèëè îòêðûâàåì îðäåðà èç ñïèñêà { for(iii=0;iii<row;iii++) { if(numfrom[iii]==magic) { if(StringFind(result,res[iii])!=-1||(res[iii]=="CL"&&result!="OP")||(res[iii]=="CL+"&&result=="TP")||(res[iii]=="CL-"&&result=="SL")) { flag2=OpenOrders(trade[iii],lots[iii],price[iii],stopl[iii],takep[iii],num[iii]); if(flag2==1) { Alert("Îøèáêà îòêðûòèÿ îðäåðà! Âñÿ öåïî÷êà íàðóøåíà! Ïåðåïðîâåðüòå ôàéë êîíôèãóðàöèè!!"); return(0); } } } } } if(flag11==1)//åñëè óñëîâèÿ íàñòóïèëè îòêðûâàåì îðäåðà èç ñïèñêà { for(i=0;i<kol;i++) { for(iii=0;iii<row;iii++) { if(numfrom[iii]==mag1[i]) { if(StringFind(res1[i],res[iii])!=-1||(res[iii]=="CL"&&res1[i]!="OP")||(res[iii]=="CL+"&&res1[i]=="TP")||(res[iii]=="CL-"&&res1[i]=="SL")) { flag2=OpenOrders(trade[iii],lots[iii],price[iii],stopl[iii],takep[iii],num[iii]); if(flag2==1) { Alert("Îøèáêà îòêðûòèÿ îðäåðà! Âñÿ öåïî÷êà íàðóøåíà! Ïåðåïðîâåðüòå ôàéë êîíôèãóðàöèè!!"); return(0); } } } } } } return(0); } //+------------------------------------------------------------------+ int OpenOrders(int trad, double lot, string pr, string sl, string tp, int magc)//ôóíêöèÿ îòêðûòèÿ îðäåðîâ { double stop,take,prc; int cnt,ticket,err; if(StrToDouble(pr)!=0)prc= NormalizeDouble(StrToDouble(pr),Digits); else { if(StringSubstr(StringLower(pr),0,3)=="ask") { if(StringSubstr(pr,3,1)=="+")prc=Ask+StrToInteger(StringSubstr(pr,4))*Point; else prc=Ask-StrToInteger(StringSubstr(pr,4))*Point; } if(StringSubstr(StringLower(pr),0,3)=="bid") { if(StringSubstr(pr,3,1)=="+")prc=Bid+StrToInteger(StringSubstr(pr,4))*Point; else prc=Bid-StrToInteger(StringSubstr(pr,4))*Point; } } if(trad==0)prc=Ask; if(trad==1)prc=Bid; if(MathFloor(StrToDouble(sl))==StrToInteger(sl)) { if(MathMod(trad,2)==0)stop=prc-StrToInteger(sl)*Point; else stop=prc+StrToInteger(sl)*Point; } else stop= NormalizeDouble(StrToDouble(sl),Point); if(StrToDouble(sl)==0)stop=0; if(MathFloor(StrToDouble(tp))==StrToInteger(tp)) { if(MathMod(trad,2)==0)take=prc+StrToInteger(tp)*Point; else take=prc-StrToInteger(tp)*Point; } else take= NormalizeDouble(StrToDouble(tp),Point); if(StrToDouble(tp)==0)take=0; //Print("SL - ",stop," TP - ",take); if(trad==0)//áàé îðäåð { if((take==0||take-Bid>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)&&Bid-stop>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) { for(cnt=0;cnt<5;cnt++) { RefreshRates(); ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,50,stop,take,"",magc,0,CLR_NONE); if(ticket<0) { err=GetLastError(); Print("Îøèáêà - ",err); if(StrToInteger(err)<135||StrToInteger(err)>141)return(1); } else { return(0); } } } else { Print("Îðäåð Buy íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè ñòîïîâ èëè òåéêîâ! "); return(1); } } if(trad==1)//sell îðäåð { if((stop==0||stop-Ask>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)&&Ask-take>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) { for(cnt=0;cnt<5;cnt++) { RefreshRates(); ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,50,stop,take,"",magc,0,CLR_NONE); if(ticket<0) { err=GetLastError(); Print("Îøèáêà - ",err); if(StrToInteger(err)<135||StrToInteger(err)>141)return(1); } else { return(0); } } } else { Print("Îðäåð Sell íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè ñòîïîâ èëè òåéêîâ! "); return(1); } } if(trad==2)//áàéëèìèò îðäåð { if((take==0||take-prc>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)&&prc-stop>(MarketInfo(Symbol(),MODE_SPREAD)+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point &&Ask-prc>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) { for(cnt=0;cnt<5;cnt++) { RefreshRates(); ticket=OrderSend(Symbol(),OP_BUYLIMIT,lot,prc,50,stop,take,"",magc,0,CLR_NONE); if(ticket<0) { err=GetLastError(); Print("Îøèáêà - ",err); if(StrToInteger(err)<135||StrToInteger(err)>141)return(1); } else { return(0); } } } else { Print("Îðäåð BuyLimit íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè öåí, ñòîïîâ èëè òåéêîâ! "); return(1); } } if(trad==3)//selllimit îðäåð { if((stop==0||stop-prc>(MarketInfo(Symbol(),MODE_SPREAD)+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point)&&prc-take>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point &&prc-Bid>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) { for(cnt=0;cnt<5;cnt++) { RefreshRates(); ticket=OrderSend(Symbol(),OP_SELLLIMIT,lot,prc,50,stop,take,"",magc,0,CLR_NONE); if(ticket<0) { err=GetLastError(); Print("Îøèáêà - ",err); if(StrToInteger(err)<135||StrToInteger(err)>141)return(1); } else { return(0); } } } else { Print("Îðäåð SellLimit íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè öåí, ñòîïîâ èëè òåéêîâ! "); return(1); } } if(trad==4)//áàéñòîï îðäåð { if((take==0||take-prc>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)&&prc-stop>(MarketInfo(Symbol(),MODE_SPREAD)+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point &&prc-Ask>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) { for(cnt=0;cnt<5;cnt++) { RefreshRates(); ticket=OrderSend(Symbol(),OP_BUYSTOP,lot,prc,50,stop,take,"",magc,0,CLR_NONE); if(ticket<0) { err=GetLastError(); Print("Îøèáêà - ",err); if(StrToInteger(err)<135||StrToInteger(err)>141)return(1); } else { return(0); } } } else { Print("Îðäåð BuyStop íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè öåí, ñòîïîâ èëè òåéêîâ! "); return(1); } } if(trad==5)//sellstop îðäåð { if((stop==0||stop-prc>(MarketInfo(Symbol(),MODE_SPREAD)+MarketInfo(Symbol(),MODE_STOPLEVEL))*Point)&&prc-take>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point &&Bid-prc>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) { for(cnt=0;cnt<5;cnt++) { RefreshRates(); ticket=OrderSend(Symbol(),OP_SELLSTOP,lot,prc,50,stop,take,"",magc,0,CLR_NONE); if(ticket<0) { err=GetLastError(); Print("Îøèáêà - ",err); if(StrToInteger(err)<135||StrToInteger(err)>141)return(1); } else { return(0); } } } else { Print("Îðäåð SellStop íå óñòàíîâëåí - íåïðàâèëüíî çàäàíû óðîâíè öåí, ñòîïîâ èëè òåéêîâ! "); return(1); } } } int ordtoint(string tip)//ïåðåâîäèì ñäåëêè íà ÿçûê ÌÒ { int type=6; tip=StringLower(tip); if(tip=="buy")type=0; if(tip=="sell")type=1; if(tip=="buy-limit"||tip=="buy limit"||tip=="buylimit")type=2; if(tip=="sell-limit"||tip=="sell limit"||tip=="selllimit")type=3; if(tip=="buy-stop"||tip=="buy stop"||tip=="buystop")type=4; if(tip=="sell-stop"||tip=="sell stop"||tip=="sellstop")type=5; return(type); } string StringLower(string s) {//ïåðåâîäèì âñå â íèæíèé ðåãèñòð int c, i, k=StringLen(s), n; for (i=0; i<k; i++) { n=0; c=StringGetChar(s, i); if (c>64 && c<91) n=c+32; // A-Z -> a-z if (n>0) s=StringSetChar(s, i, n); } return(s); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
Checks for the total of closed orders
It automatically opens orders when conditions are reached
Other Features:
Uses files from the file system
It issuies visual alerts to the screen
It reads information from a file