Написал простой код, что не так?

Страницы: 1
RSS
Написал простой код, что не так?
 
Хочу вывести усреднение по 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
человек (не робот)
 
Всегда при программировании учитывайте граничные условия.
Что такое index-2 для начальной свечки в OnCalculate (ее индекс равен 1)?  
 
Взгляните (визуально) на две первые свечки графика, Ваш индикатор на них не имеет значений.
И QUIK Вас проинформировал об этом в окне сообщений - проблема в строчке 42

     vrem=(H(index-1)+H(index-2))/2

\LuaIndicators\!!!Primer3.lua:42: attempt to perform arithmetic on a nil value
 
Цитата
Борис Гудылин написал:
Что такое index-2 для начальной свечки в OnCalculate (
Спасибо, попробую исправить
человек (не робот)
 
Код
function OnCalculate(index)
   local high=0
   local high1=0
   local vrem=0
   
      
      high=H(index)
      high1=H(index+1)
      vrem=(high+high1)/2
      
      
   return high , high1, vrem
end
так ошибку не выдает, просто не выводит последнее значение
человек (не робот)
 
В первом варианте Вы пытались заглянуть в несуществующее прошлое, используя 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

человек (не робот)
 
Вас устроит мой ответ, если 100 заменить на 3000 (минут, часов или дней)? Замените и перечитайте его еще раз..

А гадать нет смысла. Надо вставить отладочную выдачу поступившего на вход индикатора номера свечки, для которой надо выполнить расчет индикатора

function OnCalculate(index)
message("!!!Primer3 - " .. tostring(index), 1)

Увидите, сколько раз вызывается Ваш индикатор и с какими номерами свечек.

А заглядывать в несуществующее будущее  или несуществующее прошлое - тяжкий грех.
 
Цитата
Борис Гудылин написал:
А заглядывать в несуществующее будущее  или несуществующее прошлое - тяжкий грех.
спасибо за ответ, я попробую завтра протестировать ваш код, про грех давайте не будем, нам сметным не дано судить никого. А что бы не гадать, подскажите пож. как мне вывести график на моем примере только до импульса цены,? Как то кодом можно задать количество индексов, что бы сымитировать, что было с индикаторами на момент поступления на графике этих двух зеленых импульсов. (хотя если знать какой это номер индекса по порядку, то я могу остановить наверно график цены через IF, но тогда как узнать какой там был номер индекса?)
человек (не робот)
 
Цитата
Борис Гудылин написал:
А гадать нет смысла. Надо вставить отладочную выдачу поступившего на вход индикатора номера свечки, для которой надо выполнить расчет индикатора
Хотя вот тут Вы мне кажется как раз это и написали, я наверно просто не понял как это сделать?  
человек (не робот)
 
Попробую завтра, спасибо.
человек (не робот)
 
Построить неотстающий индикатор, синхронно чувствующий экстремумы - можно, но задача эта сложна.
[img]file:///C:/GBP-3.png[/img]
 
Попытка 2.
 
А десятью свечками ранее это выглядело так.
 
Обратили внимание, что Ваш впередсмотрящий индикатор заморозил свои показания на последних 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, это хорошая прибыль может быть?
человек (не робот)
Страницы: 1
Читают тему
Наверх