Ошибки, баги, вопросы - страница 445

 
komposter:

В догонку про нормализацию лота

Ребята, зачем теоретизировать?

Для поржать и чтоб не ржавело в голове.

Всего должно быть в меру. Мой вариант работает на реалах больше 5 лет, с разными брокерами, типами счетов, инструментами - ошибки не было ни разу.
И не будет.  Не бери в голову, мы не всерьёз.
 
komposter:

Шаг должен быть кратным мин. лоту.

Это с чего такая уверенность? Практика - понимаю, но не ограничение движка.
Доводы сторон понятны. В любом случае, искренне признателен за участливость. :)

Swan:

Посмотрел, на чемпионатных счетах все инструменты торгуются в одно время. Зарегистрируйтесь)

Да вроде зарегился. Именно на нем и ловлю эту ошибку.

Swan:

можно ещё попробовать:

if(текущая цена == 0.0) return;

 Спасибо за идею! Надо будет попробовать этот вариант. :)

 

voix_kas:

Да вроде зарегился. Именно на нем и ловлю эту ошибку.

По GBPCHF 2011.01.03 в 00:00 есть минутный бар. В сервисдеск не обращались?
 
Swan:
По GBPCHF 2011.01.03 в 00:00 есть минутный бар. В сервисдеск не обращались?

В СД не обращался.

Тут ведь вот какая ситуевина. Пишу мультивалютный советник. Кинул его на график евробакса и пытаюсь отслеживать все допустимые валютные пары, переданные советнику в качестве параметра.

Сказывается нехватка методологии/документирования. Вот для примера несколько вопросов:

1. Почему цена может быть нулевой? Ведь к этому времени (2011.01.03 00:00:00) все же существовала последняя известная цена (и Бид, и Аск)? По каким принципам терминал это дает.

2. Имеется котировочная сессия. Чем она, принципиально, отличается от торговой? Логично предположить, что в период второй можно торговать. А если в период первой (котировочной) сессии нельзя торговать, откуда тогда изменение котировок? Ведь последние меняются из-за, извините за такую интерпритацию, "диссбаланса спроса и предложения".

3. Допустим мы получили Тик по одной валютной паре. В этом же событии пытаемся "посмотреть" состояние другой пары. Где гарантия, что последняя котировка, пришедшая, по другой паре еще действительна? Каков срок жизни котировки? Самым рациональным объяснением вижу проверку последней котировки с одновременной проверкой объема лота по ней в стакане. Т.е. как я понимаю: приходит котировка N по eurusd. Она приходит не просто так, а размещается опцион по этой котировке на определенный объем. Желающие купить\продать, расхватывают этот пирог. В какой-то момент, он (пирог) заканчивается, и данная котировка "прекращает жить". Далее, терминал дает следующую котировку (менее привлекательную). А если котировок вообще нет (никто не хочет продать/купить валюту)? Тогда цена равна нулю?

Вообщем, я не специалист по фондовому рынку/форексу.

Был бы признателен, если кто мне подробно ответить на озвученные вопросы. Как применительно к тому, как оно есть на самом деле, и как те или иные ситуации преподносятся в терминале MT5? 

 
voix_kas:

В СД не обращался.

Тут ведь вот какая ситуевина. Пишу мультивалютный советник. Кинул его на график евробакса и пытаюсь отслеживать все допустимые валютные пары, переданные советнику в качестве параметра.

Сказывается нехватка методологии/документирования. Вот для примера несколько вопросов:

1. Почему цена может быть нулевой? Ведь к этому времени (2011.01.03 00:00:00) все же существовала последняя известная цена (и Бид, и Аск)? По каким принципам терминал это дает.

2. Имеется котировочная сессия. Чем она, принципиально, отличается от торговой? Логично предположить, что в период второй можно торговать. А если в период первой (котировочной) сессии нельзя торговать, откуда тогда изменение котировок? Ведь последние меняются из-за, извините за такую интерпритацию, "диссбаланса спроса и предложения".

3. Допустим мы получили Тик по одной валютной паре. В этом же событии пытаемся "посмотреть" состояние другой пары. Где гарантия, что последняя котировка, пришедшая, по другой паре еще действительна? Каков срок жизни котировки? Самым рациональным объяснением вижу проверку последней котировки с одновременной проверкой объема лота по ней в стакане. Т.е. как я понимаю: приходит котировка N по eurusd. Она приходит не просто так, а размещается опцион по этой котировке на определенный объем. Желающие купить\продать, расхватывают этот пирог. В какой-то момент, он (пирог) заканчивается, и данная котировка "прекращает жить". Далее, терминал дает следующую котировку (менее привлекательную). А если котировок вообще нет (никто не хочет продать/купить валюту)? Тогда цена равна нулю?

Вообщем, я не специалист по фондовому рынку/форексу.

