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

 
Andrey Barinov:

Пример кода можете показать? Как закрыть позицию по EURUSD по цене GPBUSD?  

Если запросто, то Вам не составит труда. Буду очень признателен.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Vladimir Karputov, 2019.03.24 05:58

Запросто. Прямая зависимость от кривизны кода. Я сам такое вытворял :). Недостаточно продуманная система контроля инициализации класса символов. И плюс к этому статические переменные.

В общем без кода от вопрошаемого дальше говорить бессмысленно.


 
Этож какие крутые тестерные граали можно делать, больше не надо пипсы трейлингом двигать, круто)
 

В режиме отладки, визуализации ошибка отсутствует. Закрытие позиции происходит не торговым приказом, а по стоплоссу:



Вполне возможна логическая ошибка в коде, скорее всего здесь, посмотрю, конечно, пока не знаю как - в отладке ошибки нет:



удается установить стоп для ордера по цене 1.60704, на 3000 пунктов выше от текущей цены позиции.

Тестер в этом случае должен был бы запретить установку стопа.

 

Вот в лог смотрю:

приказ в изменение стопа отправляется для gpbusd, выделенная строка, а фактически исполняется для eurusd- следущая.


вот код установки стопа 


bool MyOrderSend( MqlTradeRequest &req, MqlTradeResult &res ){

  
  //Print("Попытка выполнения OrderSend ... ");
  Print("Try to execute OrderSend ... for ", req.symbol );
  ResetLastError();
  if (OrderSend( req, res  )){
    if( res.retcode != TRADE_RETCODE_DONE ){
      //Print("Ошибка обработки торгового запроса,код ответа сервера: ", res.retcode, "Описание:", TradeServerReturnCodeDescription(res.retcode) );
      Print("Error of trade requaest: ", res.retcode, "Description:", TradeServerReturnCodeDescription(res.retcode) );
      Print(STradeRequest(req) );
      return(false);
    }else{
      //Print("Успех, код ответа сервера: ", IntegerToString(res.retcode), " Описание:",  TradeServerReturnCodeDescription(res.retcode)  );
      Print("Success, return code is : ", IntegerToString(res.retcode), " Description:",  TradeServerReturnCodeDescription(res.retcode)  );
      Print(STradeRequest(req) );
    }
    return(true);
  }else{
    //Print("Ошибка выполнения OrderSend в ", __FUNCTION__, " _LastError=", _LastError, " ",  ErrorDescription(_LastError) );
    Print("Error of execution OrderSend in ", __FUNCTION__, " _LastError=", _LastError, " ",  ErrorDescription(_LastError) );
    //Print("Код ответа сервера: ", IntegerToString(res.retcode), " Описание:",  TradeServerReturnCodeDescription(res.retcode)  );
    Print("Server return code : ", IntegerToString(res.retcode), " Description:",  TradeServerReturnCodeDescription(res.retcode)  );
    Print(STradeRequest(req) ); 
    return(false);
  }
  return(true);
}


где


OrderSend( req, res  )

нативная функция mql, не перегруженная.

то есть вот здесь 

 Print("Try to execute OrderSend ... for ", req.symbol );


пишет, что устанавливает стоп для gbpusd, так и должно быть, а фактически 


OrderSend( req, res  )


устанавливает его для eurusd

 
Aleksey Sergan:

Вот в лог смотрю:

приказ в изменение стопа отправляется для gpbusd, выделенная строка, а фактически исполняется для eurusd- следущая.

тут 2 ошибки.

№1. Ваша ошибка. Где-то в коде. Вы устанавливаете СЛ для позиции по EURUSD используя цену GBPUSD. Терминал против этого ничего не должен иметь.

№2. Баг терминала. Если этот СЛ срабатывает по несуществующей на тот момент цене в потоке EURUSD, используя цену GBPUSD.

 
Aleksey Sergan:

Вот в лог смотрю:

