![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Возьмите ф-лу корреляции 2-х рядов из любого справочника и посчитайте. Один ряд - исходная цена, второй - любые ваши перестановки/взвеси/выборки/данные.
Не надо увечить индикатор который (на самом деле) считает AKF
Очень круто! А как мне сделать такую последовательность? В ней нет интервала. 1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1
я написал принцип, в коде это работать не будет т.к. надо под интервал дорабатывать другие штрихи :)
- - -
вообще для произвольных индексов проще забирать в массив максимальное количество значений (максимальное по номеру свечи), а затем выбирать из массива конкретные значения по индексам.
допустим, свою последовательность оформляете в строку, строку в массив и этот массив используете в цикле. Либо создаете двумерный массив, значения в который вносите по строковому массиву. Вариантов масса
вот всё верно и огород городить не надо
Насчет огорода не знаю. Но вот обычный онлайн калькулятор Пирсона
https://planetcalc.ru/527/
Любую последовательность считает
Насчет огорода не знаю. Но вот обычный онлайн калькулятор Пирсона
про огород - это шутка на самом деле (без обид)
я понял идею, проблем особых нет с просчетом любой последовательности в индикаторе
Категорически всех приветствую! Заинтересовался темой корреляции, дошел до Индикатора по Пирсону, в статье на этом сайте. Есть пару идей, но как реализовать не знаю. В индикаторе есть показатель Range. Как я понял это , грубо говоря, 1,2,3,4...20. По свечам от текущей. Как сделать, чтобы я мог менять набор цифр. например, я хочу сравнивать с 8,7,6,5,4...
Решение задачи может быть таким.
Вносим изменения в коде в секциях:
Публикую секции целиком. Изменения все комментированные, либо снабжены такими загогулинами: //<--------
//+----------------------------------------------+
//| 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);
}
Таким образом в начальных параметрах, через запятую, можно указывать любые индексы баров, в любой последовательности и в любом количестве.
Ну и по-хорошему в код надо бы добавить защиты "от дурака" – проверки, например, что в строке указаны именно цифры, а не знаки или буквы. Но не обязательно, если знаешь для чего используешь индикатор.