e-BFs





//+----------------------------------------------------------------------------+
//|                                                                  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