//+------------------------------------------------------------------+ //| iK_exp_stat_v01.mq4 | //| Ivan Katsko | //| | //+------------------------------------------------------------------+ #property copyright "Ivan Katsko" #property link "" //--------------------------------------------------------------- 1 -- #define NONE 0 extern int ShiftMode = 0; // Çàäàâàåìûé ôëàã ñäâèãà îðäåðà: 0 - íå äâèãàòü; 1 - äâèãàòü extern double Lots = 0; // Æåñòêî çàäàííîå êîëè÷. ëîòîâ ("0" - ñîâåòíèê âûáèðàåò ñàì) extern int Level = 10; // Ìèíèìàëüíûé óðîâåíü áëèçîñòè ê ðûíêó extern datetime StartDateTime = D'01.01.2009'; //Íà÷àëî ðàáîòû extern datetime FinishDateTime = D'31.12.2009'; //Êîíåö ðàáîòû extern double Prots = 0.07; // Ïðîöåíò ñâîáîäíûõ ñðåäñòâ extern int SlipPage = 3; // Ïðîñêàëüçûâàíèå êîòèðîêîê - â ïóíêòàõ bool New_Bar=false, // Ôëàã íîâîãî áàðà End_Bar=false, // Ôëàã êîíöà áàðà Cls=false, // Êðèòåðèé äëÿ çàêðûòèÿ Work=true, // Ýêñïåðò áóäåò ðàáîòàòü. Opn_R=false, // Êðèòåðèé ãîòîâíîñòè ê îòêðûòèþ îðäåðîâ Shift_U=false, // Êðèòåðèé äëÿ ñäâèãà ââåðõ Shift_D=false, // Êðèòåðèé äëÿ ñäâèãà âíèç Shift_I=false, // Êðèòåðèé äëÿ èçìåíåíèÿ index_1 Tag_msg1=false, // Ôëàã ñîîáùåíèÿ 1 Tag_msg2=false, // Ôëàã ñîîáùåíèÿ 2 Tag_msg3=true; string Symb; // Íàçâàíèå ôèíàíñ. èíñòðóìåíòà static datetime New_Time; int MaxLength = 30; // Ê-âî îáðàáàòûâàåìûõ âàðîâ double TakeProfit =20, // ÒÐ äëÿ îòêðûâàåìîãî îðäåðà StopLoss =30, // SL äëÿ îòêðûâàåìîãî îðäåðà algoritm = NONE, // Àëãîðèòì: ">0" - "ñåãîäíÿ êàê â÷åðà"; "<0" - "ñåãîäíÿ íå êàê â÷åðà" sum_TP, // Îæèäàåìàÿ àäàïòèðîâàííàÿ ñóììà äîõîäà direction = NONE, // Íàïðàâëåíèå òåêóùåå : ">0" - êóïèòü; "<0" - ïðîäàòü now_direction = NONE, // Íàïðàâëåíèå íàñòîÿùåå: ">0" - êóïèòü; "<0" - ïðîäàòü // Level, // Ìèíèìàëüíûé óðîâåíü SL/TP Discret, // Äèñêðåòíîñòü ïîäáîðà: 1 - êàæäàÿ ïîçèöèÿ; 2 - ÷åðåç ïîçèöèþ è ò.ä. New_Open, // Äîñòèãíóòûé óðîâåíü öåíû New_SL, // Óðîâåíü çàêðûòèÿ îðäåðà index_1=2, // Ìíîæèòåëü 1 äëÿ ñäâèãà index_2; // Ìíîæèòåëü 2 äëÿ ñäâèãà //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { Tag_msg1=true; // Ôëàã ñîîáùåíèÿ 1 New_Time=Time[0]; // Âðåìÿ òåêóùåãî áàðà switch (Period()) // Óñòàíîâêà index_2 { case 5: index_2 = 0.1; break; // Ïåðèîä 5-òè ìèíóòíûé case 15: index_2 = 0.2; break; // Ïåðèîä 15-òè ìèíóòíûé case 30: index_2 = 0.3; break; // Ïåðèîä 30-òè ìèíóòíûé case 60: index_2 = 0.4; break; // Ïåðèîä ÷àñîâîé case 240: index_2 = 0.5; break; // Ïåðèîä 4-õ ÷àñîâîé case 1440: index_2 = 0.6; break; // Ïåðèîä äíåâíîé default: break; //Ïåðèîä ÷àñîâîé } // Ó÷¸ò îðäåðîâ ïðè èíèöèàëèçàöèè int Total, // Êîëè÷åñòâî îðäåðîâ â îêíå Ticket, Tip=-1; // Òèï âûáðàí. îðäåðà (B=0,S=1) double TP, SL, Price; // Öåíà âûáðàííîãî îðäåðà Symb=Symbol(); // Íàçâàíèå ôèí.èíñòð. for(int i=1; i<=OrdersTotal(); i++) // Öèêë ïåðåáîðà îðäåð { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Åñëè åñòü ñëåäóþùèé { // Àíàëèç îðäåðîâ: if (OrderSymbol()!=Symb)continue; // Íå íàø ôèí. èíñòðóì if (OrderType()>1) // Ïîïàëñÿ îòëîæåííûé { Alert("Îáíàðóæåí îòëîæåííûé îðäåð. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } Total++; // Ñ÷¸ò÷èê ðûíî÷í. îðä if (Total>1) // Íå áîëåå îäíîãî îðä { Alert("Íåñêîëüêî ðûíî÷íûõ îðäåðîâ. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } Ticket =OrderTicket(); // Íîìåð âûáðàíí. îðä. Tip =OrderType(); // Òèï âûáðàííîãî îðä. Price =OrderOpenPrice(); // Öåíà âûáðàíí. îðä. SL =OrderStopLoss(); // SL âûáðàííîãî îðä. TP =OrderTakeProfit(); // TP âûáðàííîãî îðä. } } if (Level<MarketInfo(Symb,MODE_STOPLEVEL)) Level=MarketInfo(Symb,MODE_STOPLEVEL); // Ìèíèìàëüíûé óðîâåíü SL/TP Discret=1; // Ñàìàÿ òî÷íàÿ äèñêðåòèçàöèÿ if (Total==0) Opn_R=false; // â ñåðåäèíå ïåðèîäà îðäåðîâ íå îòêðûâàòü if (Ticket>0 // Åñëè åñòü îòêðûòûé îðäåð && ShiftMode==0) // È ñäâèã íå óñòàíîâëåí { New_Open=Price; // Âíà÷àëå óðîâåíü öåíû ðàâåí ÒÐ New_SL=SL; // à óðîâåíü çàêðûòèÿ ðàâåí SL Alert("Èíèò. Îðäåð íå èçìåíåí. TP=",TP,", SL=",SL,": ",Symb,", ",Period()); } if (Ticket>0 // Åñëè åñòü îòêðûòûé îðäåð && ShiftMode==1) // È óñòàíîâëåí ñäâèã { // Âîññòàíîâëåíèå ÒÐ ïðè èíèöèàëèçàöèè if (MathAbs(Price-TP)/Point < 500 && Tip==0) TP=Price + New_Stop(TakeProfit+1000)*Point; if (MathAbs(Price-TP)/Point < 500 && Tip==1) TP=Price - New_Stop(TakeProfit+1000)*Point; if (OrderModify(Ticket,Price,SL,TP,0)) { Alert("Èíèò. Îðäåð èçìåíåí. TP=",TP,", SL=",SL,": ",Symb,", ",Period()); } else { Alert("Èíèò. Îðäåð íå èçìåíåí, îøèáêà ",GetLastError(),": ",Symb,", ",Period()); } // Óñòàíîâêà New_Open è New_SL ïðè èíèöèàëèçàöèè New_Open=0; New_SL=0; if (Tip==0) // îðäåð îòêðûò íà ïîêóïêó { // ðàçðåøåí ñäâèã New_Open=Price + New_Stop(TakeProfit)*Point; // Âíà÷àëå óðîâåíü öåíû ðàâåí ÒÐ New_SL=SL; // à óðîâåíü çàêðûòèÿ ðàâåí SL if (Bid>New_Open) // íî åñëè ñäâèã óæå íà÷àëñÿ { New_Open=Bid; // íîâûé äîñòèãíóòûé óðîâåíü öåíû New_SL=New_Open // íîâûé óðîâåíü çàêðûòèÿ îðäåðà -(3*MarketInfo(Symb,MODE_SPREAD)*Point // íèæå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ +index_2*(New_Open-(Price+(TakeProfit // ïëþñ 0.1 (óâåëè÷èâàåòñÿ) -MarketInfo(Symb, MODE_SPREAD))*Point))); // ñ ó÷åòîì ñïðåäà } } if (Tip==1) // îðäåð îòêðûò íà ïîêóïêó { // ðàçðåøåí ñäâèã New_Open=Price - New_Stop(TakeProfit)*Point; // Âíà÷àëå óðîâåíü öåíû ðàâåí ÒÐ New_SL=SL; // à óðîâåíü çàêðûòèÿ ðàâåí SL if (Ask<New_Open) // íî åñëè ñäâèã óæå íà÷àëñÿ { New_Open=Ask; // íîâûé äîñòèãíóòûé óðîâåíü öåíû New_SL=New_Open // íîâûé óðîâåíü çàêðûòèÿ îðäåðà +(3*MarketInfo(Symb,MODE_SPREAD)*Point // âûøå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ -index_2*(New_Open-(Price-(TakeProfit // ïëþñ èíäåêñ (óâåëè÷èâàåòñÿ) +MarketInfo(Symb, MODE_SPREAD))*Point)));// ñ ó÷åòîì ñïðåäà } } Alert("Ïðè èíèöèàëèçàöèè New_Open=",New_Open,", New_SL=",New_SL,": ",Symb,", ",Period()); // Îòðàçèòü íîâûå óðîâíè íà ãðàôèêå ObjectDelete("New_Open"); ObjectCreate("New_Open", OBJ_HLINE, 0 , 0, New_Open); ObjectDelete("New_SL"); ObjectCreate("New_SL", OBJ_HLINE, 0 , 0, New_SL); } // íåò îòêðûòûõ îðäåðîâ } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { // Ó÷¸ò îðäåðîâ ïðè äåèíèöèàëèçàöèè int Total, // Êîëè÷åñòâî îðäåðîâ â îêíå Tip=-1, // Òèï âûáðàí. îðäåðà (B=0,S=1) Ticket; double TP, SL, Price; // Öåíà âûáðàííîãî îðäåðà Symb=Symbol(); // Íàçâàíèå ôèí.èíñòð. for(int i=1; i<=OrdersTotal(); i++) // Öèêë ïåðåáîðà îðäåð { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Åñëè åñòü ñëåäóþùèé { // Àíàëèç îðäåðîâ: if (OrderSymbol()!=Symb)continue; // Íå íàø ôèí. èíñòðóì if (OrderType()>1) // Ïîïàëñÿ îòëîæåííûé { Alert("Îáíàðóæåí îòëîæåííûé îðäåð. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } Total++; // Ñ÷¸ò÷èê ðûíî÷í. îðä if (Total>1) // Íå áîëåå îäíîãî îðä { Alert("Íåñêîëüêî ðûíî÷íûõ îðäåðîâ. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } Ticket =OrderTicket(); // Íîìåð âûáðàíí. îðä. Tip =OrderType(); // Òèï âûáðàííîãî îðä. Price =OrderOpenPrice(); // Öåíà âûáðàíí. îðä. SL =OrderStopLoss(); // SL âûáðàííîãî îðä. } } if (Ticket>0 // Åñëè åñòü îòêðûòûé îðäåð && ShiftMode==1) // È óñòàíîâëåí ñäâèã { //---- ÒÐ äëÿ îòêðûòîãî íå ñäâèíóòîãî îðäåðà if (Tip==0 // Åñëè îðäåð îòêðûò íà ïîêóïêó, && !(Shift_U||Shift_D)) // íå íà÷àò ñäâèã, TP=Ask + New_Stop(TakeProfit)*Point; if (Tip==1 // Åñëè îðäåð îòêðûò íà ïðîäàæó, && !(Shift_U||Shift_D)) // íå íà÷àò ñäâèã, TP=Bid - New_Stop(TakeProfit)*Point; //---- ÒÐ äëÿ îòêðûòîãî è ñäâèíóòîãî îðäåðà if (Tip==0 // Åñëè îðäåð îòêðûò íà ïîêóïêó, && (Shift_U||Shift_D)) // íà÷àò ñäâèã, { TP=New_Open + New_Stop(TakeProfit)*Point; SL=New_SL; } if (Tip==1 // Åñëè îðäåð îòêðûò íà ïðîäàæó, && (Shift_U||Shift_D)) // íà÷àò ñäâèã, { TP=New_Open - New_Stop(TakeProfit)*Point; SL=New_SL; } //---- Óñòàíîâèòü ðåàëüíûé ÒÐ äëÿ îòêðûòîãî îðäåðà if (OrderModify(Ticket,Price,SL,TP,0)) { Alert("Äåèíèò. Îðäåð èçìåíåí. TP=",TP,", SL=",SL,": ",Symb,", ",Period()); return; } else { Alert("Äåèíèò. Îðäåð íå èçìåíåí, îøèáêà ",GetLastError(),": ",Symb,", ",Period()); } } // íåò îòêðûòûõ îðäåðîâ ObjectDelete("New_Open"); ObjectDelete("New_SL"); return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { Fun_New_Bar(); // Îïðåäåëåíèå íà÷àëà íîâîãî áàðà //---- int Total, // Êîëè÷åñòâî îðäåðîâ â îêíå Tip=-1, // Òèï âûáðàí. îðäåðà (B=0,S=1) Ticket; // Íîìåð îðäåðà datetime Time_Begin, // Ìîìåíò íà÷àëà ðàáî÷åãî ïåðèîäà Op_Time; // Âðåìÿ îòêðûòèÿ îðäåðà double Lot, // Êîëè÷. ëîòîâ â âûáðàííîì îðäåðå Lts, // Êîëè÷. ëîòîâ â îòêðûâàåìîì îðäåðå Min_Lot, // Ìèíèìàëüíîå êîëè÷åñòâî ëîòîâ Step, // Øàã èçìåíåíèÿ ðàçìåðà ëîòà Free, // Òåêóùèå ñâîáîäíûå ñðåäñòâà One_Lot, // Ñòîèìîñòü îäíîãî ëîòà Price, // Öåíà âûáðàííîãî îðäåðà SL, // SL âûáðàííîãî îðäåðà TP; // TP âûáðàííîãî îðäåðà bool Ans =false, // Îòâåò ñåðâåðà ïîñëå çàêðûòèÿ Opn_B=false, // Êðèòåðèé äëÿ îòêðûòèÿ Buy Opn_S=false; // Êðèòåðèé äëÿ îòêðûòèÿ Sell Cls =false; // Êðèòåðèé äëÿ çàêðûòèÿ Time_Begin=GetTickCount(); // çàñåêàåì íà÷àëî âûïîëíåíèÿ ïðîãðàììû //------------------- Îäèí ðàç çà ïåðèîä -- if (New_Bar) // Îäèí ðàç çà ïåðèîä âûïîëíÿåòñÿ ñëåäóþùåå { Tag_msg1=true; End_Bar=false; // Opn_R=true; // Ïðåäâàðèò.îáðàáîòêà if(TimeCurrent()<StartDateTime) // Âðåìÿ ñòàðòà íå íàñòóïèëî { Alert("Âðåìÿ ñòàðòà íå íàñòóïèëî. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } if (TimeCurrent()>=FinishDateTime) //Âðåìÿ ôèíèøà íàñòóïèëî { Alert("Âðåìÿ ôèíèøà íàñòóïèëî. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } if(Bars < MaxLength) // Íåäîñòàòî÷íî áàðîâ { Alert("Íåäîñòàòî÷íî áàðîâ â îêíå. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } if(Work==false) // Êðèòè÷åñêàÿ îøèáêà { Alert("Êðèòè÷åñêàÿ îøèáêà. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } } //------------------- Êîíåö îäèí ðàç çà ïåðèîä -- if ((TimeCurrent()-Time[0]-50)>(Period()-1)*60 //Çà 10 ñåêóíä äî íà÷àëà ïåðèîäà && Tag_msg1 ) { Alert("Âíèìàíèå! Íà÷èíàåòñÿ íîâûé ïåðèîä!",": ",Symb,", ",Period()); Tag_msg1=false; End_Bar=true; } //----------------------- Ó÷¸ò îðäåðîâ Symb=Symbol(); // Íàçâàíèå ôèí.èíñòð. Total=0; // Êîëè÷åñòâî îðäåðîâ for(int i=1; i<=OrdersTotal(); i++) // Öèêë ïåðåáîðà îðäåð { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Åñëè åñòü ñëåäóþùèé { // Àíàëèç îðäåðîâ: if (OrderSymbol()!=Symb)continue; // Íå íàø ôèí. èíñòðóì if (OrderType()>1) // Ïîïàëñÿ îòëîæåííûé { Alert("Îáíàðóæåí îòëîæåííûé îðäåð. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } Total++; // Ñ÷¸ò÷èê ðûíî÷í. îðä if (Total>1) // Íå áîëåå îäíîãî îðä { Alert("Íåñêîëüêî ðûíî÷íûõ îðäåðîâ. Ýêñïåðò íå ðàáîòàåò.",": ",Symb,", ",Period()); return; // Âûõîä èç start() } Ticket =OrderTicket(); // Íîìåð âûáðàíí. îðä. Op_Time=OrderOpenTime(); // Âðåìÿ îòêðûòèÿ âûáð.îðä. Tip =OrderType(); // Òèï âûáðàííîãî îðä. Price =OrderOpenPrice(); // Öåíà âûáðàíí. îðä. SL =OrderStopLoss(); // SL âûáðàííîãî îðä. TP =OrderTakeProfit(); // TP âûáðàííîãî îðä. Lot =OrderLots(); // Êîëè÷åñòâî ëîòîâ } } // Òîðãîâûå êðèòåðèè TakeProfit = iCustom(0, 0, "iK_tay_v01",Discret, Level, 0, 1)/Point; //îïðåäåëÿåì Òåéê Ïðîôèò StopLoss = iCustom(0, 0, "iK_tay_v01",Discret, Level, 1, 1)/Point; //îïðåäåëÿåì Ñòîï Ëîññ algoritm = iCustom(0, 0, "iK_tay_v01",Discret, Level, 4, 1); //îïðåäåëÿåì àëãîðèòì sum_TP = iCustom(0, 0, "iK_tay_v01",Discret, Level, 2, 1); direction = iCustom(0, 0, "iK_tay_v01",Discret, Level, 3, 1); //îïðåäåëÿåì òåêóùåå íàïðàâëåíèå now_direction = iCustom(0, 0, "iK_tay_v01",Discret, Level, 3, 0); //îïðåäåëÿåì íàñòîÿùåå íàïðàâëåíèå if (New_Bar) //  íà÷àëå íîâîãî ïåðèîäà { if (Total==0) // Åñëè íåò îòêðûòûõ îðäåðîâ Opn_R=true; // ðàçðåøèòü îòêðûòèå îðäåð else // åñëè îðäåð áûë îòêðûò Opn_R=false; // çàïðåòèòü îòêðûòèå (ïðè çàêðûòèè òåðìèíàëîì) } if (Total==0) // Åñëè íåò îòêðûòûõ îðäåðîâ { Cls=false; // Åù¸ íå÷åãî çàêðûâàòü Shift_U=false; // Îáíóëÿåì êðèòåðèé äëÿ ñäâèãà ââåðõ Shift_D=false; // Îáíóëÿåì êðèòåðèé äëÿ ñäâèãà âíèç ObjectDelete("New_Open"); // Îäàëÿåì ëèíèè ObjectDelete("New_SL"); } if (direction==NONE && New_Bar) // Íàïðàâëåíèå íå îïðåäåëåíî { Cls = true; // ðàçðåøèì çàêðûòèå îðäåðà Alert("Íàïðàâëåíèå òîðãîâëè íå îïðåäåëåíî",": ",Symb,", ",Period()); } if ((direction==NONE && Total==0) || // Íàïðàâëåíèå íå îïðåäåëåíî èëè (sum_TP<=0 && Total==0)) // áóäåò îòðèöàòåëüíûé ðåçóëüòàò { Opn_R=false; // â ñåðåäèíå ïåðèîäà îðäåðîâ íå îòêðûâàòü return; //Âûõîä èç start() } // Óñëîâèÿ îòêðûòèÿ îðäåðà if (Total==0 // îòêðûòûõ îðäåðîâ íåò, && direction!=0 // îïðåäåëåíî íàïðàâëåíèå, && Opn_R) // îðäåð â ýòîì ïåðèîäå åù¸ íå îòêðûâàëñÿ { if (direction>0) // è íàïðàâëåíèå ââåðõ, òî { Opn_B=true; // íàäî îòêðûâàòü îðäåð íà Buy } else // íàïðàâëåíèå âíèç - { Opn_S=true; // íà Sell } } // Óñëîâèÿ çàêðûòèÿ îðäåðà â êîíöå ïåðèîäà if (Total>0 // åñòü îòêðûòûé îðäåð, && End_Bar // â êîíöå ïåðèîäà // && Op_Time<Time[0] // îí îòêðûò â ïðåäûäóùèé ïåðèîä && !(Shift_U||Shift_D) // íå íà÷àò ñäâèã && ((direction!=now_direction) // ïðåäïîëàãàåòñÿ íå òî æå íàïðàâëåíèå || (direction==0 && now_direction==0)))// íå øòàòíàÿ ñèòóàöèÿ { Cls = true; // íàäî çàêðûâàòü îðäåð } // Óñëîâèÿ ñäâèãà îðäåðà è ñîáñòâåííî ñäâèã if (Total>0 // Åñëè åñòü îòêðûòûé îðäåð, && ShiftMode==1) // óñòàíîâëåí ôëàã ñäâèãà { if (Tip==0 // îðäåð îòêðûò íà ïîêóïêó && Bid>New_Open) // äîñòèãíóòî ÒÐ { // òî íàäî äâèãàòü ââåðõ index_1=3; switch (Period()) // Óñòàíîâêà index_2 { case 5: index_2 = 0.1; break; // Ïåðèîä 5-òè ìèíóòíûé case 15: index_2 = 0.2; break; // Ïåðèîä 15-òè ìèíóòíûé case 30: index_2 = 0.3; break; // Ïåðèîä 30-òè ìèíóòíûé case 60: index_2 = 0.4; break; // Ïåðèîä ÷àñîâîé case 240: index_2 = 0.5; break; // Ïåðèîä 4-õ ÷àñîâîé case 1440: index_2 = 0.6; break; // Ïåðèîä äíåâíîé default: break; //Ïåðèîä ÷àñîâîé } New_Open=Bid; // íîâûé äîñòèãíóòûé óðîâåíü öåíû New_SL=New_Open // íîâûé óðîâåíü çàêðûòèÿ îðäåðà -(index_1*MarketInfo(Symb,MODE_SPREAD)*Point // íèæå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ +index_2*(New_Open-(Price+(TakeProfit // ïëþñ 0.1 (óâåëè÷èâàåòñÿ) -MarketInfo(Symb, MODE_SPREAD))*Point))); // ñ ó÷åòîì ñïðåäà Shift_U=true; Alert("Îðäåð ñäâèíóò ââåðõ íà ",New_Open,", New_SL=",New_SL,": ",Symb,", ",Period()); } if (Tip==1 // îðäåð îòêðûò íà ïðîäàæó && Ask<New_Open) // äîñòèãíóòî ÒÐ { // òî íàäî äâèãàòü âíèç index_1=3; switch (Period()) // Óñòàíîâêà index_2 { case 5: index_2 = 0.1; break; // Ïåðèîä 5-òè ìèíóòíûé case 15: index_2 = 0.2; break; // Ïåðèîä 15-òè ìèíóòíûé case 30: index_2 = 0.3; break; // Ïåðèîä 30-òè ìèíóòíûé case 60: index_2 = 0.4; break; // Ïåðèîä ÷àñîâîé case 240: index_2 = 0.5; break; // Ïåðèîä 4-õ ÷àñîâîé case 1440: index_2 = 0.6; break; // Ïåðèîä äíåâíîé default: break; //Ïåðèîä ÷àñîâîé } New_Open=Ask; // íîâûé äîñòèãíóòûé óðîâåíü öåíû New_SL=New_Open // íîâûé óðîâåíü çàêðûòèÿ îðäåðà +(index_1*MarketInfo(Symb,MODE_SPREAD)*Point // âûøå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ -index_2*(New_Open-(Price-(TakeProfit // ïëþñ 0.1 (óâåëè÷èâàåòñÿ) +MarketInfo(Symb, MODE_SPREAD))*Point))); // ñ ó÷åòîì ñïðåäà Shift_D=true; Alert("Îðäåð ñäâèíóò âíèç íà ",New_Open,", New_SL=",New_SL,": ",Symb,", ",Period()); } // Èçìåíèòü íîâûé óðîâåíü çàêðûòèÿ îðäåðà index_1=0.99*index_1; index_2=0.99*index_2; if (Tip==0 // îðäåð îòêðûò íà ïîêóïêó && (Shift_D || Shift_U)) // áûë íà÷àò ñäâèã { // òî íàäî äâèãàòü ââåðõ New_SL=New_Open // íîâûé óðîâåíü çàêðûòèÿ îðäåðà -(index_1*MarketInfo(Symb,MODE_SPREAD)*Point// íèæå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ +index_2*(New_Open-(Price+(TakeProfit // ïëþñ 0.1 (óâåëè÷èâàåòñÿ) -MarketInfo(Symb, MODE_SPREAD))*Point))); // ñ ó÷åòîì ñïðåäà } if (Tip==1 // îðäåð îòêðûò íà ïðîäàæó && (Shift_D || Shift_U)) // áûë íà÷àò ñäâèã { // òî íàäî äâèãàòü âíèç New_SL=New_Open // íîâûé óðîâåíü çàêðûòèÿ îðäåðà +(index_1*MarketInfo(Symb,MODE_SPREAD)*Point// âûøå íîâîãî óðîâíÿ íà 2 ñòîï óðîâíÿ -index_2*(New_Open-(Price-(TakeProfit // ïëþñ 0.1 (óâåëè÷èâàåòñÿ) -MarketInfo(Symb, MODE_SPREAD))*Point))); // ñ ó÷åòîì ñïðåäà } // Îòðàçèòü íîâûå óðîâíè íà ãðàôèêå ObjectDelete("New_Open"); ObjectCreate("New_Open", OBJ_HLINE, 0 , 0, New_Open); ObjectDelete("New_SL"); ObjectCreate("New_SL", OBJ_HLINE, 0 , 0, New_SL); } //--------------------------------------------------------------- 7 -- // Ñòîèìîñòü îðäåðîâ RefreshRates(); // Îáíîâëåíèå äàííûõ Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Ìèíèì. êîëè÷. ëîòîâ Free =AccountFreeMargin(); // Ñâîáîäí ñðåäñòâà One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Ñòîèìîñòü 1 ëîòà Step =MarketInfo(Symb,MODE_LOTSTEP); // Øàã èçìåíåí ðàçìåðà if (Lots > 0) // Åñëè çàäàíû ëîòû,òî Lts =Lots; // ñ íèìè è ðàáîòàåì else // % ñâîáîäíûõ ñðåäñòâ Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Äëÿ îòêðûòèÿ if(Lts < Min_Lot) Lts=Min_Lot; // Íå ìåíüøå ìèíèìàëüí if (Lts*One_Lot > Free && // Ëîò äîðîæå ñâîáîäí. TimeCurrent()<(Time[0] + 2*60) && // íå ïðîøëî åù¸ áîëåå 2-õ ìèíóò Total==0) // è îðäåð íå îòêðûò { Alert(" Íå õâàòàåò äåíåã íà ", Lts," ëîò",": ",Symb,", ",Period()); return; // Âûõîä èç start() } // Óñëîâèÿ çàêðûòèÿ îðäåðîâ ïðè ñäâèãå if (((Tip==0) // Åñëè ïðè äâèæåíèè ââåðõ && Shift_U // íà÷àò ñäâèã ââåðõ && (Bid<New_SL)) || // óðîâåíü íèæå íîâîãî óðîâíÿ çàêðûòèÿ îðäåðà èëè ((Tip==1) // Åñëè ïðè äâèæåíèè âíèç && Shift_D // íà÷àò ñäâèã âíèç && (Ask>New_SL))) // óðîâåíü âûøå íîâîãî óðîâíÿ çàêðûòèÿ îðäåðà { Cls = true; // íàäî çàêðûâàòü îðäåð Opn_R=false; // äî íà÷àëà íîâîãî ïåðèîäà îðäåðîâ íå îòêðûâàòü } //--------------------------------------------------------------- 6 -- // Çàêðûòèå îðäåðîâ while(Ticket>0) // Öèêë çàêðûòèÿ îðä. { if (Tip==0 && Cls==true) // Îòêðûò îðäåð Buy.. { // è åñòü êðèòåðèé çàêð Alert("Ïîïûòêà çàêðûòü Buy ",Ticket,". Îæèäàíèå îòâåòà..",": ",Symb,", ",Period()); RefreshRates(); // Îáíîâëåíèå äàííûõ Ans=OrderClose(Ticket,Lot,Bid,2); // Çàêðûòèå Buy if (Ans==true) // Ïîëó÷èëîñü :) { Alert ("Çàêðûò îðäåð Buy ",Ticket,": ",Symb,", ",Period()); break; // Âûõîä èç öèêëà çàêð } if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê { Opn_R=false; // äî íà÷àëà íîâîãî ïåðèîäà îðäåðîâ íå îòêðûâàòü continue; // Ïîâòîðíàÿ ïîïûòêà } return; // Âûõîä èç start() } if (Tip==1 && Cls==true) // Îòêðûò îðäåð Sell.. { // è åñòü êðèòåðèé çàêð Alert("Ïîïûòêà çàêðûòü Sell ",Ticket,". Îæèäàíèå îòâåòà..",": ",Symb,", ",Period()); RefreshRates(); // Îáíîâëåíèå äàííûõ Ans=OrderClose(Ticket,Lot,Ask,2); // Çàêðûòèå Sell if (Ans==true) // Ïîëó÷èëîñü :) { Alert ("Çàêðûò îðäåð Sell ",Ticket,": ",Symb,", ",Period()); break; // Âûõîä èç öèêëà çàêð } if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê { Opn_R=false; // äî íà÷àëà íîâîãî ïåðèîäà îðäåðîâ íå îòêðûâàòü continue; // Ïîâòîðíàÿ ïîïûòêà } return; // Âûõîä èç start() } break; // Âûõîä èç while } //--------------------------------------------------------------- 8 -- // Îòêðûòèå îðäåðîâ while(Opn_R) // Öèêë îòêðûòèÿ îðä. { if (Total==0 && Opn_B==true) // Îòêðûòûõ îðä. íåò + { // êðèòåðèé îòêð. Buy RefreshRates(); // Îáíîâëåíèå äàííûõ SL=Ask - New_Stop(StopLoss)*Point; // Âû÷èñëåíèå SL îòêð. if (ShiftMode==0) // Âû÷èñëåíèå TP îòêð. {TP=Ask + New_Stop(TakeProfit)*Point;} else {TP=Ask + New_Stop(TakeProfit+1000)*Point;} Alert("Ïîïûòêà îòêðûòü Buy. Îæèäàíèå îòâåòà..",": ",Symb,", ",Period()); Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Îòêðûòèå Buy if (Ticket > 0) // Ïîëó÷èëîñü :) { New_Open=Ask + New_Stop(TakeProfit)*Point; // Äîñòèãíóòûé óðîâåíü öåíû New_SL=SL; // Óðîâåíü çàêðûòèÿ îðäåðà Opn_R=false; // Áîëüøå îðäåðîâ â ýòîì ïåðèîäå íå îòêðûâàòü Alert ("Îòêðûò îðäåð Buy ",Ticket,": ",Symb,", ",Period()); return; // Âûõîä èç start() } if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà return; // Âûõîä èç start() } if (Total==0 && Opn_S==true) // Îòêðûòûõ îðä. íåò + { // êðèòåðèé îòêð. Sell RefreshRates(); // Îáíîâëåíèå äàííûõ SL=Bid + New_Stop(StopLoss)*Point; // Âû÷èñëåíèå SL îòêð. if (ShiftMode==0) // Âû÷èñëåíèå TP îòêð. {TP=Bid - New_Stop(TakeProfit)*Point;} else {TP=Bid - New_Stop(TakeProfit+1000)*Point;} Alert("Ïîïûòêà îòêðûòü Sell. Îæèäàíèå îòâåòà..",": ",Symb,", ",Period()); Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Îòêðûòèå Sel if (Ticket > 0) // Ïîëó÷èëîñü :) { New_Open=Bid - New_Stop(TakeProfit)*Point; // Äîñòèãíóòûé óðîâåíü öåíû New_SL=SL; // Óðîâåíü çàêðûòèÿ îðäåðà Opn_R=false; // Áîëüøå îðäåðîâ â ýòîì ïåðèîäå íå îòêðûâàòü Alert ("Îòêðûò îðäåð Sell ",Ticket,": ",Symb,", ",Period()); return; // Âûõîä èç start() } if (Fun_Error(GetLastError())==1) // Îáðàáîòêà îøèáîê continue; // Ïîâòîðíàÿ ïîïûòêà return; // Âûõîä èç start() } break; // Âûõîä èç while } //---- return; // Âûõîä èç start() } //-------------------------------------------------------------- 10 -- int Fun_Error(int Error) // Ô-èÿ îáðàáîò îøèáîê { switch(Error) { // Ïðåîäîëèìûå îøèáêè case 4: Alert("Òîðãîâûé ñåðâåð çàíÿò. Ïðîáóåì åù¸ ðàç..",": ",Symb,", ",Period()); Sleep(3000); // Ïðîñòîå ðåøåíèå return(1); // Âûõîä èç ôóíêöèè case 130:Alert("Ñëèøêîì áëèçêî ñòîïû",": ",Symb,", ",Period()); Level++; // Ïðèðàñòèòü ìèíèìàëüíûé óðîâåíü SL/TP Opn_R=false; // Îðäåðîâ â ýòîì ïåðèîäå íå îòêðûâàòü // Sleep(5000); // Ïðîñòîå ðåøåíèå return(1); // Âûõîä èç ôóíêöèè case 135:Alert("Öåíà èçìåíèëàñü. Ïðîáóåì åù¸ ðàç..",": ",Symb,", ",Period()); RefreshRates(); // Îáíîâèì äàííûå return(1); // Âûõîä èç ôóíêöèè case 136:Alert("Íåò öåí. Æä¸ì íîâûé òèê..",": ",Symb,", ",Period()); while(RefreshRates()==false) // Äî íîâîãî òèêà Sleep(1); // Çàäåðæêà â öèêëå return(1); // Âûõîä èç ôóíêöèè case 137:Alert("Áðîêåð çàíÿò. Ïðîáóåì åù¸ ðàç..",": ",Symb,", ",Period()); Sleep(3000); // Ïðîñòîå ðåøåíèå return(1); // Âûõîä èç ôóíêöèè case 138:Alert("Çàïðîøåííàÿ öåíà óñòàðåëà..",": ",Symb,", ",Period()); return(1); // Âûõîä èç ôóíêöèè case 145:Alert("Îðäåð ñëèøêîì áëèçîê ê ðûíêó . Ïðîáóåì ÷åðåç 15ñåê.",": ",Symb,", ",Period()); Cls = false; // Sleep(15000); // Ïðîñòîå ðåøåíèå return(1); // Âûõîä èç ôóíêöèè case 146:Alert("Ïîäñèñòåìà òîðãîâëè çàíÿòà. Ïðîáóåì åù¸..",": ",Symb,", ",Period()); Sleep(500); // Ïðîñòîå ðåøåíèå return(1); // Âûõîä èç ôóíêöèè // Êðèòè÷åñêèå îøèáêè case 2: Alert("Îáùàÿ îøèáêà.",": ",Symb,", ",Period()); return(0); // Âûõîä èç ôóíêöèè case 5: Alert("Ñòàðàÿ âåðñèÿ òåðìèíàëà.",": ",Symb,", ",Period()); Work=false; // Áîëüøå íå ðàáîòàòü return(0); // Âûõîä èç ôóíêöèè case 64: Alert("Ñ÷åò çàáëîêèðîâàí.",": ",Symb,", ",Period()); Work=false; // Áîëüøå íå ðàáîòàòü return(0); // Âûõîä èç ôóíêöèè case 133:Alert("Òîðãîâëÿ çàïðåùåíà.",": ",Symb,", ",Period()); return(0); // Âûõîä èç ôóíêöèè case 134:Alert("Íåäîñòàòî÷íî äåíåã äëÿ ñîâåðøåíèÿ îïåðàöèè.",": ",Symb,", ",Period()); return(0); // Âûõîä èç ôóíêöèè default: Alert("Âîçíèêëà îøèáêà ",Error,": ",Symb,", ",Period()); // Äðóãèå âàðèàíòû return(0); // Âûõîä èç ôóíêöèè } } //-------------------------------------------------------------- 11 -- int New_Stop(int Parametr) // Ïðîâåðêà ñòîï-ïðèê. { int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Ìèíèì. äèñòàíöèÿ if (Parametr < Min_Dist) // Åñëè ìåíüøå äîïóñò. { Parametr=Min_Dist; // Óñòàíîâèì äîïóñò. } return(Parametr); // Âîçâðàò çíà÷åíèÿ } //+------------------------------------------------------------------+ void Fun_New_Bar() // Ô-èÿ îáíàðóæåíèÿ íîâîãî áàðà { New_Bar=false; // Íîâîãî áàðà íåò if(New_Time!=Time[0]) // Ñðàâíèâàåì âðåìÿ { New_Time=Time[0]; // Òåïåðü âðåìÿ òàêîå New_Bar=true; // Ïîéìàëñÿ íîâûé áàð } } //-------------------------------------------------------------- 12 --
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
iK_tay_v01
Order Management characteristics:
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
It Closes Orders by itself
It automatically opens orders when conditions are reached
Other Features:
It issuies visual alerts to the screen