Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1025

 

Посоветуйте какой-то нормальный зиг-заг, пожалуйста... А то вот использую такое, а его колбасит иногда сильно...


 

Подскажите, не совсем понимаю - в тестере график вот такой, все тики М1, нач.депо 5000 а просадку показывает  62% (3325), на графике её очевидно нет. Несоответствие?

Дело в качестве моделирования? Как тестер тогда вычисляет эту просадку? Если он её вычисляет то почему это не видно по кривой эквити?



 
Aleksey Mavrin:

Если он её вычисляет то почему это не видно по кривой эквити?

МТ4 не показывает зелененькую линию эквити до момента закрытия хоть одного ордера, будет закрытие - тогда будет отрисована зелененькая линия - состояние средств (МТ5 лишен этого недостатка)

Aleksey Mavrin:

просадку показывает  62% (3325), на графике её очевидно нет. Несоответствие?

тестер просадку считает по эквити, но относительно ордера с максимальной просадкой, т.е. возможно у Вас был открытый ордер в тестере и Вы усреднялись, общая эквити у Вас может и была в +, а самый убыточный и был в определенный момент тестирования в большом минусе


ЗЫ: качество моделирования очень низкое, Вы тестируете ТС по всем тикам, но для теста выбран очень большой ТФ https://www.mql5.com/ru/articles/1486 

 
Igor Makanu:

МТ4 не показывает зелененькую линию эквити до момента закрытия хоть одного ордера, будет закрытие - тогда будет отрисована зелененькая линия - состояние средств (МТ5 лишен этого недостатка)

тестер просадку считает по эквити, но относительно ордера с максимальной просадкой, т.е. возможно у Вас был открытый ордер в тестере и Вы усреднялись, общая эквити у Вас может и была в +, а самый убыточный и был в определенный момент тестирования в большом минусе


ЗЫ: качество моделирования очень низкое, Вы тестируете ТС по всем тикам, но для теста выбран очень большой ТФ https://www.mql5.com/ru/articles/1486 

Так точно, усреднитель. Теперь понятнее, спасибо большое! Единственное насчет лини эквити -

Я анализировал его график торговли (имею ввиду визуализатор) сетка-усреднитель как он есть, т.е. у него очень часто просадки, а на графике линия эквити этого не отражает, например вот 

сделка 2018 декабрь 04. сделка 1238, на графике это в районе второй с конца вертикальной штриховой линии, под которой номер сделки 1251. Там нет и намека на какую-то просадку по зеленой линии эквити.

Т.е. всё равно непонятно как она рисуется, но закрадывается вывод - доверять никак нельзя и надо валить на МТ5)

з.ы. качество моделирования незнай почему такое, ТФ стоит М1, все тики. архив скачивал с MQ сервака, может поэтому


 
Aleksey Mavrin:

Так точно, усреднитель. Теперь понятнее, спасибо большое! Единственное насчет лини эквити -

Я анализировал его график торговли (имею ввиду визуализатор) сетка-усреднитель как он есть, т.е. у него очень часто просадки, а на графике линия эквити этого не отражает, например вот 

сделка 2018 декабрь 04. сделка 1238, на графике это в районе второй с конца вертикальной штриховой линии, под которой номер сделки 1251. Там нет и намека на какую-то просадку по зеленой линии эквити.

Т.е. всё равно непонятно как она рисуется, но закрадывается вывод - доверять никак нельзя и надо валить на МТ5)

з.ы. качество моделирования незнай почему такое, ТФ стоит М1, все тики. архив скачивал с MQ сервака, может поэтому


Тестер MetaTrader 4 сильно уступает тестеру MetaTrader 5. Он не может показать средства пока что-то не будет закрыто - показывает их только в момент фиксации прибыли/убытка. У вас на картинке все короткие позиции закрыты одновременно - поэтому в отчёте и нет линии эквити между открытием и закрытием. Если бы хоть одна позиция была закрыта в промежутке между открытием и закрытием позиций у вас на скрине, то тогда бы в отчёте была бы отражена просадка по средствам, которая была на момент закрытия. Т.е., в отчёте бы отразилось две просадки - по балансу от закрытия одной позиции с убытком, и по средствам - от просадки текущих средств из-за текущего плавающего убытка по средствам всех открытых позиций.

 
Aleksey Mavrin:

