Перестал выдавать ORDER_PRICE_OPEN

 

Подскажите пожалуйста что делать? Раньше выдавал цену открытия а сейчас нет:

//-----OrderSend:
int MyOrderSend(
   string   symbol,               // символ
   int      cmd,                  // торговая операция
   double   volume,               // количество лотов
   double   price,                // цена
   int      slippage,             // проскальзывание
   double   stoploss,             // stop loss
   double   takeprofit,           // take profit
   string   comment=NULL,         // комментарий
   int      magic=0,              // идентификатор
   datetime expiration=0,         // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
               )
  {
  //--- готовим запрос
   MqlTradeRequest request={0};
   request.action=TRADE_ACTION_DEAL;         // установка отложенного ордера
   request.magic=magic;                         // ORDER_MAGIC
   request.symbol=symbol;                       // инструмент
   request.volume=volume;                       // объем в лотах
   request.sl=stoploss;                         // Stop Loss
   request.tp=takeprofit;                       // Take Profit   
   request.type=cmd;                            // тип  ордера
   request.price=price;                         // цена для открытия
   request.deviation=slippage;                  // проскальзывание
   request.comment=comment;                     // комментарий
   request.expiration=expiration;               // срок истечения ордера
//--- отправим торговый приказ
   MqlTradeResult result={0};
   OrderSend(request,result);
   return(result.order);
  }
//-----OrderSend


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
//----
   bid   =SymbolInfoDouble(Money№2,SYMBOL_BID); // Запрос значения Bid
   ask   =SymbolInfoDouble(Money№2,SYMBOL_ASK); // Запрос значения Ask
   point =SymbolInfoDouble(Money№2,SYMBOL_POINT);//Запрос Point
      ticket2=MyOrderSend(Money№2,ORDER_TYPE_BUY,Lot,ask,3,bid-StopLoss*point,ask+TakeProfit*point,"","",0,Blue);
      Sleep(1000);
OrderSelect(ticket2);
   double a = OrderGetDouble(ORDER_PRICE_OPEN);
   Alert(a);
//----
   //return(0);
  }

 Алерт выдает ноль.

 

У вас открытие ордера-то происходит? Что в логах пишется?

 
1987pavlov:

 Алерт выдает ноль.

К тому моменту, когда выбирается ордер по тикету, ордер еще не успел открыться. Его открытие нужно ловить в событиях OnTrade или OnTradeTransaction.
 

Ордер открывается. 

Без Sleep работает. В OnTrade тоже работает - и тоже без Sleep. 
 
1987pavlov:

Ордер открывается. 

Без Sleep работает. В OnTrade тоже работает - и тоже без Sleep. 
Это один из частных случаев - иногда успеет открыться, а чаще всего, не успеет. В общем случае такой подход не должен работать.
 
Scriptong:
Это один из частных случаев - иногда успеет открыться, а чаще всего, не успеет. В общем случае такой подход не должен работать.

У меня эксперт открывает ордер с тикетом2, я его ловлю в OnTrade. В итоге принт когда хочет тогда и выводит цену открытия:

 

void OnTrade()
{
   OrderSelect(ticket2);
   double a = OrderGetDouble(ORDER_PRICE_OPEN);
Print(a,Money№1_SELLorBUY,ticket2,"***");
}

Вроде сделал как вы и писали. Какой тогда должен быть подход ?

 
1987pavlov:

у меня эксперт открывает ордер с тикетом2, я его ловлю в ontrade. в итоге принт когда хочет тогда и выводит цену открытия:

 

вроде сделал как вы и писали. какой тогда должен быть подход ?

на мой взгляд, должно работать вот так:

void ontrade()
{
   if (!orderselect(ticket2))
       return;

   double a = ordergetdouble(order_price_open);
   print(a,money№1_sellorbuy,ticket2,"***");
}

 только заметьте, что подобный подход работает лишь для ордеров. для позиций следует использовать positionselect.

 

p. s. почему-то все заглавные символы автоматически преобразовываются в строчные... 

 
Scriptong:

на мой взгляд, должно работать вот так:

 только заметьте, что подобный подход работает лишь для ордеров. для позиций следует использовать positionselect.

 

p. s. почему-то все заглавные символы автоматически преобразовываются в строчные... 

void OnTrade()
{
   if (!OrderSelect(ticket2))
       return;
double a = OrderGetDouble(ORDER_PRICE_OPEN);
Print(a,Money№1_SELLorBUY,ticket2,"***");
}

Принт молчит. Что делать?

 

 С позицией вроде работает:

 

void OnTrade()
{
if (!PositionSelect(Money№1))
return;
double open_price=PositionGetDouble(POSITION_PRICE_OPEN);
Alert(open_price);
}

Так тоже работает:

OrderGetTicket(0);
double open_price=OrderGetDouble(ORDER_PRICE_OPEN);
Alert(open_price);
Причина обращения: