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

 
Aleksei Kuznetsov #:

Так и сделано в приложеном коде.

Я отвечал на процитированный вопрос.

Функция должна вызываться в начале OnTick и после каждой торговой операции.


Последнее - не всегда возможно со стороны пользователя. Например, на одном тике срабатывание отложки и SL/TP-уровня другой позиции.

 
fxsaber #:

Я отвечал на процитированный вопрос.

Функция должна вызываться в начале OnTick и после каждой торговой операции.


Последнее - не всегда возможно со стороны пользователя. Например, на одном тике срабатывание отложки и SL/TP-уровня другой позиции.

Добавил перерасчет эквити везде:

void OnTick(void){
   Equity(AccountInfoDouble(ACCOUNT_EQUITY));
   if(SelectPosition())
      CheckForClose();
   else
      CheckForOpen();
   
   Equity(AccountInfoDouble(ACCOUNT_EQUITY));
  }
  
  void OnTrade(void){ Equity(AccountInfoDouble(ACCOUNT_EQUITY));}

Без изменений.Эквити отличаются.

Да и советник редко торгует - не на каждом тике. И мой тестовый тоже, а в нем отличия на ~$20.

 
Aleksei Kuznetsov #:

Без изменений.Эквити отличаются.

OnTrade - это не после торговой операции, которая находится в OnTick.


Добавьте такое изменение в этот советник.

class CTrade2 : public CTrade
{
public:
  virtual bool OrderSend(const MqlTradeRequest &request,MqlTradeResult &result) override
  {
    const bool Res = this.CTrade::OrderSend(request, result);
    
    if (Res)
      Equity(::AccountInfoDouble(ACCOUNT_EQUITY));
      
    return(Res);
  }
};

// CTrade ExtTrade;
CTrade2 ExtTrade;
 

Добавил и после торговых операций. Без изменений. Отличия на ~$1.5 Код приложен.

   if(signal!=WRONG_VALUE)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
                               SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               0,0);
       Equity(AccountInfoDouble(ACCOUNT_EQUITY));
     }

...
   if(signal)
     {
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
         ExtTrade.PositionClose(_Symbol,3);
      
      Equity(AccountInfoDouble(ACCOUNT_EQUITY));

     }

К тому же в МТ тестере просадка эквити всегда меньше. Скорее там что-то не учитывается.
Если бы не учитывалось у меня - то у меня просадка была бы меньше.

Файлы:
test.mq5  19 kb
 
Aleksei Kuznetsov #:

Добавил и после торговых операций. Без изменений. Отличия на ~$1.5 Код приложен.

Поставьте начальный баланс 123456. И в абсолюте просадка уже будет отличаться на сотни единиц даже в режиме по пипсам.

Похоже, все же баг на совсем ровном месте.


ЗЫ Проблема даже с одной позицией.

void OnTick(void)
  {
   static bool FirstRun = true;
   
   Equity(AccountInfoDouble(ACCOUNT_EQUITY));

//---
   if(SelectPosition())
   {
      CheckForClose();
      
      FirstRun = false;
   }
   else if (FirstRun)
      CheckForOpen();
//---
  }
 
fxsaber #:

Поставьте начальный баланс 123456. И в абсолюте просадка уже будет отличаться на сотни единиц даже в режиме по пипсам.

Похоже, все же баг на совсем ровном месте.


ЗЫ Проблема даже с одной позицией.

Увеличил на порядок баланс - отличия абс просадки тоже на порядок увеличились. Там лот в % берется, поэтому растут вместе.

Функция совсем простая. В ней негде ошибиться. Тоже думаю, что это баг тестера.

 
Aleksei Kuznetsov #:

Функция совсем простая. В ней негде ошибиться. Тоже думаю, что это баг тестера.

Курьез даже с одной позицией.
   void Equity(double equity){
      static double max_e=0,DDe,DDEq;
      EQUITYMIN=fmin(equity,EQUITYMIN);
      max_e = fmax(equity, max_e);
      DDe = max_e - equity;
                DDEq = DDe / max_e * 100.0;
                if(EQUITY_DD < DDe)
                {
                  EQUITY_DD = DDe;
                  EQUITYDD_PERCENT = DDEq;
                  
                  if ((EQUITY_DD == 2090) && // Сюда прописываем число, равное максимальной просадке, что показывает функция.
                      (DDe <= EQUITY_DD))    // Если равно оставить, то MT5-просадка будет правильной. Иначе - нет.
        ExtTrade.PositionClose(_Symbol,3);
                }//макс просадка в деньгах и %
                if(EQUITY_DDREL_PERCENT < DDEq){EQUITY_DDREL_PERCENT = DDEq; EQUITY_DD_RELATIVE = DDe;}// момент максимальной просадки  в %
   }
Если закрыть позицию раньше, то просадка больше, чем если закрыть позже. Баг 100%.
 
fxsaber #:
Курьез даже с одной позицией. Если закрыть позицию раньше, то просадка больше, чем если закрыть позже. Баг 100%.

Если в макс просадке закрыться как в вашем примере, то тестер узнает об этой эквити. Без этого действия - нет. Значит он фильтрует - берет не все тики, а часть. Например цену открытия М1. Плюс моменты сделок, которую он неожиданно увидел.

Или как то по другому фильтруют.
 

На днях на билде 5488 столкнулся с ошибкой 539 после компиляции индикатора.

Решение нашлось благодаря https://www.mql5.com/ru/forum/289606/page2#comment_58808193

// вот без этих property получается 539:
#property indicator_type1 DRAW_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_color1 clrRed
#property indicator_width1 1

Спасибо большое автору.

Проверил. Решение работает.

В моём случае было достаточно добавить в код первую строку(#property indicator_type1   DRAW_NONE).

Спасибо за архив.
Спасибо за архив.
  • 2019.10.13
  • www.mql5.com
так закрываются некоторые баги и лазейки, которые вам как раз интересны. Make an Effort Thank you for TG - helped out the archival version на днях столкнулся с ошибкой 539 - она возникает по крайней мере в моем случае так было когда у индикатора не заданы property indicator styleN
 

WIN11 билд 5472 - при запуске тестирования, во время синхронизации тиков windows defender начинает проц грузить на 99%

Отключил defender, загрузки проца нет, но само тестирование работает еле-еле, каждый агент тестироания загружается на 0,5-6% максимум.