Максимальный спред за определенный период времени

 

Здравствуйте! Хочу сравнивать текущий спред с максимальным за последние 24 часа. 

Нахожу текущий спред так:

double spread=(double)SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);

Максимальный спред за 24 часа так:

datetime start_time_extr_h24 = time_current-24*60*60;
datetime time_current=TimeCurrent();
int Spread[];
if(CopySpread(Symbol(),Period(),start_time_extr_h24,time_current,Spread)==-1){}
int position_max_spread_h24=ArrayMaximum(Spread);
int spread_max_h24=Spread[position_max_spread_h24];

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

Подскажите, что у меня не правильно в коде.
Заранее спасибо!

 
renatmt5:

Здравствуйте! Хочу сравнивать текущий спред с максимальным за последние 24 часа. 

Нахожу текущий спред так:

Максимальный спред за 24 часа так:

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

Подскажите, что у меня не правильно в коде.
Заранее спасибо!

А у вас вообще все это дело компилится ? Вы переменную time_current объявляете ниже чем используете ее. 

Так же интересует зачем Вы
SymbolInfoInteger (т.е. тип данных который изначально int) переводите в double ? Он от этого все равно более точным не станет так как int обрезает все что после запятой идет. 


 
Andrey Azatskiy:

А у вас вообще все это дело компилится ? Вы переменную time_current объявляете ниже чем используете ее. 

Так же интересует зачем Вы
SymbolInfoInteger (т.е. тип данных который изначально int) переводите в double ? Он от этого все равно более точным не станет так как int обрезает все что после запятой идет. 


По поводу объявления переменной time_current вы правы - она у меня объявляется гораздо раньше, просто я много лишнего из кода, не относящегося к вопросу удалял, а затем не в то место поставил объявление переменной, когда писал пост.

По поводу  SymbolInfoInteger - я взял готовый фрагмент кода в выложенном на сайте индикаторе (сам еще только-только начал изучать mql).

 
Мне кажется, что я не правильно понимаю, как работает CopySpread - по этому и ошибка идет в результатах.
int Spread[];
if(CopySpread(Symbol(),Period(),start_time_extr_h24,time_current,Spread)==-1){}
int position_max_spread_h24=ArrayMaximum(Spread);
int spread_max_h24=Spread[position_max_spread_h24];
Этот фрагмент кода выдает мне сейчас значение по паре GBPUSD - 45
Однако я вижу сейчас цены Bid|Ask    1.30326|1.30406 т.е. спред равен 80
 
Еще заметил, что при изменении таймфрейма у меня так же меняется значение максимально спреда. Может моя функция получает значение спреда на момент закрытия предыдущего бара и по этому это значение при разных таймфреймах разное?
 

Есть подозрение, что CopySpread в моем случае вообще не подойдет, т.к. подставляет в массив только значения на момент открытия бара (сейчас прочитал в описании функции), а это не обязательно максимумы. Т.е. мне надо как-то по тикам получать значения. Если слишком большой объем данных - хотя бы не за 24 часа, а за час.
Или может быть есть более простое решение?

 
renatmt5:

Есть подозрение, что CopySpread в моем случае вообще не подойдет, т.к. подставляет в массив только значения на момент открытия бара (сейчас прочитал в описании функции), а это не обязательно максимумы. Т.е. мне надо как-то по тикам получать значения. Если слишком большой объем данных - хотя бы не за 24 часа, а за час.
Или может быть есть более простое решение?

Используйте CopyTicks - а там внутри каждой из структуры Вы найдёте бид и аск. Далее в цикле пройдитесь и вычислите массив Spread[]. Следующим шагом уже как ранее находите максимальное значение - в итоге получите желаемый результата. 
А что бы найти спред на текущий момент - используйте следующий механизм:

double spread = SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID);
 
Andrey Azatskiy:

Используйте CopyTicks - а там внутри каждой из структуры Вы найдёте бид и аск. Далее в цикле пройдитесь и вычислите массив Spread[]. Следующим шагом уже как ранее находите максимальное значение - в итоге получите желаемый результата. 
А что бы найти спред на текущий момент - используйте следующий механизм:

Андрей, спасибо!

 

Была ещё тема Как посчитать средний спред за определённый период?

там на второй странице  есть интересный код.

 
Vladimir Karputov:

Была ещё тема Как посчитать средний спред за определённый период?

там на второй странице  есть интересный код.

Владимир, приветствую! 
Спасибо, буду изучать

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