Был бы признателен, если кто мне подробно ответить на озвученные вопросы. Как применительно к тому, как оно есть на самом деле, и как те или иные ситуации преподносятся в терминале MT5? 

Давайте разбираться по пунктам. Советник мультивалютный, значит и вести он себя должен соответствующим образом.

1. Давайте исключим основную возможную проблему получения 0 цены - Список символов по которым предполагается торговля селективно выбран (т.е. о наличии нужных символов в MarketWatch можно не беспокоиться)?

2. По торговым и котировочным сессиям комментарий уже давался разработчиками (в частности это комментировал Rashid Umarov вот тут). На счет ситуации когда котировки есть, а торговать нельзя - вполне нормальная ситуация (особенно для фондового рынка). Также никто не гарантирует что в торговую сессию котировки будут обновляться.

3. На счет стакана - и где взять стакан (главное что в него поместить) на рынке Forex? На счет вопросов ответы звучат примерно так (если все в порядке и связь с сервером существует):

а) "Последняя котировка" (информация о последнем тике) действительна с момента возникновения тика до появления нового тика. В терминале время поступления последней котировки можно посмотреть в "обзоре рынка".

б) Если Вы собираете информацию о тиках только в обработчике OnTick() мультивалютного эксперта никто не даст гарантии, что между тиками основной пары не пройдет с десяток тиков по другим парам. Поскольку в зависимости от пары и активности торгов по ней между тиками может пройти от доли секунды до несколько минут.

Конечно для рынка Forex (особенно для пары EURUSD) это не очень существенно, но помнить об этом нужно и учитывать в логике эксперта.

в) программно определить время поступления последней котировки можно анализируя структуру MqlTick и сравнив время последней котировки с определенным значением можно легко определить насколько котировка актуальна.

struct MqlTick
  {
   datetime     time;          // Время последнего обновления цен
   double       bid;        // Текущая цена Bid
   double       ask;        // Текущая цена Ask
   double       last;       // Текущая цена последней сделки (Last)
   ulong        volume;     // Объем для текущей цены Last
  };

г) Как я уже намекал выше следует отслеживать состояние соединения с сервером и по возможности проверять/получать котировки не только в OnTick(), но и в OnTimer().

 

Давайте пойдем от обратного. При каких обстоятельствах в терминале цена (бид/аск) могут принимать нулевые значения?

Следом второй вопрос. Ну, выяснили мы, что последняя котировка по данному инструменту приходила 2 секунды/минуты/часа назад. Торговая сессия не закрылась. Как не получить ошибку "нет цены"?

Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 
voix_kas:

Давайте пойдем от обратного. При каких обстоятельствах в терминале цена (бид/аск) могут принимать нулевые значения?

Следом второй вопрос. Ну, выяснили мы, что последняя котировка по данному инструменту приходила 2 секунды/минуты/часа назад. Торговая сессия не закрылась. Как не получить ошибку "нет цены"?

Вы, когда получили нулевую цену, спросили GetLastError?
 
stringo:
Вы, когда получили нулевую цену, спросили GetLastError?

Код ошибки: 4756. Видно на скрине.

Более, того. Вот получена та же самая ошибка. При том, что маркетвоч показывает наличие цены и в логах инструмент синхронизирован.

 

 
voix_kas:

Код ошибки: 4756. Видно на скрине.

Более, того. Вот получена та же самая ошибка. При том, что маркетвоч показывает наличие цены и в логах инструмент синхронизирован.

 

Нужен код ошибки после "no price...", а не после "failed..."
 
uncleVic:
Нужен код ошибки после "no price...", а не после "failed..."
  ...
  // Формирование торгового приказа.
  MqlTradeResult TradeResult;
  MqlTradeRequest TradeRequest;

  TradeRequest.action = TRADE_ACTION_DEAL;
  TradeRequest.symbol = Instrumet;
  TradeRequest.volume = NormalizeDouble(Volume, 8);
  TradeRequest.price = SymbolInfoDouble(Instrumet, SYMBOL_ASK);
  TradeRequest.sl = 0;
  TradeRequest.tp = 0;
  TradeRequest.deviation = Deviation;
  TradeRequest.type = ORDER_TYPE_BUY;
  TradeRequest.type_filling = TypeFilling;

  // Отправка торгового приказа.
  ResetLastError();
  if (!IsTradeAllowed()) return;
  if (OrderSend(TradeRequest, TradeResult)) TradeResultAnalyse("Buy.OrderSend", TradeResult.retcode);
  else Print("Buy.OrderSend = false! Код ошибки: \'", _LastError, "\'.");

А как поймать код ошибки в обозначенный Вами момент? Я регистрирую ошибку в последней строке приведенного кода.

Данная ошибка не появляется, если прямо перед этим кодом добавить следующую сроку:

if(!NormalizeDouble(SymbolInfoDouble(Instrumet, SYMBOL_ASK), 8)) return;
Причина обращения: