немогу получить ORDER_PRICE_OPEN

 
MqlDateTime t; TimeCurrent(t); t.hour=0; t.min=0; HistorySelect(  StructToTime(t) ,TimeCurrent());
int history=HistoryOrdersTotal(); 

for(int i=0;i<history;i++)
{
                ticket=HistoryOrderGetTicket(i); 
                ulong id=HistoryOrderGetInteger(ticket,ORDER_POSITION_ID);      
                double opn_p; HistoryOrderGetDouble(id,ORDER_PRICE_OPEN,opn_p);
                                                        
                Print(ticket," ",opn_p," ", id," "," ",HistoryOrderGetDouble(id,ORDER_VOLUME_INITIAL)," ", HistoryOrderGetInteger(id,ORDER_TYPE)," " );
}       

3 дня мучаюсь. Не могу получить цену открытия, тупо потому что функция не дает. 

все остальные данные про ордер выводит правильно. 

HistoryOrderGetDouble(id,ORDER_PRICE_OPEN

дает 0.

в терминале, в истории, у каждого ордера написано "market" вместо цен. 

в чем проблема?

 
koko_moko:

3 дня мучаюсь. Не могу получить цену открытия, тупо потому что функция не дает. 

все остальные данные про ордер выводит правильно. 

дает 0.

в терминале, в истории, у каждого ордера написано "market" вместо цен. 

в чем проблема?

Получите по ORDER_POSITION_ID ордера и сделки и из сделок получите цену открытия позиции. Это будет и ценой ордера.

 
koko_moko:

3 дня мучаюсь. Не могу получить цену открытия, тупо потому что функция не дает. 

все остальные данные про ордер выводит правильно. 

дает 0.

в терминале, в истории, у каждого ордера написано "market" вместо цен. 

в чем проблема?

У ордера "по рынку" цены может и не быть указано. В документации (https://www.mql5.com/ru/docs/constants/structures/mqltraderequest):

Market Execution

Торговый ордер на открытие позиции в режиме Market Execution (режим исполнения торговых приказов по рынку). Требуется указание 5 полей:

    action
    symbol
    volume
    type
    type_filling

Можно также задать значения полей magic и comment.
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
koko_moko:

3 дня мучаюсь. Не могу получить цену открытия, тупо потому что функция не дает. 

все остальные данные про ордер выводит правильно. 

дает 0.

в терминале, в истории, у каждого ордера написано "market" вместо цен. 

в чем проблема?

Проблема, скорее всего, заключается в том, что вы пытаетесь получить цену открытия для ордера типа "market", который не имеет конкретной цены открытия. Ордер типа "market" открывается по текущей рыночной цене в момент его открытия, поэтому у него нет точной цены открытия.

Если вы хотите получить цену, по которой был исполнен ордер типа "market", то вы можете воспользоваться функцией HistoryDealGetDouble() вместо HistoryOrderGetDouble(). Функция HistoryDealGetDouble() возвращает цену, по которой был исполнен сделка, которая соответствует открытию вашего ордера. Вот пример кода:


int history = HistoryOrdersTotal();

for(int i = 0; i < history; i++)

{

    ticket = HistoryOrderGetTicket(i); 

    ulong id = HistoryOrderGetInteger(ticket, ORDER_POSITION_ID); 

    double volume = HistoryOrderGetDouble(id, ORDER_VOLUME_INITIAL);

    int type = HistoryOrderGetInteger(id, ORDER_TYPE);

    ulong deal_id = HistoryOrderGetInteger(id, ORDER_DEAL);

    double price_open = HistoryDealGetDouble(deal_id, DEAL_PRICE);

    

    Print(ticket," ", price_open, " ", id, " ", volume, " ", type);

}



Этот код выводит информацию об открытых ордерах, включая цену открытия, которая получается через функцию HistoryDealGetDouble(). Обратите внимание, что для этого вы должны сохранить идентификатор сделки, который можно получить с помощью функции HistoryOrderGetInteger(id, ORDER_DEAL).

 
Ivan Sergeev #:

Проблема, скорее всего, заключается в том, что вы пытаетесь получить цену открытия для ордера типа "market", который не имеет конкретной цены открытия. Ордер типа "market" открывается по текущей рыночной цене в момент его открытия, поэтому у него нет точной цены открытия.

Если вы хотите получить цену, по которой был исполнен ордер типа "market", то вы можете воспользоваться функцией HistoryDealGetDouble() вместо HistoryOrderGetDouble(). Функция HistoryDealGetDouble() возвращает цену, по которой был исполнен сделка, которая соответствует открытию вашего ордера. Вот пример кода:


int history = HistoryOrdersTotal();

for(int i = 0; i < history; i++)

{

    ticket = HistoryOrderGetTicket(i); 

    ulong id = HistoryOrderGetInteger(ticket, ORDER_POSITION_ID); 

    double volume = HistoryOrderGetDouble(id, ORDER_VOLUME_INITIAL);

    int type = HistoryOrderGetInteger(id, ORDER_TYPE);

    ulong deal_id = HistoryOrderGetInteger(id, ORDER_DEAL);

    double price_open = HistoryDealGetDouble(deal_id, DEAL_PRICE);

    

    Print(ticket," ", price_open, " ", id, " ", volume, " ", type);

}



Этот код выводит информацию об открытых ордерах, включая цену открытия, которая получается через функцию HistoryDealGetDouble(). Обратите внимание, что для этого вы должны сохранить идентификатор сделки, который можно получить с помощью функции HistoryOrderGetInteger(id, ORDER_DEAL).

А где вы нашли это ORDER_DEAL

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