Т.е. всё равно непонятно как она рисуется, но закрадывается вывод - доверять никак нельзя и надо валить на МТ5)

доверять можно, но читать нужно весь отчет тестера

добавьте в код свою оценку просадки и выводите в лог в OnDeinit(), если речь идет о том как проверить, тестер в расчете максимальной просадки, то примерно так

double minOrderProfit = 0.0;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Print("minOrderProfit = ",minOrderProfit);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) minOrderProfit = fmin(minOrderProfit,OrderProfit());
   }

// основной код

   
  }
//+------------------------------------------------------------------+


ЗЫ: не проверял, но должно работать

 
Igor Makanu:

доверять можно, но читать нужно весь отчет тестера

добавьте в код свою оценку просадки и выводите в лог в OnDeinit(), если речь идет о том как проверить, тестер в расчете максимальной просадки, то примерно так


ЗЫ: не проверял, но должно работать

Понял, спасибо. Я в своих советниках собираю статистику всю широко и для тестера-оптимизатора и вообще, считаю коэф-ты шарпов всяких и прочих, волатильность и DD и пр.  дневные, месячные, общий естественно, ну всё что можно.

А это был эксперимент с роботом с Маркета, я поставил его проверить, т.к. знаю что такого графика кривой не может быть с такими мега -прибылями. Я убедился что я прав, т.е. из-за особенностей отображения кривой эквити в МТ4

делается неверная оценка возможностей продукта (если смотреть на график торговли) , а графики сплошь и рядом тыкают в маркете, ну вы поняли посыл? :) з.ы. дерьмо втюхивают людям

 

Доброго дня.

Написал индикатор, но понимаю что ошибка!! Вопрос к красной горизонтальной линии (от начала сессии дня ). 

ПОЧЕМУ-ТО рисует в usdrub, eurrub НОРМАЛЬНОи без ошибок в экспертах, а eurusd и др нет. И ругается записью в экспертах

(2019.12.19 11:25:31.532 Session Day (EURUSDrfd,H1) array out of range in 'Session Day.mq5' (144,41)

Прошу помощь зала...

Заранее спасибо за подсказку!


PS

НАПРАВЛЕНИЕ КРАСНОЙ ЛИНИИ (открытие сессии) ПРАВИЛЬНОЕ, из сегодня во вчера!!!!!!!

//+------------------------------------------------------------------+
//|                                                  Session Day.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   2
//---- plot ColorCandles
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  White,Blue,Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_label1  "Open;High;Low;Close"
//----
#property indicator_type2   DRAW_LINE
#property indicator_color2  Red
#property indicator_style2  STYLE_SOLID
#property indicator_width2  3
#property indicator_label2  "Line open session"
//-----
input int     StartCandle = 100;         //Кол-во свечек для расчета средней
input int     StartBarDay = 0;           //Час начала торгового дня
input int     BarSession1 = 10;          //Чвс Открытия дневной сессии
input int     BarSession2 = 19;          //Чвс Закрытия дневной сессии
input bool    LevelOpenSession = true;   //Уровень открытия сессии дня
//---
double ExtOpenBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];
double ExtCloseBuffer[];
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtOpenBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtHighBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtLowBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,ExtCloseBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,ExtBuffer,INDICATOR_DATA);
//--- установим цвет контура и теней
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrWhite);
//--- установим цвет тела для бычьей свечи
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);
//--- установим цвет тела для медвежьей свечи
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   if(Period()<PERIOD_H4)
      IndicatorSetString(INDICATOR_SHORTNAME,"Session Day \nOpen session: "+string(BarSession1)+" hour \nClose session: "+string(BarSession2)+" hour");
   else
      IndicatorSetString(INDICATOR_SHORTNAME,"Session Day");
   int bars=iBars(NULL,_Period);
   for(int b=0; b<5; b++)
      PlotIndexSetInteger(b,PLOT_DRAW_BEGIN,bars-StartCandle);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int i;
   if(rates_total<24)
      return(0);
   MqlDateTime tm;
//----
   if(prev_calculated==0)
     {
      ArrayInitialize(ExtOpenBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtHighBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtCloseBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtBuffer,EMPTY_VALUE);
      i=0;
     }
   else
      i=prev_calculated-1;
