GRID_ORDERS

Author: Yuriy Tokman (YTG)
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reached
Miscellaneous
It issuies visual alerts to the screenIt plays sound alerts
0 Views
0 Downloads
0 Favorites
GRID_ORDERS
//+------------------------------------------------------------------+
//|                                                  GRID_ORDERS.mq4 |
//|                                               Yuriy Tokman (YTG) |
//|                                               http://ytg.com.ua/ |
//+------------------------------------------------------------------+
#property copyright "Yuriy Tokman (YTG)"
#property link      "http://ytg.com.ua/"
#property version   "1.00"
#property strict

input string LotBuy   = "0.01/0.02/0.03/0.04/0.05/0.06/0.07/0.08/0.09/0.10";
input string LotSell  = "0.01/0.02/0.03/0.04/0.05/0.06/0.07/0.08/0.09/0.10";
input int    steps    = 5;
input int    MN       = 233;

bool   UseSound      = True;
string NameFileSound = "expert.wav";
bool   MarketWatch   = True;
int    Slippage      = 30;
int    NumberOfTry   = 5;                                       
//------- 
bool  gbDisabled = False;
color clOpenBuy  = LightBlue;
color clOpenSell = LightCoral;
//-------
#include <stdlib.mqh>

int startPIP;
string resultB[];
string resultS[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string to_split=LotBuy;//ñòðîêà äëÿ ðàçáèâêè íà ïîäñòðîêè 
   string sep="/";// ðàçäåëèòåëü â âèäå ñèìâîëà 
   ushort u_sep;// êîä ñèìâîëà ðàçäåëèòåëÿ 
   //string resultB[];               // ìàññèâ äëÿ ïîëó÷åíèÿ ñòðîê
   //string resultS[];               // ìàññèâ äëÿ ïîëó÷åíèÿ ñòðîê    
   //--- ïîëó÷èì êîä ðàçäåëèòåëÿ 
   u_sep=StringGetCharacter(sep,0); 
   //--- ðàçîáüåì ñòðîêó íà ïîäñòðîêè 
   int k=StringSplit(to_split,u_sep,resultB); 
   //--- âûâåäåì êîììåíòàðèé  
   PrintFormat("Ïîëó÷åíî ñòðîê: %d. Èñïîëüçîâàí ðàçäåëèòåëü '%s' ñ êîäîì %d",k,sep,u_sep); 
   //--- òåïåðü âûâåäåì âñå ïîëó÷åííûå ñòðîêè 
   if(k>0) 
     { 
      for(int i=0;i<k;i++) 
        { 
         PrintFormat("resultB[%d]=%s",i,resultB[i]); 
        } 
     }

   to_split=LotSell;     
   k=StringSplit(to_split,u_sep,resultS);  
   PrintFormat("Ïîëó÷åíî ñòðîê: %d. Èñïîëüçîâàí ðàçäåëèòåëü '%s' ñ êîäîì %d",k,sep,u_sep); 
   if(k>0) { 
    for(int i=0;i<k;i++) 
    PrintFormat("resultS[%d]=%s",i,resultS[i]);}     
//---
 startPIP = steps;

 int stoplevel = (int)MarketInfo(Symbol(),MODE_STOPLEVEL);
 if(startPIP<stoplevel)
 {startPIP=stoplevel; Alert(WindowExpertName()+"  STOPLEVEL("+DoubleToStr(stoplevel,0)+") > step("+DoubleToStr(steps,0)+"), correction!");}
 double pp =0, ll=0;

     for(int i = 0; i<10;i++)
      {
       pp = Ask + (startPIP + steps*i)*_Point;
       ll = NormalizeDouble(StrToDouble(resultB[i]),2);
       SetOrder(Symbol(),OP_BUYSTOP,ll,pp,0,0,MN,0,DoubleToStr(i,0));
      }
     for(int i = 0; i<10;i++)
      {
       pp = Bid - (startPIP + steps*i)*_Point;
       ll = NormalizeDouble(StrToDouble(resultS[i]),2);
       SetOrder(Symbol(),OP_SELLSTOP,ll,pp,0,0,MN,0,DoubleToStr(i,0));
      }
//---   
  }
//+------------------------------------------------------------------+
//----
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");
  }
}
//+----------------------------------------------------------------------------+
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");
  }
}
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}
//-----
//+----------------------------------------------------------------------------+
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);
}
//----
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0, string txt="") {
  color    clOpen;
  datetime ot;
  double   pa, pb, mp;
  int      err, it, ticket, msl;
  string   lsComm=txt;//WindowExpertName()+" "+GetNameTF(Period());

  if (sy=="" || sy=="0") sy=Symbol();
  msl=(int)MarketInfo(sy, MODE_STOPLEVEL);
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=Lime; else clOpen=Red;
  if (ex>0 && ex<TimeCurrent()) ex=0;
  for (it=1; it<=5; 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) {
      PlaySound("ok"); break;
    } else {
      err=GetLastError();
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66);
        if (ExistOrders(sy, op, mn, ot)) {
          PlaySound("ok"); 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);
    }
  }
}
//----

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