Нетривиальная задача по Пирсону - страница 2

 

Возьмите ф-лу корреляции 2-х рядов из любого справочника и посчитайте.  Один ряд - исходная цена, второй - любые ваши перестановки/взвеси/выборки/данные. 

Не надо увечить индикатор который (на самом деле) считает AKF 

 
megaman324 #:

Очень круто! А как мне сделать такую последовательность? В ней нет интервала. 1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1

я написал принцип, в коде это работать не будет т.к. надо под интервал дорабатывать другие штрихи :)
- - -

вообще для произвольных индексов проще забирать в массив максимальное количество значений (максимальное по номеру свечи), а затем выбирать из массива конкретные значения по индексам.
допустим, свою последовательность оформляете в строку, строку в массив и этот массив используете в цикле. Либо создаете двумерный массив, значения в который вносите по строковому массиву. Вариантов масса

 
В принципе, картинка неплохая получается :)))

 
Victor Golovkov #:

вот всё верно и огород городить не надо 

Насчет огорода не знаю. Но вот обычный онлайн калькулятор Пирсона

https://planetcalc.ru/527/

Любую последовательность считает

Онлайн калькулятор: Коэффициент корреляции Пирсона
  • Timur : пользователь planetcalc
  • planetcalc.ru
Расчет коэффициента корреляции двух случайных величин.
 
megaman324 #:

Насчет огорода не знаю. Но вот обычный онлайн калькулятор Пирсона

про огород - это шутка на самом деле (без обид)

я понял идею, проблем особых нет с просчетом любой последовательности в индикаторе

 
megaman324:
Категорически всех приветствую! Заинтересовался темой корреляции, дошел до Индикатора по Пирсону, в статье на этом сайте. Есть пару идей, но как реализовать не знаю. В индикаторе есть показатель Range. Как я понял это , грубо говоря, 1,2,3,4...20. По свечам от текущей. Как сделать, чтобы я мог менять набор цифр. например, я хочу сравнивать с 8,7,6,5,4...

Решение задачи может быть таким.

Вносим изменения в коде в секциях:

  • Indicator input parameters
  • Custom indicator initialization function 
  • Custom indicator iteration function

Публикую секции целиком. Изменения все комментированные, либо снабжены такими загогулинами: //<--------

//+----------------------------------------------+

//|  Indicator input parameters                  |

//+----------------------------------------------+

input string str = "1,2,3,4";//индексы баров для расчета

//----

double ExtLineBuffer[],PriceInt[];

string sep=",";// разделитель в виде символа по которому выбираем подстроки из входной строки

ushort u_sep;//переменная для кода символа разделителя 

string sP[];//массив для выбранных строк 

int numb[]; //массив для хранения индексов в виде чисел преобразованных из сторки во входных параметров

int maxIndex; // переменная для хранения максимального индекса

int sizeString; // переменная для хранения количества баров

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

  u_sep=StringGetCharacter(sep,0);//получаем код разделителя

  StringSplit(str,u_sep,sP);// преобразуем строку в массив

  sizeString=ArraySize(sP);//определяем размер массива

  ArrayResize(numb,sizeString);//устанавливаем размер массива для хранения индексов в виде чисел

  for(int i=0; i<sizeString; i++)numb[i]=(int)StringToInteger(sP[i]); //заполняем массив индексами из массива подстрок

  maxIndex=numb[ArrayMaximum(numb,0,WHOLE_ARRAY)];//максимальный индекс бара для расчета

//----

   ArrayResize(PriceInt,sizeString);//<--------

   ArrayInitialize(PriceInt,0.0);

   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);

//---- performing the shift of beginning of the indicator drawing

  PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,sizeString);//<--------

//---- indexing elements in the buffer as timeseries

   ArraySetAsSeries(ExtLineBuffer,true);

//---- determination of accuracy of displaying the indicator values

   IndicatorSetInteger(INDICATOR_DIGITS,2);

//---- restriction to draw empty values for the indicator

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,    // number of bars in history at the current tick

                const int prev_calculated,// number of bars calculated at previous call

                const int begin,          // bars reliable counting beginning index

                const double &price[]

                )

  {

   //----Определяем необходимое количество баров на графике для расчета 

   int barCalc;

   if(maxIndex<sizeString)barCalc=sizeString;

   else barCalc=maxIndex;

   //----     

   if(rates_total<barCalc+begin)//<--------

      return(0);

   int limit;

   if(prev_calculated>rates_total || prev_calculated<=0)

     {

      limit=rates_total-2-barCalc-begin;//<--------

      if(begin>0)

         PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,sizeString+begin);//<--------

     }

   else

   limit=rates_total-prev_calculated;

   ArraySetAsSeries(price,true);

   for(int i=0; i<=limit; i++)

     {

      for(int k=0; k<sizeString; k++) {//<--------

      int indx=numb[k]-1;//присваиваем переменной значения из массива индексов

      PriceInt[k]=price[indx+i];//берем цены для расчета

      }

      ExtLineBuffer[i]=PearsonCalc(PriceInt,sizeString);//<--------

     }

   return(rates_total);

  }

Таким образом в начальных параметрах, через запятую, можно указывать любые индексы баров, в любой последовательности и в любом количестве.

Ну и по-хорошему в код надо бы добавить защиты "от дурака" – проверки, например, что в строке указаны именно цифры, а не знаки или буквы. Но не обязательно, если знаешь для чего используешь индикатор.