Я недавно подымал тему по повторному открытию ордеров. Думал, что проблему решил, т.к. неделю все работало очень четко. Но сегодня столкнулся с аналогичной проблемой только при открытии. На Финаме открылось очень много ордеров, на Открытие 9...хотя во всех случаях должен был открыться только один ордер.
т.е. из кода видно, что при успешной операции увеличивается переменная OpenOrders, которая изначально равна 0
и если она более 0, то дальнейшего открытия ордера не должно быть, но вся куча ордеров открыта с комментом Ордер1.
В функции открытия ордера проверяю наличие положительного ответа и получение тикета ордера, но почему то эта функция возврвщает фалсе, при том что ордер на самом деле установлен.
Объясните что не так, как решить данную проблему?
Дополнительно можно проверить открытие позиции попыткой её выбрать. И лучше несколько попыток
int n = 0; do { n++; } while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Здесь и задержка, и подтверждение того что позиция уже на месте.
И ещё я обратил внимание на отсутствие проверки OrderCheck(Request, checkResult) а это плохо.
Я недавно подымал тему по повторному открытию ордеров. Думал, что проблему решил, т.к. неделю все работало очень четко. Но сегодня столкнулся с аналогичной проблемой только при открытии.
На Финаме открылось очень много ордеров, на Открытие 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.
В функции открытия ордера проверяю наличие положительного ответа и получение тикета ордера, но почему то эта функция возврвщает фалсе, при том что ордер на самом деле установлен.
Объясните что не так, как решить данную проблему?
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
И ещё я обратил внимание на отсутствие проверки OrderCheck(Request, checkResult) а это плохо.
Да, и ещё в рыночном ордере - цена = 0
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); забудьте про это
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_ticket=0;
request.action = TRADE_ACTION_DEAL;
request.magic = 9876543211;
request.symbol = Symbol();
request.volume = 1;
request.price = 0;
request.type=ORDER_TYPE_BUY;
request.comment="Sync mode";
request.type_filling=ORDER_FILLING_FOK;
request.type_time=ORDER_TIME_DAY;
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
{
if(result.order>0)
{
order_ticket=result.order;
Print(__FUNCTION__," Order sent in sync mode");
return(true);
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Order not sent in sync mode.");
}
return(false);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
Дополнительно можно проверить открытие позиции попыткой её выбрать. И лучше несколько попыток
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
И ещё я обратил внимание на отсутствие проверки OrderCheck(Request, checkResult) а это плохо.
А если позиция уже была?
Или позиция уже есть но ордер залился не полностью?
Дополнительно можно проверить открытие позиции попыткой её выбрать. И лучше несколько попыток
do
{
n++;
}
while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
И ещё я обратил внимание на отсутствие проверки OrderCheck(Request, checkResult) а это плохо.
Ну вполне возможно и вставлю OrderCheck(Request, checkResult)
Спасибо
но такой цикл мне не особенно нравится
Да, и ещё в рыночном ордере - цена = 0
Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); забудьте про это
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_ticket=0;
request.action = TRADE_ACTION_DEAL;
request.magic = 9876543211;
request.symbol = Symbol();
request.volume = 1;
request.price = 0;
request.type=ORDER_TYPE_BUY;
request.comment="Sync mode";
request.type_filling=ORDER_FILLING_FOK;
request.type_time=ORDER_TIME_DAY;
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
{
if(result.order>0)
{
order_ticket=result.order;
Print(__FUNCTION__," Order sent in sync mode");
return(true);
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
}
}
else
{
Print(__FUNCTION__," Order not sent in sync mode.");
}
return(false);
}
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD:
if((order_ticket > 0) && (trans.order == order_ticket))
{
//Вот здесь и смотрим что произошло
}
break;
}
}
а на счет цены....да, больше привык к МТ4, а там надо всегда цену ставить...
Повторяю
Кроме этого надо еще проверить, статус ордера и появился он уже в истории или нет.
Биржа не работает с позициями, только ордера.
Вы были бы правы, если бы я ставил отложки, но я работаю по рынку, и тут тикет получается с помощью Results.deal
Непонял, что значит ваша улыбка?
Не ожидал от вас такое услышать. Какие паузы, или прикалываетесь?
Плохая наследственнось Форекс.
...
А если позиция уже была?
Или позиция уже есть но ордер залился не полностью?