Блог им. Karim
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
Как запустить и настроить:
А что за массив 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 строку.