Author: Yuriy Tokman (YTG)
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt can change open orders parameters, due to possible stepping strategy
Indicators Used
Moving average indicatorParabolic Stop and Reverse system
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
ytg_TZ_exp
//+------------------------------------------------------------------+
//|                                                   ytg_TZ_exp.mq4 |
//|                                               Yuriy Tokman (YTG) |
//|                                               http://ytg.com.ua/ |
//+------------------------------------------------------------------+
#property copyright "Yuriy Tokman (YTG)"
#property link      "http://ytg.com.ua/"
#property description "yuriytokman@gmail.com"
#property description " "
#property description "http://ytg.com.ua/"
#property version   "1.00"
#property strict

extern int SL = 400;
// - óðîâåíü âîçìîæíûõ ïîòåðü
extern int TP = 1000;
// - óðîâåíü âîçìîæíîé ïðèáûëè
extern int lev = 200;
// - óðîâåíü êîðèäîðà ñêîëüçÿùåé ñðåäíåé
extern bool TSProfitOnly = true;
//- Ïåðåêëþ÷àòåëü çîíû, â êîòîðîé òðàë íà÷èíàåò ñâîþ ðàáîòó. Åñëè True, òî òðàë íà÷í¸ò ðàáîòó òîëüêî ïîñëå òîãî, êàê ïðîôèò ïîçèöèè äîñòèãíåò çíà÷åíèÿ TStop.Buy/Sell+TrailingStep ïóíêòîâ. Åñëè False, òî ñîâåòíèê áóäåò ïðîñòî ñëåäèòü çà òåì, ÷òîáû ñòîï ïîçèöèè îòíîñèòåëüíî òåêóùåé öåíû âñåãäà áûë íå äàëåå, ÷åì TStop.Buy/Sell+TrailingStep ïóíêòîâ. Äðóãèìè ñëîâàìè ïðè True ñîâåòíèê ðàáîòàåò òîëüêî â ïðîôèòíîé çîíå ïîçèöèè, à ïðè False è â îòðèöàòåëüíîé.
extern int TStop_Buy = 400;
//- Ðàçìåð òðàëà â ïóíêòàõ äëÿ ïîêóïîê.
extern int TStop_Sell = 50;
//- Ðàçìåð òðàëà â ïóíêòàõ äëÿ ïðîäàæ.
extern int TrailingStep = 50;
//- Øàã òðàëà â ïóíêòàõ. Íåîáõîäèì äëÿ òîãî, ÷òîáû íå ìó÷èòü äèëåðà ÷àñòûìè çàïðîñàìè.

int Slippage = 30;
int POPYTKY = 50;
bool  gbDisabled = False;
#include     <stdlib.mqh>
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   double ma_UP = iMA(Symbol(),0,85,0,0,0,0)+lev*Point;
   double ma_DN = iMA(Symbol(),0,85,0,0,0,0)-lev*Point;
   double sar   = iSAR(Symbol(),0,0.008,0.2,1);
   SimpleTrailing(Symbol());
   if(!ExistPositions(Symbol()))
    {
     if(Close[0]>sar && Close[0]>ma_UP)
     OpenPosition(Symbol(), OP_BUY, 1, Bid-SL*Point, Bid+TP*Point);
     if(Close[0]<sar && Close[0]<ma_DN)
     OpenPosition(Symbol(), OP_SELL, 1, Ask+SL*Point, Ask-TP*Point);
    }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//----
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0, string cm ="") {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm="http://ytg.com.ua/";
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=Lime; else clOpen=Red;
  for (it=1; it<=POPYTKY; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Îñòàíîâêà ðàáîòû ôóíêöèè");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=(int)MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      PlaySound("ok.wav"); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Ïðîâåðüòå â Îáçîðå ðûíêà íàëè÷èå ñèìâîëà "+sy);
      // Âûâîä ñîîáùåíèÿ îá îøèáêå
      Print("Error(",err,") opening position: ",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 (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Äëèòåëüíàÿ ïàóçà
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          PlaySound("ok.wav"); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  return(ticket);
}
//----
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  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_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
//----
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
} 
//----
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");
  }
}
//----
void SimpleTrailing(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        po=MarketInfo(OrderSymbol(), MODE_POINT);
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(OrderSymbol(), MODE_BID);
            if (!TSProfitOnly || pp-OrderOpenPrice()>TStop_Buy*po) {
              if (OrderStopLoss()<pp-(TStop_Buy+TrailingStep-1)*po) {
                ModifyOrder(-1, pp-TStop_Buy*po, -1);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
            if (!TSProfitOnly || OrderOpenPrice()-pp>TStop_Sell*po) {
              if (OrderStopLoss()>pp+(TStop_Sell+TrailingStep-1)*po || OrderStopLoss()==0) {
                ModifyOrder(-1, pp+TStop_Sell*po, -1);
              }
            }
          }
        }
      }
    }
  }
}
//----
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl = clrAliceBlue;
  double op, pa, pb, os, ot;
  int    dg=(int)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<=5; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) {
        PlaySound(""); 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);
      }
    }
  }
}
//----

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