Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 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.
В функции открытия ордера проверяю наличие положительного ответа и получение тикета ордера, но почему то эта функция возврвщает фалсе, при том что ордер на самом деле установлен.
Объясните что не так, как решить данную проблему?
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
Непонял, что значит ваша улыбка?
Не ожидал от вас такое услышать. Какие паузы, или прикалываетесь?
Плохая наследственнось Форекс.
...
А если позиция уже была?
Или позиция уже есть но ордер залился не полностью?