Написал на досуге по просьбе одного из участников смартлаба индикатор корреляции.
Индикатор простенький, считает коэффициент корреляции Пирсона
для двух выбранных инструментов на заданном таймфрейме.
Выкладываю исходный код. Может кому то пригодится.
Settings=
{
Name = "Piton",
N = 100,
legend = "price2",
line =
{
{ Name = "Sint",
Color = RGB(0, 132, 0),
Type = TYPE_LINE,
Width = 1
}
}
}
function Init()
return 1
end
Candles = {};
function OnCalculate(index)
local numCandles = getNumCandles(Settings.legend);
if index <= Settings.N or numCandles <= Settings.N then
return nil;
end
Candles, n, _ = getCandlesByIndex(Settings.legend, 0, index - Settings.N, Settings.N);
if n ~= Settings.N then
return nil;
end
-- Предварительный расчет
sum1, sum2, sum3 = advancePaynemt(index);
-- расчет коэффициента корреляции Пирсона
r = sum3/math.sqrt(sum1*sum2);
return r;
end
-- Предварительный расчет
----------------------------------------
function advancePaynemt(index)
local sum1 = 0;
local sum2 = 0;
local sum3 = 0;
local j = 0;
-- Вычислить среднее арифметическое
for i=index - Settings.N + 1, index, 1 do
sum1 = sum1 + C(i);
sum2 = sum2 + Candles[j].close;
j = j + 1;
end
aver1 = sum1/Settings.N;
aver2 = sum2/Settings.N;
-- Вычислить сумму квадратов отклонений
sum1 = 0;
sum2 = 0;
j = 0;
for i=index - Settings.N+1, index, 1 do
sum1 = sum1 + math.pow(C(i) - aver1, 2);
sum2 = sum2 + math.pow(Candles[j].close - aver2, 2);
j = j + 1;
end
-- Вычислить сумму произведений разности
j=0;
for i=index - Settings.N+1, index, 1 do
sum3 = sum3 + (aver1 - C(i))*(aver2 - Candles[j].close);
j = j + 1;
end
return sum1, sum2, sum3;
end
Как запустить и настроить:
Архив исходника на QLua: https://yadi.sk/d/OxDvAekV3PLn2z
А что за массив C(i)? Где он инициализируется?
PS. как напишите киньте сообщение в ЛС, если не затруднит
Интересно сравнить корреляции Si и фьючерсов компаний у которых выручка в баксах. Вполне возможно, что она будет сильнее.
Индикатор пишет ошибку в строке 53. Видимо, он не может найти C(i)
У вас судя по интерфейсу старенькая версия КВИКа. У меня 7.12. Возможно в новой версии надо что-то переписать в коде?
П.С. Странно. Проверил обе переменных C(i) и sum1. Все они имеют тип number.
это функция языка QLUA )) справку откройте, она есть в каталоге установленного терминала:
Я чуть сложнее получаю закрытия.
Тоже работает, как часы. Но, возьму на заметку более простой вариант! ))
Спасибо за индикатор!
Но я не могу его запустить — выходит ошибка «C:\QUIK\LuaIndicators\Piton.lua:65: attempt to call a nil value (field 'pow')»/
Менял значение N на 1, 2, 10, 50, 200, без результата.
Quik версии 9.7.1.10.
Сможете помочь?
Замените на
sum1 = sum1 + (C(i) — aver1)*(C(i) — aver1);
sum2 = sum2 + (Candles[j].close — aver2)*(Candles[j].close — aver2);
и все заработает. По крайней мере, у меня на 9.4.2.1 работает.
Удачной торговли!
Но ругается на 53 строку.