Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Есть какой либо прогрес в данном направлении? Тоже столкнулся с проблемой отслеживания исполнения ордеров. Отложенный ордер не меняет свой статус.... Как быть?
подтверждаю ошибку.
вот простой код, который показывает недоступность свойств "исторического ордера"
#property copyright "abrakadobr"
#property link ""
#property version "1.00"
bool dealed = false;
#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
if ( !dealed)
{
CSymbolInfo si;
si.Name(_Symbol);
si.RefreshRates();
//создаём отложеный ордер с небольшими отклонением от цены, что бы сработал быстрее.
double price = si.Ask() + 0.0005;
double sl = si.Bid() - 0.001;
double tp = si.Ask() + 0.001;
CTrade trader;
trader.BuyStop(0.01,price,_Symbol,sl,tp);
dealed = true;
} else {
//у первого оредра, почему-то, тикет 2. ну да ладно.
ulong ticket = 2;
if ( OrderSelect(ticket) )
{
int st = OrderGetInteger(ORDER_STATE);
Print("Order info status: ",st); //пока ордер не исполнился - статус выводится
}
long histSt;
HistoryOrderSelect(ticket);
if ( HistoryOrderGetInteger(ticket,ORDER_STATE,histSt) )
Print("Order hist status: ",histSt); //а тут уже всегда выводится статус 4, даже если ордер уже filled (и вообще закрылся следующим)
}
}
void OnTradeTransaction(const MqlTradeTransaction& trans,
const MqlTradeRequest& request,
const MqlTradeResult& result)
{
//тут можно увидеть, что последний "Print" для ордера с тикетом 2 будет со статусом 4. что бы дальше с ордером не проиходило бы - транзакций для этого не возникает.
Print("TT:",EnumToString(trans.type)," order: ",trans.order, " status: ",trans.order_state);
}
//+------------------------------------------------------------------+
получается, что после того, как отложеный ордер исполняется - он становится недоступным для программной проверки.
OrderSelect(ticket) с последующей проверкой что с ним произошло(HistoryOrderGetInteger(ticket,ORDER_STATE)), не годится?
вот выше пример - не годится.
отслеживание ордера через транзакции - не годится (выше пример).
вот и получается - через что отслеживать статус ордера?
ีupd: да, если делать не отложеный ордер, а, к примеру, обычный Buy - история та же самая, что, в целом, логично
long histSt;
HistoryOrderSelect(ticket);
if ( HistoryOrderGetInteger(ticket,ORDER_STATE,histSt) )
Print("Order hist status: ",histSt); //а тут уже всегда выводится статус 4, даже если ордер уже filled (и вообще закрылся следующим)
Что-то не пойму, что вы там пытаетесь добиться. Статус 4 означает "Ордер выполнен полностью".
Через "OrderSelect(ticket)" проверяем активен ли еще ордер, если (false) проверяем его статус через " HistoryOrderGetInteger(ticket,ORDER_STATE,histSt) " исполнился он или отменен , далее если "Ордер выполнен полностью" можно цену исполнения и т.д. узнавать о нем через HistoryOrder... .