#property copyright "Programming � 2015, http://cmillion.ru"
#property link      "cmillion@narod.ru"
#property strict
#property description "�������� ���������� ���� 3 ���� �� ������� �� ���� ��������� �����"
#property description "��� ������ ��������� ������ �� ���� �������� �������� ��������� �������,"
#property description "�������� ��������� ��� � �� ����� ������������� ����"

extern      string Symbol1 = "EURUSD";
extern      string Symbol2 = "GBPUSD";
extern      string Symbol3 = "EURJPY";

extern      int    Step01 = 4;
extern      int    Orders = 14;
extern      int    Step02 = 6;
extern      double Lot    = 0.01;
extern      double Profit = 10.0;
extern      int    Magic  = 123;
//-------------------------------
string AC;
int OnInit()
  {
   if (Symbol()!=Symbol1 || Symbol()!=Symbol2 || Symbol()!=Symbol3) Symbol1 = Symbol();
   AC = StringConcatenate(" ", AccountCurrency());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
      Comment("�������� �������� ���� ������");
  }
//+------------------------------------------------------------------+
void OnTick()
{
   int i,n1=0,n2=0,n3=0;
   double profit1=0,profit2=0,profit3=0;
   string symbol;
   for (i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderMagicNumber()==Magic)
         { 
            symbol=OrderSymbol();
            if (symbol==Symbol1)
            { 
               profit1+=OrderProfit()+OrderSwap()+OrderCommission();
               n1++;
            }
            if (symbol==Symbol2)
            { 
               profit2+=OrderProfit()+OrderSwap()+OrderCommission();
               n2++;
            }
            if (symbol==Symbol3)
            { 
               profit3+=OrderProfit()+OrderSwap()+OrderCommission();
               n3++;
            }
         }
      }
   }
   if (n1+n2+n3==0)
   {
      double PointEURUSD = MarketInfo(Symbol1,MODE_POINT);
      double PointGBPUSD = MarketInfo(Symbol2,MODE_POINT);
      double PointEURJPY = MarketInfo(Symbol3,MODE_POINT);
      
      double OpenEURUSD = iClose(Symbol1,PERIOD_M30,0);

      if (OrderSend (Symbol1, OP_BUYSTOP,  Lot, OpenEURUSD+Step01*PointEURUSD, 3, 0,0, "GRID", Magic,0,CLR_NONE)
      ==-1) Comment("OrderSend ",Symbol1," Error ",GetLastError());
      if (OrderSend (Symbol1, OP_SELLSTOP, Lot, OpenEURUSD-Step01*PointEURUSD, 3, 0,0, "GRID", Magic,0,CLR_NONE)
      ==-1) Comment("OrderSend ",Symbol1," Error ",GetLastError());
      RefreshRates();
      
      double OpenGBPUSD = iClose(Symbol2,PERIOD_M30,0);

      if (OrderSend (Symbol2, OP_BUYSTOP,  Lot, OpenGBPUSD+Step01*PointGBPUSD, 3, 0,0, "GRID", Magic,0,CLR_NONE)
      ==-1) Comment("OrderSend ",Symbol2," Error ",GetLastError());
      if (OrderSend (Symbol2, OP_SELLSTOP, Lot, OpenGBPUSD-Step01*PointGBPUSD, 3, 0,0, "GRID", Magic,0,CLR_NONE)
      ==-1) Comment("OrderSend ",Symbol2," Error ",GetLastError());
       RefreshRates();
     
      double OpenEURJPY = iClose(Symbol3,PERIOD_M30,0);

      if (OrderSend (Symbol3, OP_BUYSTOP,  Lot, OpenEURJPY+Step01*PointEURJPY, 3, 0,0, "GRID", Magic,0,CLR_NONE)
      ==-1) Comment("OrderSend ",Symbol3," Error ",GetLastError());
      if (OrderSend (Symbol3, OP_SELLSTOP, Lot, OpenEURJPY-Step01*PointEURJPY, 3, 0,0, "GRID", Magic,0,CLR_NONE)
      ==-1) Comment("OrderSend ",Symbol3," Error ",GetLastError());
      RefreshRates();
      
      for (i=1; i<=Orders; i++) 
      {
            if (OrderSend (Symbol1, OP_BUYSTOP,  Lot, OpenEURUSD+Step01*PointEURUSD+i*Step02*PointEURUSD, 3, 0,0, "GRID", Magic,0,CLR_NONE)
            ==-1) Comment("OrderSend ",Symbol1," Error ",GetLastError());
            if (OrderSend (Symbol1, OP_SELLSTOP, Lot, OpenEURUSD-Step01*PointEURUSD-i*Step02*PointEURUSD, 3, 0,0, "GRID", Magic,0,CLR_NONE)
            ==-1) Comment("OrderSend ",Symbol1," Error ",GetLastError());
            
            if (OrderSend (Symbol2, OP_BUYSTOP,  Lot, OpenGBPUSD+Step01*PointGBPUSD+i*Step02*PointGBPUSD, 3, 0,0, "GRID", Magic,0,CLR_NONE)
            ==-1) Comment("OrderSend ",Symbol2," Error ",GetLastError());
            if (OrderSend (Symbol2, OP_SELLSTOP, Lot, OpenGBPUSD-Step01*PointGBPUSD-i*Step02*PointGBPUSD, 3, 0,0, "GRID", Magic,0,CLR_NONE)
            ==-1) Comment("OrderSend ",Symbol2," Error ",GetLastError());
            
            if (OrderSend (Symbol3, OP_BUYSTOP,  Lot, OpenEURJPY+Step01*PointEURJPY+i*Step02*PointEURJPY, 3, 0,0, "GRID", Magic,0,CLR_NONE)
            ==-1) Comment("OrderSend ",Symbol3," Error ",GetLastError());
            if (OrderSend (Symbol3, OP_SELLSTOP, Lot, OpenEURJPY-Step01*PointEURJPY-i*Step02*PointEURJPY, 3, 0,0, "GRID", Magic,0,CLR_NONE)
            ==-1) Comment("OrderSend ",Symbol3," Error ",GetLastError());
      }
   }
   else
   {
      if (profit1+profit2+profit3 > Profit) DeleteAllOrders();
      Comment(n1," orders  ",Symbol1," Profit = ",DoubleToStr(profit1,2),AC,"\n",
              n2," orders  ",Symbol2," Profit = ",DoubleToStr(profit2,2),AC,"\n",
              n3," orders  ",Symbol3," Profit = ",DoubleToStr(profit3,2),AC,"\n",
              n1+n2+n3," orders, Profit = ",DoubleToStr(profit1+profit2+profit3,2),AC,"\nClose ",DoubleToStr(Profit,2),AC);
   }
   return;
}
//-------------------------------
void DeleteAllOrders() 
{
   string symbol;
   bool error=true;
   int j,nn=0;
   while(true)
   {
      for (j = OrdersTotal()-1; j >= 0; j--)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            symbol=OrderSymbol();
            if ((symbol==Symbol1 || symbol==Symbol2 || symbol==Symbol3) && OrderMagicNumber() == Magic)
            {
               int DIGITS = (int)MarketInfo(symbol,MODE_DIGITS);
               double ASK = NormalizeDouble(MarketInfo(symbol,MODE_ASK),DIGITS);
               double BID = NormalizeDouble(MarketInfo(symbol,MODE_BID),DIGITS);
               double POINT = MarketInfo(symbol,MODE_POINT);
               int OT = OrderType();
               int Ticket=OrderTicket();
               if (OT==OP_BUY) 
               {
                  error=OrderClose(Ticket,OrderLots(),BID,50,Red);
               }
               if (OT==OP_SELL) 
               {
                  error=OrderClose(Ticket,OrderLots(),ASK,50,Red);
               }
               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(5000);
                     RefreshRates();
                     continue;
                  }
                  if (err==146) 
                  {
                     int ret1=MessageBox("���������� �������� ������"," ", 
                         MB_RETRYCANCEL|MB_TOPMOST|MB_ICONWARNING);
                     if (ret1==IDCANCEL) return;
                     j++;
                     if (IsTradeContextBusy()) Sleep(2000);
                     continue;
                  }
                  Comment("������ ",err," �������� ������ N ",Ticket,"     ",TimeToStr(TimeCurrent(),TIME_SECONDS));
               }
            }
         }
      }
      int n=0;
      for (j = 0; j < OrdersTotal(); j++)
      {
         if (OrderSelect(j, SELECT_BY_POS))
         {
            symbol=OrderSymbol();
            if ((symbol==Symbol1 || symbol==Symbol2 || symbol==Symbol3) && OrderMagicNumber() == Magic)
            {
               n++;
            }
         }  
      }
      if (n==0) break;
      nn++;
      if (nn>10) {Comment("�� ������� ������� ��� ������, �������� ��� ",n);break;}
      Sleep(1000);
      RefreshRates();
   }
}
//-------------------------------