//+----------------------------------------------------------------------------+ //| e-BFs.mq4 | //| Èäåÿ Nemezis, ðåàëèçàöèÿ Êèì Èãîðü Â. aka KimIV | //| http://www.kimiv.ru | //| | //| 07.10.2006 Ñîâåòíèê íà îñíîâå èíäèêàòîðà Fractals. | //| Âûñòàâëåíèå îðäåðîâ íà ïðîáîé ôðàêòàëîâ. | //| Âûõîäû ïî SL, TP è òðàëó. | //+----------------------------------------------------------------------------+ #property copyright "Nemezis & KimIV" #property link "http://www.kimiv.ru" #define MAGIC 20061007 //------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà ------------------------------------------ extern string _P_Orders = "---------- Ïàðàìåòðû îðäåðîâ"; extern int Distance = 15; // ðàññòîÿíèå óñòàíîâêè extern int StopLoss = 30; // ñòîï extern int TakeProfit = 100; // òåéê extern int TrailingStop = 65; // òðàë extern string _P_Expert = "---------- Ïàðàìåòðû ñîâåòíèêà"; extern int NumberAccount = 0; // Íîìåð òîðãîâîãî ñ÷¸òà extern bool UseSound = False; // Èñïîëüçîâàòü çâóêîâîé ñèãíàë extern string NameFileSound = "expert.wav"; // Íàèìåíîâàíèå çâóêîâîãî ôàéëà extern string _P_Trade = "---------- Ïàðàìåòðû òîðãîâëè"; extern int Slippage = 3; // Ïðîñêàëüçûâàíèå öåíû extern int NumberOfTry = 7; // Êîëè÷åñòâî ïîïûòîê extern int PauseAfterError = 45; // Ïàóçà ïîñëå îøèáêè â ñåêóíäàõ extern int TrailingStep = 5; // Øàã òðàëà //------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------- color clOpenBuy = LightBlue; // Öâåò îòêðûòèÿ ïîêóïêè color clOpenSell = LightCoral; // Öâåò îòêðûòèÿ ïðîäàæè color clModifyBuy = Aqua; // Öâåò ìîäèôèêàöèè ïîêóïêè color clModifySell = Tomato; // Öâåò ìîäèôèêàöèè ïðîäàæè color clCloseBuy = Blue; // Öâåò çàêðûòèÿ ïîêóïêè color clCloseSell = Red; // Öâåò çàêðûòèÿ ïðîäàæè string Name_Expert = "e-BFs"; // Íàèìåíîâàíèå ýêñïåðòà double loFractal, upFractal; int CurrentSpread, minStopLevel, prevTimeBar; //------- Ïîêëþ÷åíèå âíåøíèõ ìîäóëåé ------------------------------------------- #include <b-Lots.mqh> #include <stdlib.mqh> //+----------------------------------------------------------------------------+ //| expert initialization function | //+----------------------------------------------------------------------------+ void init() { CurrentSpread=MarketInfo(Symbol(), MODE_SPREAD); if (CurrentSpread<1) CurrentSpread=5; minStopLevel=MarketInfo(Symbol(), MODE_STOPLEVEL); if (minStopLevel<1) minStopLevel=10; } //+----------------------------------------------------------------------------+ //| expert deinitialization function | //+----------------------------------------------------------------------------+ void deinit() { if (!IsTesting()) Comment(""); } //+----------------------------------------------------------------------------+ //| expert start function | //+----------------------------------------------------------------------------+ void start() { if (!IsTesting()) { if (NumberAccount>0 && AccountNumber()!=NumberAccount) { Comment("Íà ñ÷¸òå "+AccountNumber()+" òîðãîâëÿ ÇÀÏÐÅÙÅÍÀ!"); return; } else Comment(""); } if (prevTimeBar>0 && prevTimeBar!=Time[0]) { loFractal=FindNearFractal("", 0, MODE_LOWER); upFractal=FindNearFractal("", 0, MODE_UPPER); SetOrders(); } ModifyOrders(); prevTimeBar=Time[0]; } //+----------------------------------------------------------------------------+ //| Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèè èëè îðäåðà ïî MagicNumber | //| Ïàðàìåòðû: | //| mn - äîáàâêà ê MagicNumber | //+----------------------------------------------------------------------------+ bool ExistOrderByMN(int mn) { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber()==MAGIC+mn) return(True); } } return(False); } //+----------------------------------------------------------------------------+ //| Ïîèñê áëèæàéøåãî ôðàêòàëà. | //| Ïàðàìåòðû: | //| sym - íàèìåíîâàíèå èíñòðóìåíòà | //| tf - òàéìôðåéì | //| mode - òèï ôðàêòàëà | //+----------------------------------------------------------------------------+ double FindNearFractal(string sym, int tf, int mode) { if (sym=="") sym=Symbol(); double f=0; int dg=MarketInfo(sym, MODE_DIGITS), s; for (s=2; s<100; s++) { f=iFractals(sym, tf, mode, s); if (f!=0) return(NormalizeDouble(f, dg)); } return(0); } //+----------------------------------------------------------------------------+ //| Âîçâðàùàåò íàèìåíîâàíèå òàéìôðåéìà | //+----------------------------------------------------------------------------+ string GetNameTF(int TimeFrame) { 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"); } } //+----------------------------------------------------------------------------+ //| Ìîäèôèêàöèÿ îðäåðîâ | //+----------------------------------------------------------------------------+ void ModifyOrders() { double ldStop=0, ldTake=0, oop; double pAsk=upFractal+(Distance+CurrentSpread)*Point; double pBid=loFractal-Distance*Point; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol()) { if (OrderMagicNumber()==MAGIC+1) { if (OrderType()==OP_BUY) { if (Bid-OrderOpenPrice()>TrailingStop*Point) { if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) { ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy); } } } if (OrderType()==OP_BUYSTOP) { oop=NormalizeDouble(OrderOpenPrice(), Digits); if (oop!=pAsk) { if (StopLoss!=0) ldStop=pAsk-StopLoss*Point; if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point; OrderModify(OrderTicket(), pAsk, ldStop, ldTake, 0, clModifyBuy); } } } if (OrderMagicNumber()==MAGIC+2) { if (OrderType()==OP_SELL) { if (OrderOpenPrice()-Ask>TrailingStop*Point) { if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) { ModifyStopLoss(Ask+TrailingStop*Point, clModifySell); } } } if (OrderType()==OP_SELLSTOP) { oop=NormalizeDouble(OrderOpenPrice(), Digits); if (oop!=pBid) { if (StopLoss!=0) ldStop=pBid+StopLoss*Point; if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point; OrderModify(OrderTicket(), pBid, ldStop, ldTake, 0, clModifySell); } } } } } } } //+----------------------------------------------------------------------------+ //| Ïåðåíîñ óðîâíÿ StopLoss | //| Ïàðàìåòðû: | //| ldStop - óðîâåíü StopLoss | //| lcColor - öâåò | //+----------------------------------------------------------------------------+ void ModifyStopLoss(double ldStop, color lcColor=CLR_NONE) { bool fm; double ldOpen=OrderOpenPrice(); double ldTake=OrderTakeProfit(); int err, it; for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, lcColor); if (fm) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") modifying StopLoss: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } } //+----------------------------------------------------------------------------+ //| Óñòàíîâêà îðäåðà | //| Ïàðàìåòðû: | //| op - îïåðàöèÿ | //| pp - öåíà | //| ldStop - óðîâåíü ñòîï | //| ldTake - óðîâåíü òåéê | //| mn - äîáàâêà ê ìàãèêó | //+----------------------------------------------------------------------------+ void SetOrder(int op, double pp, double ldStop, double ldTake, int mn) { color clOpen; int err, it, ticket; string lsComm=Name_Expert+" "+GetNameTF(Period()); if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell; Lots=GetSizeLot(); for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC+mn,0,clOpen); if (ticket>0) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); if (err==128 || err==142 || err==143 || err==144) { Sleep(1000*PauseAfterError); if (ExistOrderByMN(mn)) { if (UseSound) PlaySound(NameFileSound); break; } Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it); continue; } Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it); if (err==4110 || err==4111) break; Sleep(1000*PauseAfterError); } } } //+----------------------------------------------------------------------------+ //| Óñòàíîâêà îðäåðîâ | //+----------------------------------------------------------------------------+ void SetOrders() { double pp, ldStop=0, ldTake=0; int sb=0; if (!ExistOrderByMN(1)) { pp=upFractal+(Distance+CurrentSpread)*Point; if (pp-Ask>minStopLevel*Point) { if (StopLoss!=0) ldStop=pp-StopLoss*Point; if (TakeProfit!=0) ldTake=pp+TakeProfit*Point; SetOrder(OP_BUYSTOP, pp, ldStop, ldTake, 1); } } if (!ExistOrderByMN(2)) { pp=loFractal-Distance*Point; if (Bid-pp>minStopLevel*Point) { if (StopLoss!=0) ldStop=pp+StopLoss*Point; if (TakeProfit!=0) ldTake=pp-TakeProfit*Point; SetOrder(OP_SELLSTOP, pp, ldStop, ldTake, 2); } } } //+----------------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Fractals
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
It automatically opens orders when conditions are reached
Other Features:
It plays sound alerts