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

 
-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.

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

 

Вопрос - учитывает ли тестер своп?

Произвел расчет в экселе (счет центовый), получил странный результат

№ П.П. Data Type Lot Price  MaxHigh MaxEqDrd
1 2014.06.12 09:52 sell 0,1 1,6824 0,16824 1,7179 -3,55
2 2014.06.12 15:18 sell 0,2 1,6831 0,33662 1,7179 -6,96
3 2014.06.12 17:52 sell 0,3 1,6836 0,50508 1,7179 -10,29
4 2014.06.12 19:10 sell 0,5 1,6839 0,84195 1,7179 -17,00
5 2014.06.12 23:00 sell 0,8 1,6845 1,3476 1,7179 -26,72
6 2014.06.16 09:59 sell 1,3 1,6985 2,20805 1,7179 -25,22
7 2014.06.19 09:58 sell 2,1 1,7017 3,57357 1,7179 -34,02
8 2014.06.19 11:21 sell 3,4 1,7018 5,78612 1,7179 -54,74
9 2014.06.19 20:40 sell 5,5 1,7033 9,36815 1,7179 -80,30
10 2014.06.19 22:12 sell 8,9 1,7036 15,16204 1,7179 -127,27
11 2014.06.20 05:10 sell 14,4 1,7047 24,54768 1,7179 -190,08
12 2014.06.20 05:22 sell 23,3 1,7049 39,72417 1,7179 -302,90
13 2014.06.26 12:38 sell 37,7 1,7030 64,2031 1,7179 -561,73
14 2014.06.26 15:18 sell 61,0 1,7033 103,9013 1,7179 -890,60
15 2014.06.27 06:51 sell 98,7 1,7050 168,2835 1,7179 -1273,23
16 2014.06.30 17:37 sell 100,0 1,7079 170,79 1,7179 -1000,00
17 2014.06.30 17:37 sell 59,7 1,7079 101,96163 1,7179 -597,00
18 2014.07.01 09:03 sell 100,0 1,7100 171 1,7179 -790,00
19 2014.07.01 09:03 sell 100,0 1,7100 171 1,7179 -790,00
20 2014.07.01 09:03 sell 58,4 1,7100 99,864 1,7179 -461,36
21 2014.07.01 11:30 sell 100,0 1,7110 171,1 1,7179 -690,00
22 2014.07.01 11:30 sell 100,0 1,7110 171,1 1,7179 -690,00
23 2014.07.01 11:30 sell 100,0 1,7110 171,1 1,7179 -690,00
24 2014.07.01 11:30 sell 100,0 1,7110 171,1 1,7179 -690,00
25 2014.07.01 11:30 sell 18,1 1,7110 30,9691 1,7179 -124,89
26 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
27 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
28 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
29 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
30 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
31 2014.07.02 02:33 sell 100,0 1,7145 171,45 1,7179 -340,00
32 2014.07.02 02:33 sell 76,5 1,7145 131,15925 1,7179 -260,10
33 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
34 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
35 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
36 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
37 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
38 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
39 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
40 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
41 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
42 2014.07.02 11:32 sell 100,0 1,7176 171,76 1,7179 -30,00
43 2014.07.02 11:32 sell 94,6 1,7176 162,48496 1,7179 -28,38
 Итого:  2865,5  4909,88611  -12756,34
    Средняя цена открытия -> 1,7134  
       
High 04.07.2014   1,7179   
       
    Просадка в пунктах -> 0,0045  
    Просадка в валюте -> 12756,34  
       
    Просадка согласно коду -> 13823,00  
    Просадка согласно отчету тестера -> 23669,03  
       
    TP - > 1,7084  
    Прибыль в пунктах -> 0,0050  
    Прибыль по расчету - > 14465,91  
       
    Прибыль по отчету - > 13915,05  


Каким образом просадка не сходится - особенно с отчетом тестера? До этого закрытых позиций не было!

 

Так выглядит ситуация на чарте