{
MqlTradeRequest Request;
MqlTradeResult Results;
ZeroMemory(Request);
ZeroMemory(Results);
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Request.action=TRADE_ACTION_DEAL;
Request.type=ORDER_TYPE_SELL;
Request.symbol=symbol;
Request.volume=volume;
Request.deviation=deviation;
Request.comment=comment;
Request.type_filling=filling;
bool res=false;
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
}
Я недавно подымал тему по повторному открытию ордеров. Думал, что проблему решил, т.к. неделю все работало очень четко. Но сегодня столкнулся с аналогичной проблемой только при открытии.
На Финаме открылось очень много ордеров, на Открытие 9...хотя во всех случаях должен был открыться только один ордер.
Вот вырезка кода из советника
{
Coment="Open Sell "+string(OpenOrders+1);
ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
}
if(ret)
{
OpenOrders++;
PriceLastOpen=price;
}
bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
MqlTradeRequest Request;
MqlTradeResult Results;
ZeroMemory(Request);
ZeroMemory(Results);
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Request.action=TRADE_ACTION_DEAL;
Request.type=ORDER_TYPE_SELL;
Request.symbol=symbol;
Request.volume=volume;
Request.deviation=deviation;
Request.comment=comment;
Request.type_filling=filling;
bool res=false;
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
}
т.е. из кода видно, что при успешной операции увеличивается переменная OpenOrders, которая изначально равна 0
и если она более 0, то дальнейшего открытия ордера не должно быть, но вся куча ордеров открыта с комментом Ордер1.
В функции открытия ордера проверяю наличие положительного ответа и получение тикета ордера, но почему то эта функция возврвщает фалсе, при том что ордер на самом деле установлен.
Объясните что не так, как решить данную проблему?
Плохая наследственнось Форекс.
Надо проверять Results.order.
Если ордер выставлен, это не значит что уже совершена сделка.
Плохая наследственнось Форекс.
Надо проверять Results.order.
Если ордер выставлен, это не значит что уже совершена сделка.
Предполагаю, что инфа о сделке ещё не успела прийти. Вот тут (выделил красным) Вы полагаетесь на удачу. А она капризная дама :-))
{
MqlTradeRequest Request;
MqlTradeResult Results;
ZeroMemory(Request);
ZeroMemory(Results);
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Request.action=TRADE_ACTION_DEAL;
Request.type=ORDER_TYPE_SELL;
Request.symbol=symbol;
Request.volume=volume;
Request.deviation=deviation;
Request.comment=comment;
Request.type_filling=filling;
bool res=false;
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
}
Предполагаю, что инфа о сделке ещё не успела прийти. Вот тут (выделил красным) Вы полагаетесь на удачу. А она капризная дама :-))
{
MqlTradeRequest Request;
MqlTradeResult Results;
ZeroMemory(Request);
ZeroMemory(Results);
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Request.action=TRADE_ACTION_DEAL;
Request.type=ORDER_TYPE_SELL;
Request.symbol=symbol;
Request.volume=volume;
Request.deviation=deviation;
Request.comment=comment;
Request.type_filling=filling;
bool res=false;
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
}
Вам нужно протоколировать все торговые операции. Например так:
сначала в "шапке" подключаем торговый класс CTrade
CTrade m_trade; // trading object
а вот пример операции Buy:
{
if(m_trade.ResultDeal()==0)
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
else
Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
else
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
то есть можно получить два раза ошибку: первый уровень - операция не прошла базовую проверку и второй уровень обороны - проверка тикета сделки.
Потом уже, если случится накладка, по логам можно будет разобраться.
Добавлено: сказанное верно для СИНХРОННОГО режима работы.
Щас и тут гуру научат ))
Объясните что не так, как решить данную проблему?
С вашим опытом, неприлично здесь задавать такие вопросы.
Вам нужно протоколировать все торговые операции. Например так:
сначала в "шапке" подключаем торговый класс CTrade
CTrade m_trade; // trading object
а вот пример операции Buy:
{
if(m_trade.ResultDeal()==0)
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
else
Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
else
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
то есть можно получить два раза ошибку: первый уровень - операция не прошла базовую проверку и второй уровень обороны - проверка тикета сделки.
Потом уже, если случится накладка, по логам можно будет разобраться.
Добавлено: сказанное верно для СИНХРОННОГО режима работы.
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
Вам нужно протоколировать все торговые операции. Например так:
сначала в "шапке" подключаем торговый класс CTrade
CTrade m_trade; // trading object
а вот пример операции Buy:
{
if(m_trade.ResultDeal()==0)
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
else
Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
else
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
то есть можно получить два раза ошибку: первый уровень - операция не прошла базовую проверку и второй уровень обороны - проверка тикета сделки.
Потом уже, если случится накладка, по логам можно будет разобраться.
Добавлено: сказанное верно для СИНХРОННОГО режима работы.
Так у меня именно так и сделано
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я недавно подымал тему по повторному открытию ордеров. Думал, что проблему решил, т.к. неделю все работало очень четко. Но сегодня столкнулся с аналогичной проблемой только при открытии.
На Финаме открылось очень много ордеров, на Открытие 9...хотя во всех случаях должен был открыться только один ордер.
Вот вырезка кода из советника
{
Coment="Open Sell "+string(OpenOrders+1);
ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
}
if(ret)
{
OpenOrders++;
PriceLastOpen=price;
}
bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
MqlTradeRequest Request;
MqlTradeResult Results;
ZeroMemory(Request);
ZeroMemory(Results);
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
Request.action=TRADE_ACTION_DEAL;
Request.type=ORDER_TYPE_SELL;
Request.symbol=symbol;
Request.volume=volume;
Request.deviation=deviation;
Request.comment=comment;
Request.type_filling=filling;
bool res=false;
res=OrderSend(Request,Results);
if(res)
{
if(Results.deal>0) return(true);
else return(false);
}
return(false);
}
т.е. из кода видно, что при успешной операции увеличивается переменная OpenOrders, которая изначально равна 0
и если она более 0, то дальнейшего открытия ордера не должно быть, но вся куча ордеров открыта с комментом Ордер1.
В функции открытия ордера проверяю наличие положительного ответа и получение тикета ордера, но почему то эта функция возврвщает фалсе, при том что ордер на самом деле установлен.
Объясните что не так, как решить данную проблему?