//+------------------------------------------------------------------+ //| ytg_Parabolic_exp.mq4 | //| Yuriy Tokman | //| yuriytokman@gmail.com | //+------------------------------------------------------------------+ #property copyright "Yuriy Tokman" #property link "yuriytokman@gmail.com" extern int timeframe = 240; extern double step = 0.009; extern double maximum = 0.2; extern int StopLoss = 500; // Ðàçìåð ñòîïà â ïóíêòàõ extern int TakeProfit = 500; // Ðàçìåð òåéêà â ïóíêòàõ extern double Lotsi = 0.1; extern int MagicNumber = 28081975; //Ìàãè÷åñêîå ÷èñëî îðäåðîâ color clOpenBuy = LightBlue; // Öâåò çíà÷êà îòêðûòèÿ ïîêóïêè color clOpenSell = LightCoral; // Öâåò çíà÷êà îòêðûòèÿ ïðîäàæè color clCloseBuy = Blue; // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè color clCloseSell = Coral; // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè extern int Slippage = 30; // Ïðîñêàëüçûâàíèå öåíû extern int NumberOfTry = 5; // Êîëè÷åñòâî òîðãîâûõ ïîïûòîê bool UseSound = True; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà int NumberAccount = 0; // Íîìåð òîðãîâîãî ñ÷¸òà bool ShowComment = True; // Ïîêàçûâàòü êîììåíòàðèé //------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+ bool gbDisabled = False; // Ôëàã áëîêèðîâêè ñîâåòíèêà bool gbNoInit = False; // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè //------- Ïîäêëþ÷åíèå âíåøíèõ ìîäóëåé -----------------------------------------+ #include <stdlib.mqh> // Ñòàíäàðòíàÿ áèáëèîòåêà ÌÒ4 //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int dg=MarketInfo(OrderSymbol(), MODE_DIGITS); double parab = NormalizeDouble(iSAR(Symbol(),timeframe,step,maximum,0),dg); double sl=0, tp=0,ti=0,new_sl,new_tp; double SPREAD = MarketInfo(Symbol(),MODE_SPREAD);//Ñïðýä â ïóíêòàõ double STOPLEVEL = MarketInfo(Symbol(),MODE_STOPLEVEL); double low = iLow(Symbol(),timeframe,0); double high = iHigh(Symbol(),timeframe,0); double mp=MarketInfo(Symbol(), MODE_POINT); double pa=MarketInfo(Symbol(), MODE_ASK); double pb=MarketInfo(Symbol(), MODE_BID); //---- if(NevBar()) { //-------------------------------------------------------------buy if(!ExistOrders(NULL,OP_BUYLIMIT,MagicNumber) && parab<low && pb>parab+STOPLEVEL*mp)//îðäåðà íåò {//óñòàíàâëèâàåì if (StopLoss >0) sl=parab-StopLoss*mp; else sl=0; if (TakeProfit>0) tp=parab+TakeProfit*mp; else tp=0; SetOrder(NULL,OP_BUYLIMIT,Lotsi,parab,sl,tp,MagicNumber,0); } if(ExistOrders(NULL,OP_BUYLIMIT,MagicNumber) && pb>parab+STOPLEVEL*mp)//îðäåð åñòü {//ìîäèôèöèðóåì ti = TicketPos(NULL,OP_BUYLIMIT,MagicNumber); if (OrderSelect(ti, SELECT_BY_TICKET)) { if (StopLoss >0) sl=parab-StopLoss*mp; else sl=0; if (TakeProfit>0) tp=parab+TakeProfit*mp; else tp=0; ModifyOrder(parab,sl,tp,Turquoise); } } //--------------------------------------------------------------sell if(!ExistOrders(NULL,OP_SELLLIMIT,MagicNumber) && parab>high && pa<parab-STOPLEVEL*mp)//îðäåðà íåò {//óñòàíàâëèâàåì if (StopLoss >0) sl=parab+StopLoss*mp; else sl=0; if (TakeProfit>0) tp=parab-TakeProfit*mp; else tp=0; SetOrder(NULL,OP_SELLLIMIT,Lotsi,parab,sl,tp,MagicNumber,0); } if(ExistOrders(NULL,OP_SELLLIMIT,MagicNumber) && pa<parab-STOPLEVEL*mp)//îðäåð åñòü {//ìîäèôèöèðóåì ti = TicketPos(NULL,OP_SELLLIMIT,MagicNumber); if (OrderSelect(ti, SELECT_BY_TICKET)) { if (StopLoss >0) sl=parab+StopLoss*mp; else sl=0; if (TakeProfit>0) tp=parab-TakeProfit*mp; else tp=0; ModifyOrder(parab,sl,tp,Turquoise); } } //----------------------------------------------------------------- } //---- return(0); } //+------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ // Ôóíêöèÿ êîíòðîëÿ íîâîãî áàðà | //-----------------------------------------------------------------------------+ bool NevBar(){ static int PrevTime=0; if (PrevTime==iTime(Symbol(),timeframe,0)) return(false); PrevTime=iTime(Symbol(),timeframe,0); return(true);} //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 12.03.2008 | //| Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ îðäåðîâ. | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, | //| NULL - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ (-1 - ëþáîé îðäåð) | //| mn - MagicNumber (-1 - ëþáîé ìàãèê) | //| ot - âðåìÿ îòêðûòèÿ ( 0 - ëþáîå âðåìÿ óñòàíîâêè) | //+----------------------------------------------------------------------------+ bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) { int i, k=OrdersTotal(), ty; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { ty=OrderType(); if (ty>1 && ty<6) { if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (ot<=OrderOpenTime()) return(True); } } } } } return(False); } //+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 13.03.2008 | //| Îïèñàíèå : Óñòàíîâêà îðäåðà. | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà (NULL èëè "" - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ | //| ll - ëîò | //| pp - öåíà | //| sl - óðîâåíü ñòîï | //| tp - óðîâåíü òåéê | //| mn - Magic Number | //| ex - Ñðîê èñòå÷åíèÿ | //+----------------------------------------------------------------------------+ void SetOrder(string sy, int op, double ll, double pp, double sl=0, double tp=0, int mn=0, datetime ex=0) { color clOpen; datetime ot; double pa, pb, mp; int err, it, ticket, msl; string lsComm=WindowExpertName()+" "+GetNameTF(Period()); if (sy=="" || sy=="0") sy=Symbol(); msl=MarketInfo(sy, MODE_STOPLEVEL); if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell; if (ex>0 && ex<TimeCurrent()) ex=0; for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) { Print("SetOrder(): Îñòàíîâêà ðàáîòû ôóíêöèè"); break; } while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); ot=TimeCurrent(); ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, ex, clOpen); if (ticket>0) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); if (err==128 || err==142 || err==143) { Sleep(1000*66); if (ExistOrders(sy, op, mn, ot)) { if (UseSound) PlaySound(NameFileSound); break; } Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it); continue; } mp=MarketInfo(sy, MODE_POINT); pa=MarketInfo(sy, MODE_ASK); pb=MarketInfo(sy, MODE_BID); // Íåïðàâèëüíûå ñòîïû if (err==130) { switch (op) { case OP_BUYLIMIT: if (pp>pa-msl*mp) pp=pa-msl*mp; if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp; if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp; break; case OP_BUYSTOP: if (pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp; if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp; if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp; break; case OP_SELLLIMIT: if (pp<pb+msl*mp) pp=pb+msl*mp; if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp; if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp; break; case OP_SELLSTOP: if (pp>pb-msl*mp) pp=pb-msl*mp; if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp; if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp; break; } Print("SetOrder(): Ñêîððåêòèðîâàíû öåíîâûå óðîâíè"); } Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op), " pp=",pp," sl=",sl," tp=",tp," mn=",mn); if (pa==0 && pb==0) Message("SetOrder(): Ïðîâåðüòå â îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy); // Áëîêèðîâêà ðàáîòû ñîâåòíèêà if (err==2 || err==64 || err==65 || err==133) { gbDisabled=True; break; } // Äëèòåëüíàÿ ïàóçà if (err==4 || err==131 || err==132) { Sleep(1000*300); break; } // Ñëèøêîì ÷àñòûå çàïðîñû (8) èëè ñëèøêîì ìíîãî çàïðîñîâ (141) if (err==8 || err==141) Sleep(1000*100); if (err==139 || err==140 || err==148) break; // Îæèäàíèå îñâîáîæäåíèÿ ïîäñèñòåìû òîðãîâëè if (err==146) while (IsTradeContextBusy()) Sleep(1000*11); // Îáíóëåíèå äàòû èñòå÷åíèÿ if (err==147) { ex=0; continue; } if (err!=135 && err!=138) Sleep(1000*7.7); } } } //+----------------------------------------------------------------------------+ //| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| TimeFrame - òàéìôðåéì (êîëè÷åñòâî ñåêóíä) (0 - òåêóùèé ÒÔ) | //+----------------------------------------------------------------------------+ string GetNameTF(int TimeFrame=0) { if (TimeFrame==0) TimeFrame=Period(); switch (TimeFrame) { case PERIOD_M1: return("M1"); case PERIOD_M5: return("M5"); case PERIOD_M15: return("M15"); case PERIOD_M30: return("M30"); case PERIOD_H1: return("H1"); case PERIOD_H4: return("H4"); case PERIOD_D1: return("Daily"); case PERIOD_W1: return("Weekly"); case PERIOD_MN1: return("Monthly"); default: return("UnknownPeriod"); } } //| Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè | //+----------------------------------------------------------------------------+ string GetNameOP(int op) { switch (op) { case OP_BUY : return("Buy"); case OP_SELL : return("Sell"); case OP_BUYLIMIT : return("Buy Limit"); case OP_SELLLIMIT: return("Sell Limit"); case OP_BUYSTOP : return("Buy Stop"); case OP_SELLSTOP : return("Sell Stop"); default : return("Unknown Operation"); } } //+----------------------------------------------------------------------------+ //| Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| m - òåêñò ñîîáùåíèÿ | //+----------------------------------------------------------------------------+ void Message(string m) { Comment(m); if (StringLen(m)>0) Print(m); } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 28.11.2006 | //| Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà. | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| pp - öåíà óñòàíîâêè îðäåðà | //| sl - öåíîâîé óðîâåíü ñòîïà | //| tp - öåíîâîé óðîâåíü òåéêà | //| cl - öâåò çíà÷êà ìîäèôèêàöèè | //+----------------------------------------------------------------------------+ void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) { bool fm; double op, pa, pb, os, ot; int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it; if (pp<=0) pp=OrderOpenPrice(); if (sl<0 ) sl=OrderStopLoss(); if (tp<0 ) tp=OrderTakeProfit(); pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); op=NormalizeDouble(OrderOpenPrice() , dg); os=NormalizeDouble(OrderStopLoss() , dg); ot=NormalizeDouble(OrderTakeProfit(), dg); if (pp!=op || sl!=os || tp!=ot) { for (it=1; it<=NumberOfTry; it++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break; while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl); if (fm) { if (UseSound) PlaySound(NameFileSound); break; } else { er=GetLastError(); pa=MarketInfo(OrderSymbol(), MODE_ASK); pb=MarketInfo(OrderSymbol(), MODE_BID); Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it); Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(), " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp); Sleep(1000*10); } } } } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 19.02.2008 | //| Îïèñàíèå : Âîçâðàùàåò òèêåò ïîñëåäíåé îòêðûòîé ïîçèöèè èëè -1 | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, | //| NULL - òåêóùèé ñèìâîë) | //| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) | //| mn - MagicNumber (-1 - ëþáîé ìàãèê) | //+----------------------------------------------------------------------------+ int TicketPos(string sy="", int op=-1, int mn=-1) { datetime o; int i, k=OrdersTotal(), r=-1; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (o<OrderOpenTime()) { o=OrderOpenTime(); r=OrderTicket(); } } } } } } } return(r); }
Sample
Analysis
Market Information Used:
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Indicator Curves created:
Indicators Used:
Parabolic Stop and Reverse system
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
Other Features:
It plays sound alerts