приказ в изменение стопа отправляется для gpbusd, выделенная строка, а фактически исполняется для eurusd- следущая.


вот код установки стопа 



где


нативная функция mql, не перегруженная.

https://www.mql5.com/ru/docs/constants/structures/mqltraderequest

Видимо при отправке запроса на модификацию, приоритет имеет поле position а не symbol. Распечатайте req.position

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Взаимодействие клиентского терминала и торгового сервера для проведения операций постановки ордеров производится посредством торговых запросов. Запрос представлен специальной предопределенной структурой MqlTradeRequest, которая содержит все поля, необходимые для заключения торговых сделок. Результат обработки запроса представлен структурой...
 
Aleksey Sergan:



Пожалуйста запустите этот код: Multicurrency iMA Trend 2.

В настройках (параметр Symbols) указать "EURUSD,GBPUSD").

У меня на конфигурации

MetaTrader 5 x64 build 2009 started (MetaQuotes Software Corp.)
Windows 10 (build 17763) x64, IE 11, UAC, Intel Core i3-3120M  @ 2.50GHz, Memory: 3518 / 8077 Mb, Disk: 86 / 415 Gb, GMT+2
C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

все SL закрывались по ценам своего символа. То есть ошибок перехлёста цен нет.

 
Vladimir Karputov:

Пожалуйста запустите этот код: Multicurrency iMA Trend 2.

В настройках (параметр Symbols) указать "EURUSD,GBPUSD").

У меня на конфигурации

все SL закрывались по ценам своего символа. То есть ошибок перехлёста цен нет.

Спасибо, ошибка локализована. Пост ниже.

 
Andrey Barinov:

тут 2 ошибки.

№1. Ваша ошибка. Где-то в коде. Вы устанавливаете СЛ для позиции по EURUSD используя цену GBPUSD. Терминал против этого ничего не должен иметь.

№2. Баг терминала. Если этот СЛ срабатывает по несуществующей на тот момент цене в потоке EURUSD, используя цену GBPUSD.

 

Andrey Barinov:

https://www.mql5.com/ru/docs/constants/structures/mqltraderequest

Видимо при отправке запроса на модификацию, приоритет имеет поле position а не symbol. Распечатайте req.position

Да, вы оказались правы, моя ошибка логическая:

в структуре:

MqlTradeRequest m_request;

m_request.position = #3

m_request.symbol = GBPUSD

m_request.sl = 1.60704

фактический номер позиции для GBPUSD #4

при выполнении OrderSend тестер устанавливает стоп для символа, соответствующего позиции #3, это eurusd.

Ошибки тестера:

- не проверяет соответствие  m_request.position и m_request.symbol;

- устанавливает стоп 1.60704 для бай позиции, символ eurusd, у которого текущая цена 1.30935;

- на следующем тике исполняет стоп по цене 1.60704, хотя фактическая цена 1.30935.

Всем спасибо. Надеюсь разработчики платформы увидят пост.

 
Aleksey Sergan:

 

Да, вы оказались правы, моя ошибка логическая:

в структуре:

MqlTradeRequest m_request;

m_request.position = #3

m_request.symbol = GBPUSD

m_request.sl = 1.60704

фактический номер позиции для GBPUSD #4

при выполнении OrderSend тестер устанавливает стоп для символа, соответствующего позиции #3, это eurusd.

Ошибки тестера:

- не проверяет соответствие  m_request.position и m_request.symbol;

- устанавливает стоп 1.60704 для бай позиции, символ eurusd, у которого текущая цена 1.30935;

- на следующем тике исполняет стоп по цене 1.60704, хотя фактическая цена 1.30935.

Всем спасибо. Надеюсь разработчики платформы увидят пост.

Исполнение стопа для бай позиции по 1.60704 при текущей цене 1.30935 не является ошибкой. А вот установка для бай стопа на уровень 1.60704 при текущей цене 1.30935 это ошибка.