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

 

Всем привет!

Мне необходимо получить усреднённый спред за определёное кол-во баров в истории.

Чувствую, что несовсем правильно написал :)

Первая функция - копируем спред согласно переменной Spread_Filter_Bars - с 1000 баров в истории.

Вторая, по идее, должна усреднить все "спреды".

Подскажите пожалуйста, правильный ли мой код?

Заранее спасибо!


input int Spread_Filter_Bars = 1000;
int SpreadBuffer[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void FirstTime_Spread()
{
int spreads = CopySpread(_Symbol,_Period,0,Spread_Filter_Bars,SpreadBuffer);
if (spreads < 0)
   {
   Print("Falied to copy data from Spread!"," ",__FUNCTION__);
   return;
   }
else Print("Spread data successfuly copied.");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CalcSpread()
{
double avgspread = 0.00000000;
int cnt=0;
for(int i=0;i<Spread_Filter_Bars;i++)
   {
   avgspread += SpreadBuffer[i];// / Spread_Filter_Bars * _Point;
   }

return(avgspread/Spread_Filter_Bars*_Digits*_Point);
}
 
Обязательно запустите код в двух режимах: "Все тики" и "Каждый тик на основе реальных тиков". 
 
Vladimir Karputov:
Обязательно запустите код в двух режимах: "Все тики" и "Каждый тик на основе реальных тиков". 
Цифру то функция выдает. Только я не уверен, что правильную. Вернее уверен, что неправильную :))
 
PavelMSK:
Цифру то функция выдает. Только я не уверен, что правильную. Вернее уверен, что неправильную :))

Хорошо, зайду с другой стороны. Запросите спред за 30 баров или за 50. И просто распечатайте полученный массив (ArrayPrint). Сравните запуск в режиме "Все тики" и "Каждый тик на основе реальных тиков". 

 
Vladimir Karputov:

Хорошо, зайду с другой стороны. Запросите спред за 30 баров или за 50. И просто распечатайте полученный массив (ArrayPrint). Сравните запуск в режиме "Все тики" и "Каждый тик на основе реальных тиков". 

Спасибо!

Буду пробовать. 

Может проверите все-таки мою функцию CalcSpread() плиззззз? Я пол дня убил. Очень прошу. 

 
PavelMSK:

Всем привет!

Мне необходимо получить усреднённый спред за определёное кол-во баров в истории.

Чувствую, что несовсем правильно написал :)

Первая функция - копируем спред согласно переменной Spread_Filter_Bars - с 1000 баров в истории.

Вторая, по идее, должна усреднить все "спреды".

Подскажите пожалуйста, правильный ли мой код?

Заранее спасибо!


Функция CopySpread возвращает минимальные спреды за бар. Следовательно таким образом вы можете посчитать только средний среди минимальных...
 
Alexey Viktorov:
Функция CopySpread возвращает минимальные спреды за бар. Следовательно таким образом вы можете посчитать только средний среди минимальных...

Вы ошибаетесь. Указанная Вами функция возвращает спреды, но не минимальные и не максимальные.

В любом случае я разобрался. К сожалению помощи тут не получил.

Вот "правильная" функция, может кому пригодится. Возможно она непрофессионально написана, но свою функцию выполняет.

double CalcSpread()
{
double avgspread = 0.000000000000001;
for(int i=0;i<Spread_Filter_Bars && !IsStopped();i++)
   {
   avgspread += SpreadBuffer[i];
   }
return(NormalizeDouble(avgspread/Spread_Filter_Bars*_Point,_Digits));
}
 
Vladimir Karputov:

Хорошо, зайду с другой стороны. Запросите спред за 30 баров или за 50. И просто распечатайте полученный массив (ArrayPrint). Сравните запуск в режиме "Все тики" и "Каждый тик на основе реальных тиков". 

CI      0       20:37:50.788    Core 1  EURUSD,M1 (Alpari-MT5-Demo): every tick generating
HN      0       20:37:50.788    Core 1  EURUSD,M1: testing of Experts\Test1.ex5 from 2018.11.01 00:00 to 2019.02.01 00:00 started
CL      0       20:37:50.788    Core 1  final balance 10000.00 USD
RN      0       20:37:50.788    Core 1  2019.01.31 23:59:59    3  3  3  4  4  4  5  4  4  4  4  4  5  4  4  4  4  4  4  4  4  4  4  4  5  4  4  4  4  4  4  4  4  4  4  4  5  5  5  5  5  5  6  5  6  6 21 22 19 19
PL      0       20:38:01.889    Core 1  EURUSD,M1 (Alpari-MT5-Demo): generating based on real ticks
MI      0       20:38:01.889    Core 1  EURUSD,M1: testing of Experts\Test1.ex5 from 2018.11.01 00:00 to 2019.02.01 00:00 started
GJ      3       20:38:01.889    Core 1  EURUSD : 2018.11.21 23:59 - 9 tick prices mismatch for 6 minute bars
EF      3       20:38:01.889    Core 1  EURUSD : 2018.12.24 23:59 - real ticks absent for 4 minutes out of 1257 total minute bars within a day
PF      3       20:38:01.889    Core 1  EURUSD : 2018.12.24 23:59 - 1 tick prices mismatch for 1 minute bars
KN      0       20:38:01.889    Core 1  EURUSD : real ticks begin from 2018.09.03 00:00:00
MJ      3       20:38:01.889    Core 1  EURUSD : 2018.11.01 00:00 - 2019.02.01 00:00  real ticks absent for 4 minutes of 91006 total minute bars, every tick generation used
FQ      3       20:38:01.889    Core 1  EURUSD : 2018.11.01 00:00 - 2019.02.01 00:00  tick prices of 10 ticks not matched for 7 minute bars
QR      3       20:38:01.889    Core 1  EURUSD : 2018.11.01 00:00 - 2019.02.01 00:00  last prices absent for 1253 minute bars, bid prices used
HQ      3       20:38:01.889    Core 1  EURUSD : 2018.11.01 00:00 - 2019.02.01 00:00  last prices absent for 2 whole days, bars built by bid prices
RN      0       20:38:01.889    Core 1  final balance 10000.00 USD
PI      0       20:38:01.889    Core 1  2019.01.31 23:59:58    3  3  3  4  4  4  5  4  4  4  4  4  5  4  4  4  4  4  4  4  4  4  4  4  5  4  4  4  4  4  4  4  4  4  4  4  5  5  5  5  5  5  6  5  6  6 21 22 19 19
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
  
void OnDeinit(const int reason)
  {
   int sp[];
   CopySpread(_Symbol,_Period,1,50,sp);
   ArrayPrint(sp);
  }
 
PavelMSK:

Вы ошибаетесь. Указанная Вами функция возвращает спреды, но не минимальные и не максимальные.

В любом случае я разобрался. К сожалению помощи тут не получил.

Вот "правильная" функция, может кому пригодится. Возможно она непрофессионально написана, но свою функцию выполняет.

Я не имею права мешать вам заблуждаться.

 
Ilya Malev:
Отлично, а теперь последний шаг: для бара где спред 19 или 21 выполните 

CopyTicks (в этот раз только в режиме «Реальные тики», это важно) и распечатайте максимальный и минимальный спред в полученном массиве.

 
Vladimir Karputov:
Отлично, а теперь последний шаг: для бара где спред 19 или 21 выполните 

CopyTicks (в этот раз только в режиме «Реальные тики», это важно) и распечатайте максимальный и минимальный спред в полученном массиве.

Может Вам сразу код отправить, который спреды на минутных барах делает такими, какими они и должны быть? :) Мне не сложно.