RefreshRates(); я бы ставил непосредственно перед торговой операцией (на всякий
случай).
Код вроде работать должен, только ошибку надо анализировать более детально:
Код вроде работать должен, только ошибку надо анализировать более детально:
Коды ошибок, возвращаемые торговым сервером.
Константа Значение Описание
ERR_NO_ERROR 0 Нет ошибки.
ERR_NO_RESULT 1 Нет ошибки, но результат неизвестен.
Константа Значение Описание
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 я не заметил одну ошибку, после твоего поста увидел.
Угу
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().
....
Основная функция, используемая для открытия позиции или установки отложенного ордера.
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
....
Для отлоденых ордеров я бы делал ещё проверку - не близко ли к
текущей цене OpenPrice.
и вместо if (order==false) я бы сделал if ( order < 0 || err > 0 )
а вообще об этом много говорили, только разбросано всё по разным веткам-форумам....
и вместо 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
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь