Причина неадекватности результатов прогона в тестере на разных счетах...

 

С подачи участника чемпионата 2010 blef (https://championship.mql5.com/2010/ru/users/blef/discussion) попробовал запустить своего чемпионатного эксперта на Alpari-Demo. Кардинальное изменение поведения эксперта (или тестера???) не укладываются у меня в голове...

Да, выяснился глюк в настройке сервера Альпари, который сейчас всегда выдаёт AccountInfoDouble(ACCOUNT_MARGIN_LEVEL) равным нулю и не изменяет AccountInfoDouble(ACCOUNT_FREEMARGIN), значение которого всегда равно величине баланса. Это могло бы объяснить различия в поведении при непосредственной работе эксперта на счёте, но не в тестере...

Анализ кода эксперта показывает, что превысить объём позиции в 0.1 лота (в который он упирается на чемпионате) он мог только в случае, если OrderCalcMargin(ORDER_TYPE_BUY,m_smb,lot,last_tick.ask,marginreq) при тестировании возвращает true и при этом величина требуемой маржи меньше, чем AccountInfoDouble(ACCOUNT_FREEMARGIN), а AccountInfoDouble(ACCOUNT_MARGIN_LEVEL) должен быть меньше 90 (это ляп в коде эксперта). Встаёт вопрос, как и откуда ТЕСТЕР получает значения упомянутых функций - ведь они должны меняться динамически независимо от того, каково их значение на "родительском счёте", откуда, по идее, должны браться только котировки. Не бомбардирует же он сервер запросами, значит, вычисляет сам. Как при этом получаются нули?!

На картинке свойства сравниваемых счетов (незначительные отклонения в цифрах на части, относящейся к MetaQuotes (средства и далее вправо) - побочный эффект редактирования картинки в 2 захода).

Build 355.

PS. Или существуют ещё какие-то свойства счёта, которые не описаны в документации, но учитываются тестером?

 

может не в тему, но на днях столкнулся с интересной ситуацией:

случайно сделал ошибку в эксперте типа if (_Symbol=="USDSCHF") {тра ля ля.....}

лищняя буква в названии пары, естественно такой советник не должен делать ни одной сделки, и при проверке в реальности так и оказалось, а вот в тестере при оптимизации "быстрая(генетический алгоритм)" советник начал давать результаты, конечно всякую дурь, что меня и насторожило и я начал вглядываться в код. Короче дело темное...


 

Проверил: действительно при подключении к AlpariDemo в тестере (билд 355, 358) после вызова OrderCalcMargin(ORDER_TYPE_BUY,m_smb,lot,last_tick.ask,marginreq) значение

marginreq равно нулю, AccountInfoDouble(ACCOUNT_MARGIN_LEVEL) равно нулю.

Поясните тупому, откуда тестер берет эти значения?

PS. Неудачно назвал тему. Как поменять что-то не найду. Следовало бы "В чём причина ... ?"

 

 

Никто не хочет опровергнуть моё заблуждение, что для расчёта требуемой маржи достаточно знать символ, тип ордера, объём, плечо, котировку и валюту счёта?

 

 
Ashes:

Проверил: действительно при подключении к AlpariDemo в тестере (билд 355, 358) после вызова OrderCalcMargin(ORDER_TYPE_BUY,m_smb,lot,last_tick.ask,marginreq) значение

marginreq равно нулю, AccountInfoDouble(ACCOUNT_MARGIN_LEVEL) равно нулю.

Поясните тупому, откуда тестер берет эти значения?

PS. Неудачно назвал тему. Как поменять что-то не найду. Следовало бы "В чём причина ... ?"

Ashes:

Никто не хочет опровергнуть моё заблуждение, что для расчёта требуемой маржи достаточно знать символ, тип ордера, объём, плечо, котировку и валюту счёта?

Всю инфу по счету тестер естественно берет из данных по этому счету, все необходимые данные по символу тестер берет из настроек символа.

Данная инфа запрашивается тестером у терминала перед началом тестирования.

 
Interesting:

Всю инфу по счету тестер естественно берет из данных по этому счету, все необходимые данные по символу тестер берет из настроек символа.

Данная инфа запрашивается тестером у терминала перед началом тестирования. 

Ну, плечо в тестере никак не связано с исходным счётом.

Можете назвать параметр счёта или символа, который приводит к нулевому значению маржи?

Документация по MQL5: Торговые функции / OrderCalcMargin
Документация по MQL5: Торговые функции / OrderCalcMargin
  • www.mql5.com
Торговые функции / OrderCalcMargin - Документация по MQL5
 
Ashes:

Ну, плечо в тестере никак не связано с исходным счётом.

Можете назвать параметр счёта или символа, который приводит к нулевому значению маржи?

Раньше было привязано, потом форумчане упросили изменить такой порядок (разработчики пошли нам на встречу).

На счет параметров  нужно уточнить. Как я понимаю это: лаверидж - пдечо торгового счета (вроде были проблемы с ним на чемпионате), price - цена открытия (Ask или Bid), volume - объем сделки (в лотах).

Если расчет проводится самостоятельно скорей всего придется контролировать и другие параметры участвующие в расчете..

 
papaklass:
   https://www.mql5.com/ru/articles/113 - хорошая статья. В ней показаны расчеты маржи для прямых, обратных и кроссовых валют. В ней Вы найдете ответ на свой вопрос.

Поставлю вопрос по другому: почему одна и та же СТАНДАРТНАЯ  функция расчета маржи (см.выше) на одном счёте в тестере выдаёт некое разумное значение, а на другом - на том же инструменте, на том же периоде - 0?

Из справки MQ5 :

[quote]

OrderCalcMargin 

 ...

margin

 [out]  Переменная, в которую будет записан необходимый размер маржи в случае успешного выполнения функции. Вычисление производится как если бы на текущем счете не было отложенных ордеров и открытых позиций. Значение маржи зависит от многих факторов и может меняться при изменении рыночного окружения.

[/quote]

Что это за таинственные "многие факторы", так фатально влияющие на результат?

 
Ashes:

Поставлю вопрос по другому: почему одна и та же СТАНДАРТНАЯ  функция расчета маржи (см.выше) на одном счёте в тестере выдаёт некое разумное значение, а на другом - на том же инструменте, на том же периоде - 0?

Из справки MQ5 :

[quote]

OrderCalcMargin 

 ...

margin

 [out]  Переменная, в которую будет записан необходимый размер маржи в случае успешного выполнения функции. Вычисление производится как если бы на текущем счете не было отложенных ордеров и открытых позиций. Значение маржи зависит от многих факторов и может меняться при изменении рыночного окружения.

[/quote]

Что это за таинственные "многие факторы", так фатально влияющие на результат?

Проще на мой взгяд нарыть формулу расчета маржи для стандартных лотов и обсчитать все самостоятельно (с анализам всех вводных), после чего сравнить результат с OrderCalcMargin.

Если я не ошибаюсь из параметров счета (тестера) берется только плечо и валюта депозита, остальное относится к свойствам символа. При этом цена открытия (Ask и Bid), плечо и объем сделки точно могут давать 0 на выходе.

Для примера можно посмотреть калькулятор а Альпари. Там если не ошибаюсь объем лота и плечо выбирается самостоятельно, а все остальное подставляется по данным из торгового окружения по выбранному символу.

PS

Кстати, разработчикам.

Распишите плиз в справке оптимальную формулу расчета мархи и пример самостоятельного расчета плиз добавьте.

 
Interesting:

Проще на мой взгяд нарыть формулу расчета маржи для стандартных лотов и обсчитать все самостоятельно (с анализам всех вводных), после чего сравнить результат с OrderCalcMargin.

Если я не ошибаюсь из параметров счета (тестера) берется только плечо, остальное относится к свойствам символа. При этом цена открытия (Ask и Bid), плечо и объем сделки точно могут давать 0 на выходе.

Сразу после вызова OrderCalcMargin. Alpari-Demo - Демо-счет

2010.11.26 19:57:20 Core 2 2010.10.04 23:59:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.36735 mreq=0
2010.11.26 19:57:20 Core 2 2010.10.04 23:58:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.36737 mreq=0
2010.11.26 19:57:20 Core 2 2010.10.04 23:57:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.36735 mreq=0
2010.11.26 19:57:20 Core 2 2010.10.04 23:56:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.36741 mreq=0
2010.11.26 19:57:20 Core 2 2010.10.04 23:55:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.36729 mreq=0

 

MetaQuotes-Demo - Конкурсный счёт - Инвестор

2010.11.26 19:48:13 Core 2 2010.10.04 23:59:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.3675 mreq=136.75
2010.11.26 19:48:13 Core 2 2010.10.04 23:58:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.36753 mreq=136.75
2010.11.26 19:48:13 Core 2 2010.10.04 23:57:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.3675 mreq=136.75
2010.11.26 19:48:13 Core 2 2010.10.04 23:56:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.36757 mreq=136.76
2010.11.26 19:48:13 Core 2 2010.10.04 23:55:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1last_tick.ask=1.36744 mreq=136.74

???

Добавил кусочки журнала для сравнения

 
Ashes:

Сразу после вызова OrderCalcMargin.

2010.11.26 19:11:39 Core 2 2010.11.04 17:53:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1 last_tick.ask=1.42088 mreq=0
2010.11.26 19:11:39 Core 2 2010.11.04 17:52:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1 last_tick.ask=1.42115 mreq=0
2010.11.26 19:11:39 Core 2 2010.11.04 17:51:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1 last_tick.ask=1.42075 mreq=0
2010.11.26 19:11:39 Core 2 2010.11.04 17:50:00   ORDER_TYPE_BUY=0 m_smb=EURUSD lot=0.1 last_tick.ask=1.42054 mreq=0

???

На каком сервере проверяем?

Вот такой такой код возвращает маржу - 142,09$ при плече в 100 на сервере MQ (валюта депозита USD)

  if(FirstStart)
  {
  double MarginSize;
  OrderCalcMargin(ORDER_TYPE_BUY,"EURUSD",0.1,1.42088,MarginSize);
  Print(MarginSize);
  }  
Причина обращения: