Одновременное открытие двух позиций

 

У меня в советнике открывается одновременно два ордера Buy или Sell
Сначала было просто 

ticket1 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit1, "Order_1", magicNumber1, 0, Red);
ticket2 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit2, "Order_2", magicNumber2, 0, Green);

но после тестирования увидел что не всегда одновременно две позиции открывается, пытаюсь это исправить 

 Написал такую функцию для этого.... не знаю правильно ли. 

int ticket1 = -1;
int ticket2 = -1;
void OrderSendX(int cmd, double price, double stoploss, double takeprofit1, double takeprofit2 )
{
   int count = 0;
   ticket1 = -1;
   ticket2 = -1;
   while(true)
   {
      if(ticket1 == -1 )
         ticket1 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit1, "Order_1", magicNumber1, 0, Red);
      if(ticket2 == -1 )
         ticket2 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit2, "Order_2", magicNumber2, 0, Green);
      
      if(ticket1==-1 || ticket2==-1)
      {  
         count++;
         Sleep(2000);
         RefreshRates();
      }

      if ((ticket1!=-1 && ticket2!=-1) || count>5) return;
   }
   return;
}
 
traderEvgen:

У меня в советнике открывается одновременно два ордера Buy или Sell
Сначала было просто 

ticket1 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit1, "Order_1", magicNumber1, 0, Red);
ticket2 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit2, "Order_2", magicNumber2, 0, Green);

но после тестирования увидел что не всегда одновременно две позиции открывается, пытаюсь это исправить 

 Написал такую функцию для этого.... не знаю правильно ли. 

Используйте готовые функции, там и проверка на ошибки присутствует (нужная)   
 
traderEvgen:

 Написал такую функцию для этого.... не знаю правильно ли. 

Вы же открываете 2 ордера в одном направлении. А писали, что надо 2 противоположных.
 
Alexey Volchanskiy:
Вы же открываете 2 ордера в одном направлении. А писали, что надо 2 противоположных.
да, в одном направлении, не в противоположном 
 
traderEvgen:
да, в одном направлении, не в противоположном 

Сорри, это я в вашей фразе  два ордера Buy или Sell вместо или прочитал и ))

По логике нормально, но нет никаких проверок на правильность лота, цены, стопов и тейков. Или они заранее делаются?  

 
Alexey Volchanskiy:

Сорри, это я в вашей фразе  два ордера Buy или Sell вместо или прочитал и ))

По логике нормально, но нет никаких проверок на правильность лота, цены, стопов и тейков. Или они заранее делаются?  

да, это раньше делаю

 
traderEvgen:

У меня в советнике открывается одновременно два ордера Buy или Sell
Сначала было просто 

ticket1 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit1, "Order_1", magicNumber1, 0, Red);
ticket2 = OrderSend(Symbol(), cmd, lot, price, 3, stoploss, takeprofit2, "Order_2", magicNumber2, 0, Green);

но после тестирования увидел что не всегда одновременно две позиции открывается, пытаюсь это исправить 

 Написал такую функцию для этого.... не знаю правильно ли. 

На скорую руку набросала код:

void OrderSendX(int cmd,double price,double stoploss,double takeprofit1,double takeprofit2)
  {
   int count=1,ticket=-1,magicNumber=0,error=0,slippage=3;
   double takeprofit=0.0;
   color ordColor=clrNONE;
   while(count<=2)
     {
      switch(count)
        {
         case 1:
            takeprofit=takeprofit1;
            magicNumber=magicNumber1;
            ordColor=clrRed;break;
         case 2:
            takeprofit=takeprofit2;
            magicNumber=magicNumber2;
            ordColor=clrGreen;break;
        }
      for(int repeat=1;repeat<=5;repeat++)
        {
         static int repeatCount=1;
         ticket=-1;
         ResetLastError();
         ticket=OrderSend(_Symbol,cmd,lot,price,slippage,stoploss,takeprofit,"Order_"+IntegerToString(count),magicNumber,0,ordColor);
         error=_LastError;
         if(ticket>0 && error<=1)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
               count++;
               break;
              }
            else
              {
               Print("OrderSend завершилась с ошибкой #",error);
               slippage=slippage*repeat;
               if(cmd==OP_BUY)
                  price=MarketInfo(_Symbol,MODE_ASK);
               if(cmd==OP_SELL)
                  price=MarketInfo(_Symbol,MODE_BID);
              }
           }
         if(ticket<0)
           {
            Print("OrderSend завершилась с ошибкой #",error);
            slippage=slippage*repeat;
            int slp=1000*repeat;
            Sleep(slp);
            RefreshRates();
            if(cmd==OP_BUY)
               price=MarketInfo(_Symbol,MODE_ASK);
            if(cmd==OP_SELL)
               price=MarketInfo(_Symbol,MODE_BID);
           }
         repeatCount++;
         if(repeatCount>=count*10)
           {
            Print("OrderSend завершилась с неудачей!");
            return;
           }
        }
     }
   return;
  }
 
lilita bogachkova:

На скорую руку набросала код:

спасибо огромное

Причина обращения: