grid_6_symbols

Author: Copyright � 2015, Vladimir Hlystov
Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyChecks for the total of closed ordersIt automatically opens orders when conditions are reachedIt Closes Orders by itself
Miscellaneous
It opens Message Boxes to the user
0 Views
0 Downloads
0 Favorites
grid_6_symbols
//+------------------------------------------------------------------+
//|                                               grid_6_symbols.mq4 |
//|                               Copyright © 2015, Vladimir Hlystov |
//|                                                cmillion@narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Hlystov"
#property link      "cmillion@narod.ru"
#property strict
#property description "Ñîâåòíèê âûñòàâëÿåò ñåòè èç ñòîï îðäåðîâ ïî óêàçàííûì ïàðàì"
#property description "Êàê òîëüêî ñóììàðíûé ïðîôèò ïî âñåì ïîçèöèÿì ïðåâûñèò óêàçàííûé óðîâåíü,"
#property description "ñîâåòíèê çàêðûâàåò âñå è ïî íîâîé ïåðåîòêðûâàåò ñåòè"
//---
extern      string Symbol1 = "EURUSD";
extern      string Symbol2 = "GBPUSD";
extern      string Symbol3 = "EURJPY";
extern      string Symbol4 = "";
extern      string Symbol5 = "";
extern      string Symbol6 = "";
//---
extern      int    sleep  = 300; // Çàäåðæêà ïîñëå çàêðûòèÿ â ñåêóíäàõ
extern      int    Step   = 100; // Øàã ìåæäó îðäåðàìè
//--- Ïðè äîñòèæåíèè ïðèáûëè NoLoss + MinProfitNL (èçìåðÿåòñÿ â ïóíêòàõ) ñòîï-ëîññ ïåðåíîñèì íà öåíó îòêðûòèÿ îðäåðà ïëþñ ìèíóñ MinProfitNL
extern      int    NoLoss=150; // Áåçóáûòîê (ðàññòîÿíèå îò ÑË äî öåíû)
extern      int    MinProfitNL=20; // Ìèíèìàëüíàÿ ïðèáûëü áåçóáûòêà
//---
extern      int    Orders=3;  // Êîë-âî îòëîæåííûõ
extern      double Lot    = 0.01;
extern      double Profit = 0.5;
extern      int    Magic  = 123;
//-------------------------------
string val,symbol[6];
int n=0,digits[6];
double point[6];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   val=" "+AccountCurrency();
   n=0;
   if(MarketInfo(Symbol1,MODE_TRADEALLOWED)==1&&Symbol1 != "") {symbol[n] = Symbol1; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;}
   if(MarketInfo(Symbol2,MODE_TRADEALLOWED)==1&&Symbol2 != "") {symbol[n] = Symbol2; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;}
   if(MarketInfo(Symbol3,MODE_TRADEALLOWED)==1&&Symbol3 != "") {symbol[n] = Symbol3; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;}
   if(MarketInfo(Symbol4,MODE_TRADEALLOWED)==1&&Symbol4 != "") {symbol[n] = Symbol4; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;}
   if(MarketInfo(Symbol5,MODE_TRADEALLOWED)==1&&Symbol5 != "") {symbol[n] = Symbol5; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;}
   if(MarketInfo(Symbol6,MODE_TRADEALLOWED)==1&&Symbol6 != "") {symbol[n] = Symbol6; point[n] = MarketInfo(symbol[n],MODE_POINT); digits[n] = (int)MarketInfo(symbol[n],MODE_DIGITS); n++;}
//---
   if(n==0 && IsTesting()) {symbol[0]=Symbol(); point[n]=MarketInfo(symbol[n],MODE_POINT); digits[n]=(int)MarketInfo(symbol[n],MODE_DIGITS);n=1;} // òåñòåð 
//---
   Comment("Òîðãîâëÿ ïî ",n," ñèì");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int S(string sym)
  {
   for(int i=0; i<6; i++)
      if(symbol[i] == sym) return(i);
   return(-1);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(!IsTesting()) ObjectsDeleteAll();
   Comment("");
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if(n==0 || n>6) {Comment("Òîðãè ïî âûáðàííûì ïàðàì çàïðåùåíû"); return;}
   int OT,i,j,orders=0;
   double OSL,OOP,profit=0;
   double ProfitS[6];
   ArrayInitialize(ProfitS,0);
   double MaxPrice[6],MinPrice[6];
   ArrayInitialize(MaxPrice,0);
   ArrayInitialize(MinPrice,0);
   int bs[6],ss[6];
   ArrayInitialize(bs,0);
   ArrayInitialize(ss,0);
   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic)
           {
            j=S(OrderSymbol());
            if(j!=-1)
              {
               OT=OrderType();
               ProfitS[j]+=OrderProfit()+OrderSwap()+OrderCommission();
               profit+=OrderProfit()+OrderSwap()+OrderCommission();
               orders++;
               OOP = NormalizeDouble(OrderOpenPrice(),digits[j]);
               OSL = NormalizeDouble(OrderStopLoss(),digits[j]);
               if(OT==OP_BUY)
                 {
                  if(MaxPrice[j]<OOP) MaxPrice[j]=OOP;
                  if(MarketInfo(symbol[j],MODE_BID)>=NormalizeDouble(OOP+(MinProfitNL+NoLoss)*point[j],digits[j]) && OSL<NormalizeDouble(OOP+MinProfitNL*point[j],digits[j]))
                    {
                     if(!OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP+MinProfitNL*point[j],digits[j]),OrderTakeProfit(),0,White))
                        Print(symbol[j]," NoLoss Error ",GetLastError(),"  order ",OrderTicket(),"   SL ",DoubleToStr(OOP+MinProfitNL*point[j],digits[j]));
                    }
                 }
               if(OT==OP_SELL)
                 {
                  if(MinPrice[j]>OOP ||  MinPrice[j]==0) MinPrice[j]=OOP;
                  if(MarketInfo(symbol[j],MODE_ASK)<=NormalizeDouble(OOP -(MinProfitNL+NoLoss)*point[j],digits[j]) &&(OSL==0|| OSL>NormalizeDouble(OOP-MinProfitNL*point[j],digits[j])))
                    {
                     if(!OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP-MinProfitNL*point[j],digits[j]),OrderTakeProfit(),0,White))
                        Print(symbol[j]," NoLoss Error ",GetLastError(),"  order ",OrderTicket(),"   SL ",DoubleToStr(OOP+MinProfitNL*point[j],digits[j]));
                    }
                 }
               if(OT==OP_BUYSTOP)
                 {
                  if(MaxPrice[j]<OOP) MaxPrice[j]=OOP;
                  bs[j]++;
                 }
               if(OT==OP_SELLSTOP)
                 {
                  if(MinPrice[j]>OOP || MinPrice[j]==0) MinPrice[j]=OOP;
                  ss[j]++;
                 }
              }
           }
        }
     }
   if(sleep>0 && orders==0)
     {
      for(i=OrdersHistoryTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
           {
            if(OrderMagicNumber()==Magic)
              {
               if(S(OrderSymbol())!=-1) if(TimeCurrent()-OrderCloseTime()<sleep) return;
               break;
              }
           }
        }
     }
   double price;
   for(i=0; i<n; i++)
     {
      if(bs[i]<Orders)
        {
         if(MaxPrice[i]==0) price=NormalizeDouble(MarketInfo(symbol[i],MODE_ASK)+Step*point[i],digits[i]);
         else price=NormalizeDouble(MaxPrice[i]+Step*point[i],digits[i]);
         if(price<NormalizeDouble(MarketInfo(symbol[i],MODE_ASK)+MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]))
            price=NormalizeDouble(MarketInfo(symbol[i],MODE_ASK)+MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]);
         if(OrderSend(symbol[i],OP_BUYSTOP,Lot,price,30,0,0,"GRID ",Magic,0,CLR_NONE)==-1)
            Comment("OrderSend ",symbol[i]," Error ",GetLastError());
        }
      //---
      if(ss[i]<Orders)
        {
         if(MinPrice[i]==0) price=NormalizeDouble(MarketInfo(symbol[i],MODE_BID)-Step*point[i],digits[i]);
         else price=NormalizeDouble(MinPrice[i]-Step*point[i],digits[i]);
         if(price>NormalizeDouble(MarketInfo(symbol[i],MODE_BID)-MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]))
            price=NormalizeDouble(MarketInfo(symbol[i],MODE_BID)-MarketInfo(symbol[i],MODE_STOPLEVEL)*point[i],digits[i]);

         if(OrderSend(symbol[i],OP_SELLSTOP,Lot,price,30,0,0,"GRID ",Magic,0,CLR_NONE)==-1)
            Comment("OrderSend ",symbol[i]," Error ",GetLastError());
        }
      RefreshRates();
     }
//---
   if(profit>Profit) DeleteAllOrders();
//---
   DrawLABEL("Balance",StringConcatenate("Balance ",DoubleToStr(AccountBalance(),2),val),5,35,Lime);
   DrawLABEL("Equity",StringConcatenate("Equity ",DoubleToStr(AccountEquity(),2),val),5,55,Lime);
   DrawLABEL("FreeMargin",StringConcatenate("FreeMargin ",DoubleToStr(AccountFreeMargin(),2),val),5,75,Lime);
   for(i=0; i<n; i++)
      DrawLABEL(StringConcatenate("Profit ",symbol[i]),StringConcatenate("Profit ",symbol[i]," ",DoubleToStr(ProfitS[i],2),val),5,100+20*i,Color(ProfitS[i]<0,clrRed,clrLime));
   DrawLABEL("Profit ",StringConcatenate("Profit ",DoubleToStr(profit,2)," (close ",DoubleToStr(Profit,2),")"),5,105+20*n,Color(profit<0,clrRed,clrLime));
   return;
  }
//-------------------------------
color Color(bool P,color a,color b)
  {
   if(P) return(a);
   else return(b);
  }
//------------------------------------------------------------------
void DrawLABEL(string name,string Name,int x,int y,color clr)
  {
   if(ObjectFind(name)==-1)
     {
      ObjectCreate(name,OBJ_LABEL,0,0,0);
      ObjectSet(name,OBJPROP_CORNER,1);
      ObjectSet(name,OBJPROP_XDISTANCE,x);
      ObjectSet(name,OBJPROP_YDISTANCE,y);
     }
   ObjectSetText(name,Name,12,"Arial",clr);
  }
//--------------------------------------------------------------------
void DeleteAllOrders()
  {
   bool error=true;
   int i,j,nn=0;
   while(true)
     {
      if(!IsDemo())
        {
         int ret=MessageBox("Çàêðûòü âñå îðäåðà","Äåìî âåðñèÿ",MB_YESNO|MB_TOPMOST);
         if(ret==IDNO) return;
        }
      for(i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS))
           {
            if(OrderMagicNumber()==Magic)
              {
               j=S(OrderSymbol());
               if(j!=-1)
                 {
                  int OT=OrderType();
                  int Ticket=OrderTicket();
                  if(OT==OP_BUY)
                    {
                     error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(symbol[j],MODE_BID),digits[j]),50,clrNONE);
                    }
                  if(OT==OP_SELL)
                    {
                     error=OrderClose(Ticket,OrderLots(),NormalizeDouble(MarketInfo(symbol[j],MODE_ASK),digits[j]),50,clrNONE);
                    }
                  if(OT>1)
                     if(!OrderDelete(Ticket))
                        Comment("Îðäåð ",Ticket," îøèáêà óäàëåíèÿ ",GetLastError());
                  //---
                  if(!error)
                    {
                     int err=GetLastError();
                     if(err<2) continue;
                     if(err==129)
                       {
                        Comment("Íåïðàâèëüíàÿ öåíà ",TimeToStr(TimeCurrent(),TIME_SECONDS));
                        Sleep(500);
                        RefreshRates();
                        continue;
                       }
                     if(err==146)
                       {
                        j++;
                        if(IsTradeContextBusy()) Sleep(500);
                        RefreshRates();
                        continue;
                       }
                    }
                 }
              }
           }
        }
      int k=0;
      for(j= 0; j<OrdersTotal(); j++)
        {
         if(OrderSelect(j,SELECT_BY_POS))
           {
            if(OrderMagicNumber()==Magic)
              {
               if(S(OrderSymbol())!=-1) k++;
              }
           }
        }
      if(k==0) break;
      nn++;
      if(nn>10) break;
      Sleep(500);
      RefreshRates();
     }
  }
//-------------------------------

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