Author: Nemezis & KimIV
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Indicators Used
Fractals
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
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);
    }
  }
}
//+----------------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---