Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не решает. Будет обрыв связи длительностью несколько баров, несколько баров окажется не инициализированными с мусором.
Либо, как выше сказал Дмитрий, произошел обрыв связи в несколько баров... Кстати, prev_calculated при обрыве связи тоже 0 вернет?
Видимо в это время действительно был обрыв связи.
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:20.865 Network '4092672': scanning network for access points
до тех что выше нет других записей кроме записей о торговле типа этой.
а сколько было обнулений 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()
Хотя соглашусь, чуток рискованно такое написание... но проблеме не в этом.
Можно подробней почему не рекомендуем такой способ?
эта (minEquity == 0 ? bal : minEquity) часть кода при minEquity == 0 вернёт значение bal полученное чуть ранее, значение minEquity не изменится до завершения функции fmin()
Хотя соглашусь, чуток рискованно такое написание... но проблеме не в этом.
Я говорил конкретно про это: minEquity == 0. На равенство числа дабл сравниваете. Это может объяснить падение значений до 0.
Понятно, правильнее будет minEquity == 0.0 ... никак не привыкну.
А последнее предложение совсем не понял. Какие значения до 0?
Понятно, правильнее будет minEquity == 0.0 ... никак не привыкну.
А последнее предложение совсем не понял. Какие значения до 0?
Вот, правда, не знаю может ли неявное приведение типов стать причиной ошибки, я говорил, в принципе, про сравнение вещественных типов. Т.е. здесь, для надежности, я бы написал так:
bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0) return(true);
else return(false);
}
Вот, правда, не знаю может ли неявное приведение типов стать причиной ошибки, я говорил, в принципе, про сравнение вещественных типов. Т.е. здесь, для надежности, я бы написал так:
bool CompareDoubles(double number1,double number2)
{
if(NormalizeDouble(number1-number2,8)==0) return(true);
else return(false);
}
Да в моём варианте считаются деньги с двумя знаками после запятой. Это-же не котировки чтобы к этому подходить так скрупулёзно.
Дело не в скрупулезности, а в точности. В Вашем случае - это может привести к записи в буфер нулевого значения. Если не нужна такая точность, делайте так:
{
minEquity = -1.0;
maxEquity = 0.0;
}
minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Тогда ошибки точно не будет.
Дело не в скрупулезности, а в точности. В Вашем случае - это может привести к записи в буфер нулевого значения. Если не нужна такая точность, делайте так:
{
minEquity = -1.0;
maxEquity = 0.0;
}
minEquity = NormalizeDouble(fmin((minEquity < 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Тогда ошибки точно не будет.
Чё-же я такой тупой??? Как мог не догадаться что инициализировать minEquity лучше не нулём? Тогда всё будет совсем проще...
{
minEquity = DBL_MAX;
maxEquity = 0.0;
}
minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Можно и maxEquity = DBL_MIN;
Чё-же я такой тупой??? Как мог не догадаться что инициализировать minEquity лучше не нулём? Тогда всё будет совсем проще...
{
minEquity = DBL_MAX;
maxEquity = 0.0;
}
minEquity = NormalizeDouble(fmin(minEquity, equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Ну... или так...