Такой код будет работать?

 
int err; int try; int MaxTries=5; ...... for(try=1;try<MaxTries;try++) { OrderSend(Symbol(),OP_BUYSTOP,1,buyprice,3,buyprice-loss*Point,buyprice+profit*Point,"",0,0,Blue); Sleep(1000); err=GetLastError(); if (err>0) { Print("OrderSend failed with error #",err," : ",ErrorDescription(err),"Trying again #",try); RefreshRates(); } else {break;} }
 
RefreshRates(); я бы ставил непосредственно перед торговой операцией (на всякий случай).
Код вроде работать должен, только ошибку надо анализировать более детально:
Коды ошибок, возвращаемые торговым сервером.

Константа Значение Описание
ERR_NO_ERROR 0 Нет ошибки.
ERR_NO_RESULT 1 Нет ошибки, но результат неизвестен.
 
То есть так надо?
int err; int try; int MaxTries=5; bool order; ..................... void start() { int Pause=1000; ........................ for(try=1;try<MaxTries;try++) { RefreshRates(); order=OrderSend(Symbol(),OP_BUYSTOP,1,buyprice,3,buyprice-loss*Point,buyprice+profit*Point,"",0,0,Blue); Sleep(Pause); err=GetLastError(); if (order==false) { Print("OrderSend failed with error #",err," : ",ErrorDescription(err),"Trying again #",try); Pause=Pause*2; } else {break;} }
 
Да, так гораздо лучше. По крайней мере, я стараюсь так делать.
 
Спасибо. А что скажут разработчики? И ещё 1 вопрос- правда ли, что отложенные приказы серверу легче обрабатывать, соответственно, больше вероятность, что приказ пройдёт без проблем? Или тип ордера не имеет значения
 
а я так делаю
//+------------------------------------------------------------------+ //| Установка ордера | //| Параметры: | //| op - операция | //| pp - цена | //| ldStop - уровень стоп | //| ldTake - уровень тейк | //+------------------------------------------------------------------+ void SetOrder(int op, double pp, double ldStop, double ldTake) { color clOpen; int err, it, ticket; string lsComm=GetCommentForOrder(); if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell; Lots=GetSizeLot(); for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); ticket=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpen); if (ticket>0) { if (UseSound) PlaySound(NameFileSound); break; } else { err=GetLastError(); Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it); Sleep(1000*PauseAfterError); } } }
 
Да, у 3172552 я не заметил одну ошибку, после твоего поста увидел.
 
Rosh:
Да, у 3172552 я не заметил одну ошибку, после твоего поста увидел.
эта?
bool order=OrderSend(.......
 
Угу
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)


Основная функция, используемая для открытия позиции или установки отложенного ордера.
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
....
 
Для отлоденых ордеров я бы делал ещё проверку - не близко ли к текущей цене OpenPrice.
и вместо if (order==false) я бы сделал if ( order < 0 || err > 0 )

а вообще об этом много говорили, только разбросано всё по разным веткам-форумам....
 
Большое всем спасибо. Вот, переписал код. На ресте выскаквает такая строчка-
2006.01.16 02:45:25 2005.11.30 09:00 nnt-simple EURUSD,H1: unknown ticket 358 for OrderClose function
Подскажете почему? Код работает вроде ок, прикрепил.


Уже устранил, вот исправленный вариант. Но с трудом понимаю почему была ошибка...
Файлы:
nnt-simple.mq4  12 kb
Причина обращения: