Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 485

 
-Aleks-:

Помогите пожалуйста разобраться!

Мне нужно найти максимальную просадку на каждом (пусть будет) дне (запись в файл происходит раз в день) - терминал MT4.

Максимальная просадка - это расстояние на графике от пика до текущей просадки средств, а просадка средств это текущий убыток.

Я написал такой код

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Но на каких то графиках показывает верно, а на каких нет - при этом визуально графики однотипны.

Видимо я допустил ошибку в коде или логике, но не могу понять какую.

На сколько я знаю, надо считать от пика Equity и до ямы Equity, а не от баланса, который очень смягчает картину просадок!

И пользуйтесь, пожалуйста, кнопкой SRC, в не какой-то другой, чтобы в ответе не повторялся Ваш код, загромождая сайт!

 
Boris:

На сколько я знаю, надо считать от пика Equity и до ямы Equity, а не от баланса, который очень смягчает картину просадок!

И пользуйтесь, пожалуйста, кнопкой SRC, в не какой-то другой, чтобы в ответе не повторялся Ваш код, загромождая сайт!

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

 

Что такое SRC я не знаю, а поэтому и не использую. 

 
-Aleks-:

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

 

Что такое SRC я не знаю, а поэтому и не использую. 

Эта кнопка, расположенная слева от камеры видео (см. наверх), предназначена для встааки кода!

Насчёт Equity! Если заменили баланс на Equity, надо исключить ACCOUNT_PROFIT, т.к. Equity = баланс + профит. Но мы в терминале видим постоянно меняющиеся Equity, в отчёте тестера фиксируются Equity и просадки в моменты закрытий позиций, потому промежуточные высиженные просадки им не фиксируются. В результате картина более радостная в тестере, чем наяву. С недавнего времени принтую в тестере, в демо и на реале всю необходимую мне информацию на каждом действии советника, открытии, модификации, закрытия и пр., чтобы избегать туфты, которой не терплю ни от себя, ни от других! Но Вы уже это, наверно, заметили. ;)

 

Добрый вечер! Подскажите, пожалуйста, насчет класса CTrailingFixedPips из стандартной библиотеки, в чем смысл "следящего" уровня TakeProfit? Он ведь не будет никогда достигнут? Или я чего-то не понимаю или кода или смысла.

Из документации:

 "Если отступ цены больше уровня Stop Loss, то предлагается установить новую цену Stop Loss позиции.   Если условие модификации Stop Loss выполнено и уровень Take Profit не равен нулю, то предлагается установить новую цену Take Profit позиции. " 

<Expert\Trailing\CTrailingFixedPips.mqh>

//+------------------------------------------------------------------+
//| Checking trailing stop and/or profit for long position.          |
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
...
...   
   delta=m_stop_level*m_adjusted_point;
   if(price-base>delta)
     {
      sl=price-delta;
      if(m_profit_level!=0) tp=price+m_profit_level*m_adjusted_point;
     }
...
  }
 
Hexen:

Добрый вечер! Подскажите, пожалуйста, насчет класса CTrailingFixedPips из стандартной библиотеки, в чем смысл "следящего" уровня TakeProfit? Он ведь не будет никогда достигнут? Или я чего-то не понимаю или кода или смысла.

Из документации:

 "Если отступ цены больше уровня Stop Loss, то предлагается установить новую цену Stop Loss позиции.   Если условие модификации Stop Loss выполнено и уровень Take Profit не равен нулю, то предлагается установить новую цену Take Profit позиции. " 

<Expert\Trailing\CTrailingFixedPips.mqh>

Скорее всего опечатка. Должно быть Stop Loss.
 
Hexen:

Добрый вечер! Подскажите, пожалуйста, насчет класса CTrailingFixedPips из стандартной библиотеки, в чем смысл "следящего" уровня TakeProfit? Он ведь не будет никогда достигнут? Или я чего-то не понимаю или кода или смысла.

Из документации:

 "Если отступ цены больше уровня Stop Loss, то предлагается установить новую цену Stop Loss позиции.   Если условие модификации Stop Loss выполнено и уровень Take Profit не равен нулю, то предлагается установить новую цену Take Profit позиции. " 

<Expert\Trailing\CTrailingFixedPips.mqh>

Судя по приведенному коду, ТП двигается синхронно со СЛ. В топку такой трейлинг )
 
Boris:

Эта кнопка, расположенная слева от камеры видео (см. наверх), предназначена для встааки кода!

Так для кода же есть стиль "Код" - выбирается из меню - его и использую.

 

Boris:

Насчёт Equity! Если заменили баланс на Equity, надо исключить ACCOUNT_PROFIT, т.к. Equity = баланс + профит. Но мы в терминале видим постоянно меняющиеся Equity, в отчёте тестера фиксируются Equity и просадки в моменты закрытий позиций, потому промежуточные высиженные просадки им не фиксируются. В результате картина более радостная в тестере, чем наяву. С недавнего времени принтую в тестере, в демо и на реале всю необходимую мне информацию на каждом действии советника, открытии, модификации, закрытия и пр., чтобы избегать туфты, которой не терплю ни от себя, ни от других! Но Вы уже это, наверно, заметили. ;)

 Если бы фиксация просадки в тестере для отчета была только в момент закрытия позиции, то при использовании одного ордера в рынке не было бы просадки, а это не так ;)

ACCOUNT_PROFIT=Средства-баланс , поэтому не вижу причины не использовать этот показатель в расчетах...

 
-Aleks-:

Помогите пожалуйста разобраться!

Мне нужно найти максимальную просадку на каждом (пусть будет) дне (запись в файл происходит раз в день) - терминал MT4.

Максимальная просадка - это расстояние на графике от пика до текущей просадки средств, а просадка средств это текущий убыток.

Я написал такой код

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Но на каких то графиках показывает верно, а на каких нет - при этом визуально графики однотипны.

Видимо я допустил ошибку в коде или логике, но не могу понять какую.

Нашел ошибку в коде - лишний знак равенства надо так

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

Однако и это меня не сильно приблизило к разгадке причины разницы потикового расчета и результата в тестере.

Проверил теорию Бориса с расчетам по эквити - так же результат - отрицательный. 

 

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

 Кстати, не ясно каким образом происходит рассинхронизация эквити и баланса в тестере на графике, если в торговле находится только один лот?

 
-Aleks-:

Нашел ошибку в коде - лишний знак равенства надо так

 BalansNew=AccountInfoDouble(ACCOUNT_BALANCE); 

Однако и это меня не сильно приблизило к разгадке причины разницы потикового расчета и результата в тестере.

Проверил теорию Бориса с расчетам по эквити - так же результат - отрицательный. 

 

   if(Analiz_Prosadki==true)

     {

      if(ContolSavaTXT==1)

        {

         ProfitNew=0;

         ContolSavaTXT=0;

        }


      if(ContolSavaTXT==0)

        {

         BalansNew=AccountInfoDouble(ACCOUNT_EQUITY);  //Текущее значение баланса

         if (BalansNew>BalansMax) BalansMax=BalansNew;

         if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;

         if (ProfitNew<ProfitMin) ProfitMin=ProfitNew;

        }


      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitNew);   // Пишем информацию в файл - функция возвращает 1

     }

 Кстати, не ясно каким образом происходит рассинхронизация эквити и баланса в тестере на графике, если в торговле находится только один лот?

Чтобы понять "каким образом происходит рассинхронизация эквити и баланса" надо понять что такое баланс и что такое эквити.

Баланс - зафиксированное количество средств на счёте.

Эквити - Текущее, переменное количество средств на счёте.

В тестере присутствует та-же функция которую ты сейчас пишешь и фиксирует просадку, но не так как тебе хотелось-бы.

В итоге: чтобы посчитать максимальную просадку надо объявить переменную для хранения этого значения либо static либо на уровне глобальных переменных и потом примерно так-же как в твоём коде эту переменную перезаписывать.

Вот что у тебя сейчас написано...

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

Надо сделать две переменные max и min и в них писать значения.

И мысли вслух: Лучше записывать в файл не за день, а при закрытии ордера и перезаписать переменные. В этот момент эквити равно балансу, а переменную в которую пишем max и min обнуляем.

 
Alexey Viktorov:

Чтобы понять "каким образом происходит рассинхронизация эквити и баланса" надо понять что такое баланс и что такое эквити.

Баланс - зафиксированное количество средств на счёте.

Эквити - Текущее, переменное количество средств на счёте.

В тестере присутствует та-же функция которую ты сейчас пишешь и фиксирует просадку, но не так как тебе хотелось-бы.

В итоге: чтобы посчитать максимальную просадку надо объявить переменную для хранения этого значения либо static либо на уровне глобальных переменных и потом примерно так-же как в твоём коде эту переменную перезаписывать.

Вот что у тебя сейчас написано...

if (BalansNew>BalansMax) BalansMax=BalansNew; // Если новое значение эквити больше зафиксированного в прошлый раз - перезапишем значение переменной

// но это не просадка, это максимальная прибыль

if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  // А здесь BalansNew уже равно BalansMax и эта строка не выполняется никогда...

Надо сделать две переменные max и min и в них писать значения.

И мысли вслух: Лучше записывать в файл не за день, а при закрытии ордера и перезаписать переменные. В этот момент эквити равно балансу, а переменную в которую пишем max и min обнуляем.

Спасибо, что откликнулись на просьбу о помощи!

Глобальная переменная актуальна при реальной работе по рынку - мне нужна тестовая информация - поэтому и не заморачивался.

Касаемо что такое эквити и баланс - я конечно знаю, а вот как считается просадка - так и не удалось вычислить, из моих примеров кода видно, что я пробовал за максимум брать как баланс так и средства, аналогично и за минимум брал баланс и средства, но аналогичных результатов с тестером так и не удаётся получить - они примерно сходятся, но не точно.

Почему Вы считаете, что неравенство  if (BalansNew<BalansMax) ProfitNew=BalansNew-BalansMax;  никогда не выполняется? Оно лишь не выполняется на том баре, когда достигнут новый максимум баланса (или эквити - всё равно не верно), но в этот момент я фиксирую просадку по прибыли ProfitMin=ProfitNew.

Запись файла за день как раз актуальней - так как максимальная просадка достигается, как правило, не в момент закрытия ордера,а целью является вычисление среднего размера средств, необходимых для работы советника.

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