Создание собственных индикаторов

Страницы: 1
RSS
Создание собственных индикаторов
 
Здравствуйте!
Решил попрактиковаться в самостоятельном написании индикаторов технического анализа, но понял, что плохо себе представляю как работает функция OnCalculate.
Как я понял, именно она отвечает за установку значений на индикатор.
Пытаюсь сделать так, чтобы индикатор ставил точки в зависимости от определенных условий (например, пересечения скользящих средних)

График типа TYPE_POINT.
Однако, количество точек четко совпадает с количеством свечей (и их координаты Х соответстенно), а по ординате все точки принимают одно и то же значение.

Где я фундаментально заблуждаюсь?
Код
function OnCalculate()
local short_pos=false;
   local long_pos=false;
   
   N1=getNumCandles("MVAs")
   for v=2,N1,1 do
   t=getCandlesByIndex("MVAs",0,v,1)[0]; 
   t1=getCandlesByIndex("MVAs",0, v-1, 1)[0].close;
   t2=getCandlesByIndex("MVAl",0, v-1, 1)[0].close;
   t11=getCandlesByIndex("MVAs",0, v-2, 1)[0].close;
   t22=getCandlesByIndex("MVAl",0, v-2, 1)[0].close;
   if (t1>t2) and (t11<t22) then --короткая пересекает длинную снизу вверх
   if (short_pos==false) then    --если не в позиции то
      long_pos=true;         --открываем длинную позицию   (покупка)
      return t.open;
      else               --иначе
      short_pos=false;      --закрываем короткую позицию
      return t.open;   
      end
   else
if (t1<t2) and (t11>t22) then --короткая пересекает длинную сверху вниз
   if (long_pos==false) then --если не в позиции то открываем короткую
      short_pos=true;   
      return t.open;
      else         --иначе
      long_pos=false; --закрывается длинная позиция
      return t.open;   --производим продажу; длинна позиция закрыта.
      end
   end
   end
end
end
 
Для начала - Вы игнорируете то, что у функции OnCalculate есть аргумент (номер свечи). Именно для этой свечки Вы и должны посчитать и вернуть значение индикатора.

Ваш индикатор последовательно вызовут для первой свечки, для второй и т.д. Для текущей свечки индикатор может вызываться много раз, она же меняется.  

 
Цитата
Борис Гудылин написал:
Для начала - Вы игнорируете то, что у функции OnCalculate есть аргумент (номер свечи). Именно для этой свечки Вы и должны посчитать и вернуть значение индикатора.

Ваш индикатор последовательно вызовут для первой свечки, для второй и т.д. Для текущей свечки индикатор может вызываться много раз, она же меняется.  
Т.е. мне следует в функции OnInit() через условия пересечения средних определять номера нужных свечей, и затем вызвать OnCalculate с этими номерами, где и вернуть значение?
 
Вы просили фундаментальные заблуждения.
К вышеперечисленным добавлю еще.
Callback OnInit к индикаторам отношения не имеет. Вы же об индикаторах спрашивали, а не о скриптах (как о прообразе робота).
В индикаторах есть функция Init, с ее помощью при инициализации индикатора Вы вернете в Quik число - количество линий, которые будет строить Ваш индикатор. Этой функции у Вас нет.
OnCalculate(index) вызывается не Вами, ее вызывет QUIK, подключая ее в момент передачи Вам очередной свечки из истории или при обновлении текущей свечки.
По факту, у Вас получилось, что при каждом вызове OnCalculate с передачей Вам номера очередной свечи Вы выполняете практически одни и те же вычисления, игнорируя номер свечи, что и объясняет однообразие значений по ординатам.

Похоже, у Вас нет четкого разделения между понятиями "индикатор" и "скрипт".
Индикатор -"рисует" на графике (QUIK нарисует то значение, которое Вы вернете для поданного номера свечки).
Скрипты - работают "втемную", обычно занимаются обсчетом и торговыми операциями.

Начните с реализации какого-нибудь простейшего индикатора, упростите то, что есть в документации, пусть. например, выведет (вернет в QUIK) значение номера поданной свечи. Так легче прочувствовать суть индикатора.
     
 
Большое спасибо за подсказки, разобрался, реализовал задуманное)
Страницы: 1
Читают тему
Наверх