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

 

кто обновился до 1860, подтверждаете ли проблему указанную ранее несколькими пользователями при тестировании?

а то брокер Открытие уже второй раз прислал это обновление ))

 
Vitaly Muzichenko:

Используете бесплатный софт - тогда следите за его новостями и обновлениями, а если уж в будущем будет реклама, то это тоже вполне нормально(бесплатное ПО). Вам никто и ничем не обязан.

Софт не бесплатный - он стоит брокеру кучу денег. А я как трейдер, оплачиваю брокеру комиссию, из которой зп платится создателям. Поэтому и хочется отношения адекватного.

Относится не к функциям (фиг с ними - переписал), а вот то что тестер после обновления дико глючить начал и вылетатть каждые 2-3 запуска, можно было залить стабильную версию

 
Как минимум возьмите тот факт, что за 10 лет так и не научили ПО правильно считать просадку. Пришлось все написать самому
 
// Воспроизведение ситуации, когда OrderSend успешно выполнилась, но ордера нет ни среди живых, ни среди мертвых.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
/*
  // Посылаем поочередно ордера на открытие/закрытие позиций
  while (!IsStopped() &&
         (OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0) != -1) &&
         OrderSelect(0, SELECT_BY_POS) && OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0))
    ;
*/

  MqlTradeResult Result;
  MqlTradeRequest Request = {0};

  Request.action = TRADE_ACTION_DEAL;
  Request.symbol = _Symbol;
  
  do
  {
    Request.position = PositionSelect(Request.symbol) ? PositionGetInteger(POSITION_TICKET) : 0;  
    Request.type = Request.position ? (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE)) : ORDER_TYPE_SELL;
    Request.price = Request.position ? PositionGetDouble(POSITION_PRICE_CURRENT) : Bid;
    Request.volume = Request.position ? PositionGetDouble(POSITION_VOLUME) : 1;
          
  } // Посылаем поочередно ордера на открытие/закрытие позиций
  while (!IsStopped() && (OrderSend(Request, Result) ? OrderSelect(Result.order) || HistoryOrderSelect(Result.order) : true));
  
  PRINT(Result.order);
  PRINT(OrderSelect(Result.order));
  PRINT(HistoryOrderSelect(Result.order));
}


Результат на ForexTimeFXTM-Demo01

Result.order = 2210942086
OrderSelect(Result.order) = false
HistoryOrderSelect(Result.order) = false


Скрипт открывает и закрывает позиции до тех пор, пока не обнаружит "фантомный ордер" - нет ни среди текущих, ни в истории. Считать это багом или фишкой платформы?


ЗЫ Скрипт написан так, что может открыться несколько позиций из-за данного нюанса. Но это не мешает получению "фантомного ордера".

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2018.02.08
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
[Удален]  
Было такое же на БКС форекс год назад, после того как дц что-то переключил у своего советника
 

Здравствуйте. Сегодня обновился до версии 1860 и при оптимизации советника столкнулся вот с такой проблемой:

Задержка при оптимизации

задержка между проходами составляет 1 минуту! Подскажите пожалуйста, в чем может быть дело?

p.s. до обновления все работало как часики.

 
fxsaber:


Результат на ForexTimeFXTM-Demo01


Скрипт открывает и закрывает позиции до тех пор, пока не обнаружит "фантомный ордер" - нет ни среди текущих, ни в истории. Считать это багом или фишкой платформы?


ЗЫ Скрипт написан так, что может открыться несколько позиций из-за данного нюанса. Но это не мешает получению "фантомного ордера".

Не хочу показаться занудным, но вот такие выражения:

(ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE))

очень затрудняют понимание кода.  Возможно вы помните наизусть все числовые значения данного enum, и в каком порядке они идут, но другие люди могут и не знать этих внутренностей.  Не стоит так обращаться с enum.  Краткость конечно сестра таланта, но только если не в ущерб качеству.

И касательно обсуждаемого вопроса,  для открываемой позиции ведь должен проверяться order.deal, а не result.order.  Соответственно и искать её нужно среди позиций, а не ордеров.  Разве не так?

 
Alexey Navoykov:

Краткость конечно сестра таланта, но только если не в ущерб качеству.

Вроде, привычная на MQL операция.

И касательно обсуждаемого вопроса,  для открываемой позиции ведь должен проверяться order.deal, а не result.order.  Соответственно и искать её нужно среди позиций, а не ордеров.  Разве не так?

Первоначальный ордер, что отправляется, сразу после OrderSend может нигде не оказаться. Позиция - это много позже ордера.


ЗЫ В коде специально оставил в комменте самый понимаемый язык торгового алгоритма - MQL4.

 
fxsaber:

Первоначальный ордер, что отправляется, сразу после OrderSend может нигде не оказаться. Позиция - это много позже ордера.

Да в принципе это не суть.  Ведь согласно документации, OrderSend и не обязана получать какие-либо тикеты:

При отправке рыночного ордера (MqlTradeRequest.action=TRADE_ACTION_DEAL) успешный результат функции OrderSend() не означает, что ордер был выполнен (исполнены соответствующие сделки): true в этом случае означает только то, что ордер был успешно размещен в торговой системе для дальнейшего выполнения. Торговый сервер может в возвращаемой структуре результата result заполнить значения полей dealили order, если эти данные будут ему известны в момент формирования ответа на вызов OrderSend(). В общем случае событие или события исполнения сделок, соответствующих ордеру, могут произойти уже после того, как будет отправлен ответ на вызов OrderSend(). Поэтому для любого типа торгового запроса при получении результата выполнения OrderSend() необходимо в первую очередь проверять код возврата торгового сервера retcode и код ответа внешней торговой системы retcode_external (при необходимости), которые доступны в возвращаемой структуре результата result.

Так что без OnTradeTransaction не обойтись в любом случае.

Т.е. получается, что гарантированно синхронных торговых операций в MQL5 нет.

 
Alexey Navoykov:

Да в принципе это не суть.  Ведь согласно документации, OrderSend и не обязана получать какие-либо тикеты:

Так что OnTradeTransaction нужно проверять в любом случае.

Не нужно проверять в обязательном порядке. Это только по желанию.

Ненулевой Result.order после выполнения синхронного OrderSend говорит всегда о том, что получен ответ от торгового сервера с регистрацией на нем ордера. Этот тикет идет именно от сервера. И в случае успеха OrderSend этот тикет всегда получен.

Облом же, похоже, случается не из-за OrderSend, а в момент акцепта ордера в сделку. Хотя на такие случаи есть ORDER_STATE_REQUEST_ADD. В общем, ждем ответа от MQ. По-моему, это баг, когда ордер есть на торговом сервере, а после синхронной OrderSend на Терминале об этом ни духом.