prev_calculated - страница 10

 
Dmitry Fedoseev:
Не решает. Будет обрыв связи длительностью несколько баров, несколько баров окажется не инициализированными с мусором. 
Alexey Kozitsyn:
Либо, как выше сказал Дмитрий, произошел обрыв связи в несколько баров... Кстати, prev_calculated при обрыве связи тоже 0 вернет?

Видимо в это время действительно был обрыв связи.

2016.10.19 04:46:13.770 Network '4092672': scanning network finished
2016.10.19 04:45:37.260 Network '4092672': scanning network for access points
2016.10.19 04:45:36.630 Network '4092672': trading has been enabled - hedging mode
2016.10.19 04:45:36.630 Network '4092672': terminal synchronized with MetaQuotes Software Corp.
2016.10.19 04:45:36.000 Network '4092672': previous successful authorization performed from 31.173.80.3 on 2016.10.18 17:51:14
2016.10.19 04:45:36.000 Network '4092672': authorized on MetaQuotes-Demo through Access Point SG Singapore (ping: 583.86 ms)
2016.10.19 04:42:57.680 Network '4092672': connection to MetaQuotes-Demo lost

И вероятней всего что при обрыве prev_calculated возвращает 0.

Ну ладно, это был длительный обрыв связи, а другие обнуления prev_calculated чем вызваны?

от этих строк

2016.10.18 23:51:34.895 Network '4092672': scanning network finished
2016.10.18 23:51:20.865 Network '4092672': scanning network for access points

до тех что выше нет других записей кроме записей о торговле типа этой.

2016.10.19 00:00:36.066 Trades  '4092672': cancel order #103987819 buy stop 0.10 USDJPY at 103.977 sl: 103.377 tp: 104.077

а сколько было обнулений prev_calculated видно в предыдущем моём посте.

 
Alexey Kozitsyn:

Потенциально, косяк может быть здесь:

if(rates_total > prev_calculated)
   {
    minEquity = 0;
    maxEquity = 0;
   }
   minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

При наступлении нового бара, Вы сбрасываете значения в 0 - хорошо. Но следом Вы на равенство проверяете minEquity и 0, способом не рекомендуемым.

В подтверждение своих слов - Ваш рисунок. По нему видно, что "мусорные" как Вы сказали значения примерно у нуля.
 

И лучше, конечно, на рисунок добавить окно данных с "мусорным" значением.

Можно подробней почему не рекомендуем такой способ?

эта (minEquity == 0 ? bal : minEquity) часть кода при minEquity == 0 вернёт значение bal полученное чуть ранее, значение minEquity не изменится до завершения функции fmin()

Хотя соглашусь, чуток рискованно такое написание... но проблеме не в этом.

 
Alexey Viktorov:

Можно подробней почему не рекомендуем такой способ?

эта (minEquity == 0 ? bal : minEquity) часть кода при minEquity == 0 вернёт значение bal полученное чуть ранее, значение minEquity не изменится до завершения функции fmin()

Хотя соглашусь, чуток рискованно такое написание... но проблеме не в этом.

Я говорил конкретно про это: minEquity == 0. На равенство числа дабл сравниваете. Это может объяснить падение значений до 0.
 
Alexey Kozitsyn:
Я говорил конкретно про это: minEquity == 0. На равенство числа дабл сравниваете. Это может объяснить падение значений до 0.

Понятно, правильнее будет minEquity == 0.0  ... никак не привыкну.

А последнее предложение совсем не понял. Какие значения до 0?

 
Alexey Viktorov:

Понятно, правильнее будет minEquity == 0.0  ... никак не привыкну.

А последнее предложение совсем не понял. Какие значения до 0?

Вот, правда, не знаю может ли неявное приведение типов стать причиной ошибки, я говорил, в принципе, про сравнение вещественных типов. Т.е. здесь, для надежности, я бы написал так:

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }


 

 
Alexey Kozitsyn:

Вот, правда, не знаю может ли неявное приведение типов стать причиной ошибки, я говорил, в принципе, про сравнение вещественных типов. Т.е. здесь, для надежности, я бы написал так:

CompareDoubles( minEquity, 0.0 );

bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }


 

Да в моём варианте считаются деньги с двумя знаками после запятой. Это-же не котировки чтобы к этому подходить так скрупулёзно.
 
Alexey Viktorov:
Да в моём варианте считаются деньги с двумя знаками после запятой. Это-же не котировки чтобы к этому подходить так скрупулёзно.

Дело не в скрупулезности, а в точности. В Вашем случае - это может привести к записи в буфер нулевого значения. Если не нужна такая точность, делайте так:

if(rates_total > prev_calculated)
   {
    minEquity = -1.0;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Тогда ошибки точно не будет.
 

 
Alexey Kozitsyn:

Дело не в скрупулезности, а в точности. В Вашем случае - это может привести к записи в буфер нулевого значения. Если не нужна такая точность, делайте так:

if(rates_total > prev_calculated)
   {
    minEquity = -1.0;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Тогда ошибки точно не будет.
 

Чё-же я такой тупой??? Как мог не догадаться что инициализировать minEquity лучше не нулём? Тогда всё будет совсем проще...

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);

Можно и maxEquity = DBL_MIN;

 
Alexey Viktorov:

Чё-же я такой тупой??? Как мог не догадаться что инициализировать minEquity лучше не нулём? Тогда всё будет совсем проще...

if(rates_total > prev_calculated)
   {
    minEquity = DBL_MAX;
    maxEquity = 0.0;
   }
   minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
    maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);


Ну... или так...
 
Alexey Kozitsyn:
Ну... или так...
А в общем-то проблема не в этом. Хоть и удалось её как-то обойти, но мусор в индикаторном буфере при запуске индикатора это не правильно.
Причина обращения: