советник не проходит валидацию.. - страница 2

 
Vitaly Muzichenko #:

Что происходит с валидатором mq5 ?

Что значит стопаут в тестере и ошибка, это разве нормально?

--

тестер для тестов поставил уровень stopout "что не забалуешь", он наступил и это ошибка.

надо было верещать, локировать, закрывать, сокращать,останавливаться ещё в предверии маржин-кол, а он ещё ближе

 
Maxim Kuznetsov #:

тестер для тестов поставил уровень stopout "что не забалуешь", он наступил и это ошибка.

надо было верещать, локировать, закрывать, сокращать,останавливаться ещё в предверии маржин-кол, а он ещё ближе

Стратегия не обязана быть прибыльна на дефолтных настройках, тем более при валидации в Маркет.

А вообще, нужен более точный ответ, так как это похоже на ошибку валидатора.

 
Vitaly Muzichenko #:

Что значит стопаут в тестере и ошибка, это разве нормально?

Похоже, перемудрили разработчики: закрыть принудительно все за секунду до стопаута и сделать вид, что уж теперь то все отлично.

Можно было бы пойти дальше - PF < 1.5 считается ошибкой.
 
fxsaber #:

закрыть принудительно все за секунду до стопаута

Пишите такую глупую принудилку и валидатор будет пройден.
 
fxsaber #:
Пишите такую глупую принудилку и валидатор будет пройден.

ну это как-бы костыль. 

Для Маркета не должно быть такого ограничения, программа не обязана зарабатывать, тем более на дефолтных настройках

 

раз в год предлагаю "дайте пользователям облегчённую/упрощенную версию тестера". Чтобы на локальной машине можно было запустить и относительно быстро понять ошибки

вал вопросов про тестер значительно уменьшится

 
Vitaly Muzichenko #:

ну это как-бы костыль. 

// Во сколько текущий уровень занятой маржи больше SO/MC-уровня.
// Если меньше единицы - автоматическое выставление SO/MC-ордеров.
double MarginAlertLevel( void )
{
  static const double MarginAlert = MathPow(MathMax(AccountInfoDouble(ACCOUNT_MARGIN_SO_SO),
                                                    AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL)), 2) / 100;
  static const bool IsTester = MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION);
  
  return(IsTester ? AccountInfoDouble(ACCOUNT_MARGIN_LEVEL) / MarginAlert : DBL_MAX);
}


Применение.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

input double inForceClose = 1.5;

int OnInit() { return(!OrderSend(_Symbol, OP_BUY, 1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0, 0, 0)); }

void OnTick()
{
  if (OrdersTotal() &&
      (MarginAlertLevel() < inForceClose)) // Если приблизились к SO/MC-уровню,
    if (OrderSelect(0, SELECT_BY_POS))     // принудительно закрываем все позиции.
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, clrNONE, "SO/MC-level=" +
                                                                            DoubleToString(MarginAlertLevel() * 100, 1) +
                                                                            "%: ForceClose");
}


Запускаем без костыля и видим срабатывание SO.


  inForceClose=0.5
2023.10.03 00:00:00   market buy 1 USDCHF (0.91821 / 0.91829)
2023.10.03 00:00:00   deal #2 buy 1 USDCHF at 0.91829 done (based on order #2)
2023.10.03 00:00:00   deal performed [#2 buy 1 USDCHF at 0.91829]
2023.10.03 00:00:00   order performed buy 1 at 0.91829 [#2 buy 1 USDCHF at 0.91829]
USDCHF : real ticks begin from 2023.10.03 00:00:00
2023.10.06 18:29:00   position stop out triggered at 21.90% [#2 buy 1 USDCHF 0.91829]
2023.10.06 18:29:00   deal #3 sell 1 USDCHF at 0.90902 done (based on order #3)
2023.10.06 18:29:00   deal performed [#3 sell 1 USDCHF at 0.90902]
2023.10.06 18:29:00   order performed sell 1 at 0.90902 [#3 sell 1 USDCHF at 0.90902]


Запускаем с костылем и видим принудительное закрытие до достижения SO-уровня.


  inForceClose=1.5
2023.10.03 00:00:00   market buy 1 USDCHF (0.91821 / 0.91829)
2023.10.03 00:00:00   deal #2 buy 1 USDCHF at 0.91829 done (based on order #2)
2023.10.03 00:00:00   deal performed [#2 buy 1 USDCHF at 0.91829]
2023.10.03 00:00:00   order performed buy 1 at 0.91829 [#2 buy 1 USDCHF at 0.91829]
USDCHF : real ticks begin from 2023.10.03 00:00:00
2023.10.06 18:28:11   market sell 1 USDCHF, close #2 (0.90953 / 0.90955)
2023.10.06 18:28:11   deal #3 sell 1 USDCHF at 0.90953 done (based on order #3)
2023.10.06 18:28:11   deal performed [#3 sell 1 USDCHF at 0.90953]
2023.10.06 18:28:11   order performed sell 1 at 0.90953 [#3 sell 1 USDCHF at 0.90953]


ЗЫ Наверное, ошибку валидатора еще можно получить, если выставить очень большую по объему отложку и дождаться ее акцепта.

 
fxsaber #:


Применение.

...

ЗЫ Наверное, ошибку валидатора еще можно получить, если выставить очень большую по объему отложку и дождаться ее акцепта.

Спасибо, попробую вставить код

 
fxsaber #:

ЗЫ Наверное, ошибку валидатора еще можно получить, если выставить очень большую по объему отложку и дождаться ее акцепта.

Подтвердилось.

2023.10.03 00:00:00   buy limit 10 USDCHF at 0.91729 (0.91821 / 0.91829)
2023.10.03 00:00:00   sell limit 10 USDCHF at 0.91921 (0.91821 / 0.91829)

2023.10.03 05:22:17   current account state: Balance: 1000.00, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 1000.00, Margin: 0.00, FreeMargin: 1000.00
2023.10.03 05:22:17   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 1000.00, Margin: 3333.33, FreeMargin: -2333.33
2023.10.03 05:22:17   not enough money for order [#3 sell limit 10 USDCHF at 0.91921]
2023.10.04 13:12:14   current account state: Balance: 1000.00, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 1000.00, Margin: 0.00, FreeMargin: 1000.00
2023.10.04 13:12:14   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 1000.00, Margin: 3333.33, FreeMargin: -2333.33
2023.10.04 13:12:14   not enough money for order [#2 buy limit 10 USDCHF at 0.91729]

Как-то надо обходить.

 
fxsaber #:

Подтвердилось.

Как-то надо обходить.

Так проверять же нужно (хотя бы приблизительно) хватит ли средств на такую позицию после срабатывания...

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