А почему Вы самостоятельно не обрабатываете "ошибки" торговых
операций?
if(OrderClose(....)==false) { errcode=GetLastError(); if(errcode==ERR_REQUOTE) .... }Загляните в раздел статей и документации - там масса информации по теме.
Тут кажись дело не в реквоте, а в подсчете прибыли. После того как подсчитали надо флаг устанавливать о необходимости закрытия всех ордеров, и обнулять его после успешного закрытия всех ордеров. А то на одном тике не получилось все закрыть, а прибыль после этого не удовлетворяет условиям закрытия.
int type = OrderType(); fc=False; switch(type) { case OP_BUY :if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(),Bid, Slippage,Red); if(fc==false) { int errcode=GetLastError(); if(errcode==135 || errcode==138) { RefreshRates(); if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(),Bid, Slippage,Red); } } else break; case OP_SELL :if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(),Ask, Slippage,Red); if(fc==false) { errcode=GetLastError(); if(errcode==135 || errcode==138) { RefreshRates(); if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(),Ask, Slippage,Red); } } else break; }Ренат, спасибо за наводку :)
Я все правильно понял ?
РекфрешРейтсом советник не испортишь. Смело втыкаем его перед
каждой торговой операцией, глядишь, придется реже обрабатывать
исключения. :)
Berserk:
Ренат, спасибо за наводку :)
Я все правильно понял ?
Да, правильно. Но я проглядел стандартную ошибку - Вы не обновляли
рыночное окружение через RefreshRates() после каждой торговой операции и поэтому ловили гарантированные
реквоты. Rosh правильно сказал.
Ренат, спасибо за наводку :)
Я все правильно понял ?
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вопрос к разработчикам.
Имеем код:
if (AccountProfit>0)
{
bool fc;
for (int s=OrdersTotal()-1; s>=0; s--) {
if (OrderSelect(s, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
int type = OrderType();
fc=False;
switch(type)
{
case OP_BUY :if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage,Red);
break;
case OP_SELL :if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage,Red);
break;
}
}
}
}
}
Смысл: если открыто несколько позиций и суммарный профит больше нуля - закрываем все позиции(закрываемся в безубытке).
Теперь лог:
2006.08.18 17:56:49 '48653': close order #2337066 buy 0.20 AUDNZD at 1.1852 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:56:50 '48653': request was accepted by server
2006.08.18 17:56:50 '48653': request in process
2006.08.18 17:56:53 '48653': requote 1.1882 / 1.1892 for order #2337066 buy 0.20 AUDNZD closing at 1.1888
2006.08.18 17:57:10 '48653': close order #2337066 buy 0.20 AUDNZD at 1.1852 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:57:10 '48653': request was accepted by server
2006.08.18 17:57:10 '48653': requote 1.1888 / 1.1898 for order #2337066 buy 0.20 AUDNZD closing at 1.1888
2006.08.18 17:57:10 '48653': close order #2332011 buy 0.20 AUDNZD at 1.1874 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:57:11 '48653': request was accepted by server
2006.08.18 17:57:11 '48653': request in process
2006.08.18 17:57:15 '48653': order #2332011 buy 0.20 AUDNZD at 1.1874 sl: 0. 0000 tp: 0.0000 closed at price 1.1888
2006.08.18 17:57:16 '48653': close order #2330439 buy 0.20 AUDNZD at 1.1895 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:57:16 '48653': request was accepted by server
2006.08.18 17:57:16 '48653': request in process
2006.08.18 17:57:19 '48653': order #2330439 buy 0.20 AUDNZD at 1.1895 sl: 0. 0000 tp: 0.0000 closed at price 1.1888
2006.08.18 17:57:20 '48653': close order #2322502 buy 0.20 AUDNZD at 1.1929 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:57:20 '48653': request was accepted by server
2006.08.18 17:57:20 '48653': request in process
2006.08.18 17:57:23 '48653': order #2322502 buy 0.20 AUDNZD at 1.1929 sl: 0. 0000 tp: 0.0000 closed at price 1.1888
Как видно из лога, ордер #2337066 после двух попыток закрытия экспертом и получения реквоута больше экспертом не трогался, начали закрываться другие ордера, затем цена развернулась и вместо безубытка и закрытия всех позиций имеем одну открытую убыточную позицию.
Собственно вопросы:
Почему не закрылся ордер #2337066 ?
Как бороться с реквоутом в подобной ситуации ?