Хочу вывести усреднение по 2м последним позициям на графике, для проверки вывожу и сами позиции на экран, вроде бы все правильно выводится, но Квик ругается, что-то ему в моем коротком коде не понравилось, не могли бы пояснить что не так?
Код
Settings=
{
Name = "!!!Primer3",
period=5,
line=
{
{
Name = "High",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
},
{
Name = "Low",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0,255)
}
,
{
Name = "Low",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,255,0)
}
}
}
function Init()
return 3
end
function OnCalculate(index)
local high=0
local high1=0
local vrem=0
vrem=(H(index-1)+H(index-2))/2
high=H(index)
high1=H(index-1)
vrem=(high+high1)/2
return high , high1, vrem
end
Взгляните (визуально) на две первые свечки графика, Ваш индикатор на них не имеет значений. И QUIK Вас проинформировал об этом в окне сообщений - проблема в строчке 42
vrem=(H(index-1)+H(index-2))/2
\LuaIndicators\!!!Primer3.lua:42: attempt to perform arithmetic on a nil value
В первом варианте Вы пытались заглянуть в несуществующее прошлое, используя H(index-2) (для свечек с номером 1 и 2), а сейчас - в еще не существующее будущее, используя H(index+1) (для текущей свечки). Ошибка все та же, только на другом конце. Индикатор последовательно вызывается для свечек с номерами от 1 до текущей, появится следующая свечка - индикатор опять вызовут. Текущая свечка может меняться несколько раз, соответственно и индикатор вызовется несколько раз. В следующей версии вручную проверьте, какими данными пользуется Ваш индикатор и что он собирается выдавать для свечек с номерами (index) 1 и 2, а также для текущей свечки. Держите себя в рамках.
function OnCalculate(index)
high2=high1
high1=high
high=H(index)
if high1 and high2 then
vrem=(high1+high2)/2 --- или так vrem=(high+high1)/2
end
return high , high1, vrem
end
Борис Гудылин написал: появится следующая свечка - индикатор опять вызовут
Спасибо большое, из Вашего ответа получается, что при каждой новой свечке весь график перерисовывается заново? В штатном варианте на графике 1000 свечек, если я правильно помню документацию, и они заново каждый раз считываются и отрисовываются на графике?
Представьте, что на момент установки индикатора на графике уже есть 100 свечек. Индикатор после установки вызовется 100 раз (со значениями index на входе от 1 до 100), по каждому вызову для конкретного index вернет значения для отображения в позиции index. Для последней (текущей) свечки он может дополнительно вызваться несколько раз, поскольку эта свечка еще может меняться, соответственно и возвращаемые значения индикатора для этой свечки могут меняться. Появится новая свечка - индикатор будет вызываться для вычисления своих значений для этой позиции.
Возможно, у Вас появится необходимость перерисовывать значения Вашего индикатора на старых свечках - такая возможность есть, но пока освойте основы.
Осложнения. При добавлении или изменении какого-либо индикатора на диаграмме все индикаторы этой диаграммы будут пересчитаны (вызваны для всех свечек от первой до последней).
Когда-то при запуске QUIK на графике штатно оставляли 3000 свечек, в течение дня их количество могло увеличиться в зависимости от таймфрейма. Сейчас это ограничение увеличили до 64000 (пусть меня поправят, мне и 3000 много).
Борис Гудылин написал: Представьте, что на момент установки индикатора на графике уже есть 100 свечек. Индикатор после установки вызовется 100 раз (со значениями index на входе от 1 до 100)
Мне кажется это не верный алгоритм работы и он перегружает сервер, если конечно я Вас правильно понял. Вы имеете в виду, что мы включили комп и в текущей сессии уже за сегодняшний день прошло 100 свечек, но если это период дневной? Тогда должны выходить свечки не только текущей сессии, но и за несколько дней. По моему мнению, если стандартное количество свечек на графике 3000, то эти 3 тысячи и должны сразу выйти и не по одной. А сразу все. Поясню. На сервере скорее всего база данных SQL или какая то аналогичная быстродействующая бд, когда мы из меню выбираем график по какой то бумаге, то в зависимости от выбранных полей выполняется select запрос, и на стороне сервера открывается форма с нашим графиком (или локально на своем компе, это я еще пока тоже не понял) и данные, полученные таблично по запросу выводятся на график и каждая новая свеча должна по идее просто добавляться в локальную таблицу, как еще одна строка таблицы бд. А график, в зависимости от выбранного периода будет просто перерисовываться на нашем экране. Самый короткий период свечей, это минутный, поэтому для минутного графика перерисовка должна быть один раз в минуту. Для других периодов может быть реже, но меньше времени периода, так как на графике бывает видно как свеча растет или уменьшается.
А теперь еще спрошу про графики, вот с вашей помощью подправил код и посчитал усреднение вперед и назад, и вывел на график сразу эти два индикатора. Получилась интересная картинка по определению "начала тренда" . На графике явный пик, но усреднение вперед очень хорошо показало начало тренда, хотя реальные данные еще на график не пришли, и на (тот текущий момент), этого входа в тренд не было бы видно.Это начало "входа в тренд" можно увидеть только я думаю на исторических данных или я не прав?
Код
-- расчет вперед
function OnCalculate(index)
local high=0
local high3=0
high13=H(index+20)
if high13 then
for i1=0,20 do
high=high+H(index+i1)
end;
for i2=0,4 do
high3=high3+H(index+i2)
end;
high1=high/21
high2=high3/5
end;
return high1, high2
end
--===========================расчет назад
function OnCalculate(index)
local high=0
local high3=0
high13=H(index-20)
if high13 then
for i1=0,20 do
high=high+H(index-i1)
end;
for i2=0,4 do
high3=high3+H(index-i2)
end;
high1=high/21 --красная
high2=high3/5 --зеленая
end;
return high1, high2
end
Борис Гудылин написал: А заглядывать в несуществующее будущее или несуществующее прошлое - тяжкий грех.
спасибо за ответ, я попробую завтра протестировать ваш код, про грех давайте не будем, нам сметным не дано судить никого. А что бы не гадать, подскажите пож. как мне вывести график на моем примере только до импульса цены,? Как то кодом можно задать количество индексов, что бы сымитировать, что было с индикаторами на момент поступления на графике этих двух зеленых импульсов. (хотя если знать какой это номер индекса по порядку, то я могу остановить наверно график цены через IF, но тогда как узнать какой там был номер индекса?)
Борис Гудылин написал: А гадать нет смысла. Надо вставить отладочную выдачу поступившего на вход индикатора номера свечки, для которой надо выполнить расчет индикатора
Хотя вот тут Вы мне кажется как раз это и написали, я наверно просто не понял как это сделать?
Обратили внимание, что Ваш впередсмотрящий индикатор заморозил свои показания на последних 20 свечках? Найдите ошибку в коде. Намек: некоторые переменные идут у Вас как глобальные и Вы ими фактически пользуетесь, хотя и есть отсекающая проверка if high13 then
Добавьте else для этой проверки ... high1=high/21 high2=high3/5 else return nil, nil end; return high1, high2 end
Информация к размышлению для тех кто изобретает грааль. Свеча - это индикатор, который на графике строится как бы с заглядыванием вперед. поэтому на истории легко строить и обнаружители трендов и прибыльные стратегии, особенно используя индикаторы заглядывающие вперед. К таким индикаторам относятся зигзак и фрактал. поэтому не надо от скользящей средней или от арифметического среднего ждать чудес. Это самые простейшие цифровые фильтры с очень плохими фильтрующими свойствами. ------------------------- Умным -горе от ума, глупым - радость от безумья.
Борис Гудылин написал: Обратили внимание, что Ваш впередсмотрящий индикатор заморозил свои показания на последних 20 свечках?
Конечно он по идее их не должен пропустить так условие у меня грубое, но я не заметил, не знаю как замечать, они же (свечки) не подписаны, где какая. за код спасибо сейчас попробую подправить
Николай Камынин написал: Свеча - это индикатор, который на графике строится как бы с заглядыванием вперед.
свеча же не индикатор, это просто удобная форма текущей позиции цены в каждый конкретный момент времени, для визуального анализа цены на графике. Индикатор я так понимаю, это как раз средние, которые что то показывают и даже как то работают, но я пока еще не понял как
Нет, это индикатор - программа, которой на вход подается номер свечки, а она, пользуясь информацией об этой свечке и всех предшествующих, вычисляет какие-то значения и возвращает их QUIK'у для вывода на график в позиции поданной свечки. Обычно отображаются линиями, но есть и другие варианты. И индикатор вовсе не обязан пользоваться механизмом плавающего окна, как у скользящих средних.
В этом смысле мой индикатор не отличается от Вашего, только математика в нем сложная.
Другой тип пользовательских программ в QUIK - скрипты, выполняют функции роботов, реализующих определенные торговые стратегии. Они тоже имеют доступ и могут анализировать свечки от первой до текущей, также имеют доступ ко многим таблицам QUIK. Они выдают торговые операции и отслеживают их прохождение, работают в темную, Могут выводить какие-то данные в таблицы на экран и что-то получать в ответ. Это - по минимуму.
Вот еще пример того же неотстающего индикатора (на соответствие противоположных экстремумов заданному начальному экстремуму).
P.S. Последние 20 свечек находятся на правом конце графика, зачем Вам их номера?
Борис Гудылин написал: Последние 20 свечек находятся на правом конце графика, зачем Вам их номера?
не знаю зачем, просто думаю будет более наглядно с номерами, когда видно номер индекса над свечей, картинка станет более понятная (более реалистичная) мне кажется, хотя может они и не нужны...
Борис Гудылин написал: Вот еще пример того же неотстающего индикатора
картинка интересная, если верить красным вертикальным линиям, но по ней трудно сделать какие либо выводы, только одно значение индикатора более менее понятно в районе 4 сентября, что было дальше картинка скрывает, а предыдущие индикаторы не полные, видно только с каким примерно отставанием они строятся. Положу Ваш график в копилку чужого опыта, спасибо, может быть потом пригодится. Мне пока еще многое непонятно, например как считается прибыль, пусть даже взять Ваш индикатор и взять разницу в чистом виде по вашим красным вертикальным линиям 1350 - 1130, это хорошая прибыль может быть?