//----
   while(i<rates_total && !IsStopped())
     {
      TimeToStruct(time[i],tm);
      if(Period()==PERIOD_MN1 && (tm.mon==4 || tm.mon==8 || tm.mon==12))
        {
         ExtOpenBuffer[i]=open[i];
         ExtHighBuffer[i]=high[i];
         ExtLowBuffer[i]=low[i];
         ExtCloseBuffer[i]=close[i];
        }
      if(Period()==PERIOD_W1 && tm.mon>=1 && tm.mon<=12 && tm.day>=1 && tm.day<8)
        {
         ExtOpenBuffer[i]=open[i];
         ExtHighBuffer[i]=high[i];
         ExtLowBuffer[i]=low[i];
         ExtCloseBuffer[i]=close[i];
        }
      if(Period()==PERIOD_D1 && tm.day_of_week==1)
        {
         ExtOpenBuffer[i]=open[i];
         ExtHighBuffer[i]=high[i];
         ExtLowBuffer[i]=low[i];
         ExtCloseBuffer[i]=close[i];
        }
      if(Period()==PERIOD_H4 && tm.hour==StartBarDay && tm.min==0)
        {
         ExtOpenBuffer[i]=open[i];
         ExtHighBuffer[i]=high[i];
         ExtLowBuffer[i]=low[i];
         ExtCloseBuffer[i]=close[i];
        }
      if(Period()<=PERIOD_H1 && tm.hour==BarSession1 && tm.min==0)
        {
         ExtOpenBuffer[i]=open[i];
         ExtHighBuffer[i]=high[i];
         ExtLowBuffer[i]=low[i];
         ExtCloseBuffer[i]=close[i];
        }
      if(Period()<=PERIOD_H1 && tm.hour==BarSession2 && tm.min==0)
        {
         ExtOpenBuffer[i]=open[i];
         ExtHighBuffer[i]=high[i];
         ExtLowBuffer[i]=low[i];
         ExtCloseBuffer[i]=close[i];
        }


                     ПРОБЛЕМА !!!!!
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      if(LevelOpenSession==true && Period()==PERIOD_H1 && tm.hour==BarSession1 && tm.min==0)
         for(int j=0; j<24; j++)
           {
            ExtBuffer[i-j]=open[i];
            if(ExtBuffer[i-j]!=ExtBuffer[i-j-1])
               ExtBuffer[i-j-1]=EMPTY_VALUE;
           }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      //---
      i++;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+




 
kopeyka2:

Доброго дня.

Написал индикатор, но понимаю что ошибка!! Вопрос к красной горизонтальной линии (от начала сессии дня ). 

ПОЧЕМУ-ТО рисует в usdrub, eurrub НОРМАЛЬНОи без ошибок в экспертах, а eurusd и др нет. И ругается записью в экспертах

(2019.12.19 11:25:31.532 Session Day (EURUSDrfd,H1) array out of range in 'Session Day.mq5' (144,41)


 ExtBuffer[i-j]=open[i];
            if(ExtBuffer[i-j]!=ExtBuffer[i-j-1])
               ExtBuffer[i-j-1]=EMPTY_VALUE;

в этом месте в какой-то момент вы обращаетесь к отрицательному индексу  массива. проверьте установку и проверку всех граничных условий для i, j

 
Artyom Trishkin:

Тестер MetaTrader 4 сильно уступает тестеру MetaTrader 5. Он не может показать средства пока что-то не будет закрыто - показывает их только в момент фиксации прибыли/убытка. У вас на картинке все короткие позиции закрыты одновременно - поэтому в отчёте и нет линии эквити между открытием и закрытием. Если бы хоть одна позиция была закрыта в промежутке между открытием и закрытием позиций у вас на скрине, то тогда бы в отчёте была бы отражена просадка по средствам, которая была на момент закрытия. Т.е., в отчёте бы отразилось две просадки - по балансу от закрытия одной позиции с убытком, и по средствам - от просадки текущих средств из-за текущего плавающего убытка по средствам всех открытых позиций.

Вот это вообще чётко расписали, спасибо. сначала почему-то не заметил пост(

А вопрос тогда) - Запрос внутри тестера функций информации о состоянии счёта типа AccountEquity и пр. - он то даёт верную картину вне зависимости от закрылась позиция какая-то или нет?

просто если допустим сделки долгосрочные, и надо записывать каждый день просадку по эквити, в тестере не будет обманывать?

Причина обращения: