Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 2064

 
Aleksey Nikolayev:

Да, так правильно. Заводим два архива - вещественный и целый размером 1440=24*60. В первом суммируем квадраты приращений, а во втором - число баров для данной минуты, а потом делим первый на второй (для номеров с кол-м баров больше 1). Потом извлекаем корень и лишь затем перенормируем приращения и собираем из них куммулятивную сумму - новый ряд, который уже и исследуем на отличие от СБ.

т.е. среднее квадратичное из минуток для 24 часов, и так для 2х месяцев минуток. Номер бара минутки? Сумму квадратов делим на 1440?

 
Valeriy Yastremskiy:

 Сумму квадратов делим на 1440?


Сумму квадратов делишь на количество баров для конкретной минутки, а потом извлекаешь корень.

 
Aleksey Nikolayev:

Да, так правильно. Заводим два архива - вещественный и целый размером 1440=24*60.


т.е. нужно построить кум. сумму за сутки = 1440 минут?

 
Evgeniy Chumakov:


Сумму квадратов делишь на количество баров для конкретной минутки, а потом извлекаешь корень.

Тогда не понял. Для глубины бара 3 количество  будет три, и это значение вычисляем для 3го бара или для первого.  Я так понимаю что бы было ровно среднее должно вычисляться для одинакового количества баров, а не нарастающим итогом. Лучше сразу формулу было дать. Слова мы все понимаем по разному.)

for(int i = 1,i<= 1440, i++);
{
Di+=pow((iClose(NULL,1,i) - iOpen(NULL,1,i)),2)/i ;
di=sqrt(Di);
DVal[i]=(iClose(NULL,1,i) - iOpen(NULL,1,i)/di; 
}

По мне так не верно.

 
Valeriy Yastremskiy:


По мне так не верно.


код не правильный

 

Если предположить, что нет пробелов в истории и во всех сутках 1440 минуток (в пятницу меньше) то код должен быть такой:

double di = 0;

int n = 40; // глубина 40 суток (два месяца)

int pos = 0; // текущий бар

int step = 0; // шаг


for(int i = 0; i < n; i++){

di += MathPow( close[pos + step] - open[pos + step],2);

step += 1440;
}

di = MathSqrt(di/n);

double x = (close[pos] - open[pos])/di;
 
Evgeniy Chumakov:

Если предположить, что нет пробелов в истории и во всех сутках 1440 минуток (в пятницу меньше) то код должен быть такой:

Пробелы бывают даже на eurusd. Работайте со временем бара
 
elibrarius:
Пробелы бывают даже на eurusd. Работайте со временем бара


Это понятно, если бы делал, то так и поступил бы. Это я просто чтобы проще объяснить.

 

Как-то так, вроде работает) Для экономии новый ряд собирается в rates[i].high

#property script_show_inputs
//+------------------------------------------------------------------+
input datetime tstart = D'2020.5.1 00:00';  // начало промежутка исследуемого времени
input datetime tstop = D'2020.10.1 00:00';   // конец промежутка исследуемого времени
string zztn = "dvol\\" + _Symbol + ".txt"; // text file name
//+------------------------------------------------------------------+
#define NM 1440
ulong NSM = 60;
ulong NSD = 60 * 1440;
//+------------------------------------------------------------------+
void OnStart()
{
  MqlRates rates[];
  double vol[NM] = {0.0}, d;
  int n[NM] = {0}, t;
  int nprice = CopyRates(Symbol(), PERIOD_M1, tstart, tstop, rates);
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    d = rates[i].close - rates[i].open;
    ++n[t];
    vol[t] += d * d;
  }
  for(int i = 0; i < NM; ++i)
  {
    if(n[i] > 1) vol[i] /= n[i];
    vol[i] = sqrt(vol[i]);
  }
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    if(vol[t] > 0) rates[i].high = (rates[i].close - rates[i].open) / vol[t];
    if(i > 0) rates[i].high += rates[i - 1].high;
  }
  int ft = FileOpen(zztn, FILE_WRITE | FILE_COMMON | FILE_ANSI | FILE_TXT);
  FileWriteString(ft, "t p");
  for(int i = 0; i < nprice; ++i)
    FileWriteString(ft, "\n" + (string)((ulong)rates[i].time) + " "  + (string)rates[i].high);
  FileClose(ft);
}
 
Aleksey Nikolayev:

Как-то так, вроде работает) Для экономии новый ряд собирается в rates[i].high

Вы прошлые бары, например от 2020.5.1 00:00 нормируете по барам из будущего, c  2020.10.1 00:00 и теми что между ними.
В реале вы этого не сделаете.
Надо от каждого бара делать примерно такой же расчет, но только от прошлых для него баров.