getCandlesByIndex в индикаторе

Страницы: 1
RSS
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
Я хочу строить индикатор по нескольким источникам данных, но столкнулся с проблемой работы функции getCandlesByIndex.
getCandlesByIndex плохо работает при смене таймфрейма и инструмента(особенно при смене инструмента), значения цены high для одного из значений по крайней мере для первых и последних 3 свечей равно 0. Однако если переставить индикатор на график, все работает как положено. Как мне добиться того чтобы при смене таймфрейма и инструмента все работало хорошо? Для работы примера нужно наcтроить график фьючерса RIU2, вывести суммарный спрос и суммарное предложение и присвоить им на вкладке "дополнительно"соотвествующие индентификаторы "volumeBid" и "volumeAsk" соответственно
 
Код
Settings = {}
Settings.Name = '*Example'
Settings.line = 
{
    {
    Name = "Example",
    Color = RGB(0, 0, 0),
    Type = TYPE_LINE,
    Width = 2   
    }
}

local volumeBidCandles
local volumeAskCandles
local volumeBidPrice, volumeBidN, volumeBidName
local volumeAskPrice, volumeAskN, volumeAskName

function OnChangeSettings()

   message(
   "Изменились настройки: "   
   )

   Init()   

end


function Init()

   volumeBidCandles=0
   volumeAskCandles=0
      
   volumeBidN=0
   volumeAskN=0
      
   volumeBidPrice=nil
   volumeAskPrice=nil
        volumeBidCandles = getNumCandles("volumeBid")
   volumeAskCandles = getNumCandles("volumeAsk")
   
   
   
   volumeBidPrice, volumeBidN, volumeBidName=getCandlesByIndex("volumeBid", 0, 0, math.min(volumeBidCandles,volumeAskCandles))
   volumeAskPrice, volumeAskN, volumeAskName=getCandlesByIndex("volumeAsk", 0, 0, math.min(volumeBidCandles,volumeAskCandles))
   
   message(
   "Init: "   
   )
      

    return 1
   
end
 
function OnCalculate(index)

   if index==1 then

      Init()
   

      message(         
         "#volumeBidPrice " .. tostring(#volumeBidPrice).. "; \n"
         ..
         "#volumeAskPrice " .. tostring(#volumeAskPrice).. "; \n"
         ..
         "volumeBidPrice[volumeBidN-3].high " .. tostring(volumeBidPrice[volumeBidN-3].high).. "; \n"
         ..
         "volumeBidPrice[volumeBidN-2].high " .. tostring(volumeBidPrice[volumeBidN-2].high).. "; \n"
         ..
         "volumeBidPrice[volumeBidN-1].high " .. tostring(volumeBidPrice[volumeBidN-1].high).. "; \n"
         ..
         "volumeBidPrice[0].high " .. tostring(volumeBidPrice[0].high).. "; \n"
         ..
         "volumeBidPrice[1].high " .. tostring(volumeBidPrice[1].high).. "; \n"
         ..
         "volumeBidPrice[2].high " .. tostring(volumeBidPrice[2].high).. "; \n"
         ..
         "volumeAskPrice[volumeAskN-3].high " .. tostring(volumeAskPrice[volumeAskN-3].high).. "; \n"
         ..
         "volumeAskPrice[volumeAskN-2].high " .. tostring(volumeAskPrice[volumeAskN-2].high).. "; \n"
         ..
         "volumeAskPrice[volumeAskN-1].high " .. tostring(volumeAskPrice[volumeAskN-1].high).. "; \n"
         ..
         "volumeAskPrice[0].high " .. tostring(volumeAskPrice[0].high).. "; \n"
         ..
         "volumeAskPrice[1].high " .. tostring(volumeAskPrice[1].high).. "; \n"
         ..
         "volumeAskPrice[2].high " .. tostring(volumeAskPrice[2].high).. "; \n"
         )
   end   
   return 1
end
 
Здравствуйте.

Вероятнее всего проблема в том, что данных для этих свечей не существует.
Дело в том, что у всех индикаторов в одном окне диаграммы имеется общее пространство позиций для свечек с единой сплошной нумерацией без пропусков.
Как раз это пространство и используется в getCandlesByIndex, getNumCandles. Функция CandleExist позволяет проверить существует ли свечка для конкретного инструмента.

Если Вы построите графики в разных окнах, то Ваш пример будет работать корректно.
 
Цитата
Alexey Danin написал:
Дело в том, что у всех индикаторов в одном окне диаграммы имеется общее пространство позиций для свечек с единой сплошной нумерацией без пропусков
ну так это понятно, вопрос в том что меняется если мы переставляем инидкатор? и почему вдруг все начинает работать нормально? Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу. Так где пропуски конечно будет по 0 цена, я с этим уже сталкивался, но там где пропусков нет почему такое?
 
Цитата
Konstantin777 написал:
Цитата
Alexey Danin написал:
Дело в том, что у всех индикаторов в одном окне диаграммы имеется общее пространство позиций для свечек с единой сплошной нумерацией без пропусков
ну так это понятно, вопрос в том что меняется если мы переставляем инидкатор? и почему вдруг все начинает работать нормально? Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу. Так где пропуски конечно будет по 0 цена, я с этим уже сталкивался, но там где пропусков нет почему такое?
Могу написать пример как это сделать,
если напишите словами и с картинкой, что хотите получить.
 
Цитата
nikolz написал:
если напишите словами и с картинкой, что хотите получить
ну я просто хочу получить значения high для 3 первых и последних последних свечей, как в примере, в первом сообщении, в коде индикатора, с двух разных графиков, один график источник, другой просто в том же окне, при установке индикатора мне все выдает правильно:

Но если я меняю инструмент, а также просто при старте квика мне выдает совсем другое, пока я не переставлю индикатор, т.е. не видит историю
 
Цитата
Konstantin777 написал:

Но если я меняю инструмент, а также просто при старте квика мне выдает совсем другое, пока я не переставлю индикатор, т.е. не видит историю
У вас есть два графика двух разных инструментов

Данные загружаются на каждый из них с сервера независимо. Просчет индикаторов никак не синхронизирован с процессом загрузки данных в индикатор


Допустим, вы меняете инструмент на графике, откуда берутся данные по getCandlesByIndex
В зависимости от того, в какой момент терминал решит пересчитать ваш основной индикатор (который берет данные), вы можете получить несколько разных результатов. Можете получить данные старого инструмента, если очистка еще не произошла, можете получить пустые значения во всех свечах, если график очищен, но еще не заполнен, можете получить полузагруженную историю и наконец, ура, можете получить полную историю со всеми имеющимися свечами.

Надо понимать, что при загрузке терминала варианты 1,2 и 3 имеют гораздо более высокую вероятность, чем вариант 4. А вот в устоявшемся варианте, когда все данные терминалом прогружены, вы скорее всего будете получать вариант 4
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
Konstantin777 написал:
Цитата
nikolz написал:
если напишите словами и с картинкой, что хотите получить
ну я просто хочу получить значения high для 3 первых и последних последних свечей, как в примере, в первом сообщении, в коде индикатора, с двух разных графиков, один график источник, другой просто в том же окне, при установке индикатора мне все выдает правильно:
 
Но если я меняю инструмент, а также просто при старте квика мне выдает совсем другое, пока я не переставлю индикатор, т.е. не видит историю
посмотрите скрипт который я выложил на этом форуме для арбитража
В нем вроде бы все есть для вашей хотелки.
Если что-то надо еще напишите, добавлю.
В вашем примере много вывода  переписывать его нет желания.
 
Цитата
s_mike@rambler.ru написал:
Надо понимать, что при загрузке терминала варианты 1,2 и 3 имеют гораздо более высокую вероятность, чем вариант 4. А вот в устоявшемся варианте, когда все данные терминалом прогружены, вы скорее всего будете получать вариант 4
Цитата
Konstantin777 написал:
Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу.
Цитата
nikolz написал:
посмотрите скрипт который я выложил на этом форуме для арбитража
если это скрипт, то в скрипте у меня тоже все работает нормально, проблема именно в индикаторе, где то была тема что функция getCandlesByIndex плохо работает именно в инидикаторах
 
Здравствуйте.

Как уже верно заметили выше
Цитата
s_mike@rambler.ru написал:
Данные загружаются на каждый из них с сервера независимо. Просчет индикаторов никак не синхронизирован с процессом загрузки данных в индикатор
Действительно, такое поведение вероятно, Вам следует проработать алгоритм для обработки таких ситуаций или искать другой для решения Вашей задачи.
 
Цитата
Konstantin777 написал:
Цитата
   s_mike@rambler.ru написал:
Надо понимать, что при загрузке терминала варианты 1,2 и 3 имеют гораздо более высокую вероятность, чем вариант 4. А вот в устоявшемся варианте, когда все данные терминалом прогружены, вы скорее всего будете получать вариант 4
Цитата
Konstantin777 написал:
Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу.
 
Цитата
nikolz написал:
посмотрите скрипт который я выложил на этом форуме для арбитража
если это скрипт, то в скрипте у меня тоже все работает нормально, проблема именно в индикаторе, где то была тема что функция getCandlesByIndex плохо работает именно в инидикаторах
это индикатор.  Там я даже картинку выложил.
Но называется он скриптом, потому что написан языке Lua.
https://habr.com/ru/post/196272/
 
Konstantin777,
Позже выложу для Вас пример  
 
Konstantin777,
Выкладываю пример, если что не так, напишите, поправлю.
Код
Settings={
sec ="ind2",  --идентификатор инструмента 2-го графика
Name = 'nk_ind',
}
-------
function OnCalculate(i)
   if i==Size() then
      local N=getNumCandles (Settings.sec) ;
      if N>3 then
         local t=getCandlesByIndex(Settings.sec,0,N-3,3); --последние 3 свечи 2-го графика
         local Hi2,Hi1,Hi0=t[0].high,t[1].high,t[2].high;
      --------------------------
         t=getCandlesByIndex(Settings.sec,0,0,3);   --первые 3 свечи 2-го графика
         local H1,H2,H3=t[0].high,t[1].high,t[2].high;

         message("1="..H(1)..",2="..H(2)..",3="..H(3).."....,i-2="..H(i-2)..",i-1="..H(i-1)..",i="..H(i).."\n"..
         "1="..H1..",2="..H2..",3="..H3..",i-2="..Hi2..",i-1="..Hi1..",i="..Hi0.."\n");
      end
   end
   return
end
-----
function Init()
 Settings.line={};
   Settings.line[1] =    {Name = "C",Color = RGB(0,255,0),      Type =2,Width = 2   };
   return 1;
end
 
 
Добрый день nikolz,
я не понимаю чем Ваш пример от моего отличается.
Цитата
nikolz написал:
Выкладываю пример, если что не так, напишите, поправлю.
При смене инструмента работает? При первом включении терминала работает? Меня ведь именно это интересует. Не сомневаюсь что Ваш пример работает, если поставить индикатор заново, так и у меня работает
 
Цитата
Konstantin777 написал:
я не понимаю чем Ваш пример от моего отличается.
понял, у Вас getCandlesByIndex вызывается в OnCalculate, а моем примере в Init. Однако
Цитата
Konstantin777 написал:
Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу.
я такой же пример сам писал, и все так же плохо работает
 
Цитата
Konstantin777 написал:
Цитата
Konstantin777 написал:
я не понимаю чем Ваш пример от моего отличается.
понял, у Вас getCandlesByIndex вызывается в OnCalculate, а моем примере в Init. Однако  
Цитата
Konstantin777 написал:
Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу.
я такой же пример сам писал, и все так же плохо работает
Странный Вы человек.
Вместо того, чтобы задавать вопросы и высказывать недовольство,
просто надо было бы привести результат теста, а не рассказывать мне что вы делали что-то не работающее.
Я же не должен за вас все проверять,
написал же вам выше , проверьте если что не так напишите поправлю.
Но в любом случае Я делаю это если у меня есть желание Вам помогать.
 
Цитата
nikolz написал:
высказывать недовольство
не высказывал, просто сообщил что такой подход я уже пробовал, и он не работает
Цитата
nikolz написал:
результат теста, а не рассказывать мне что вы делали что-то не работающее.
я тестировал такой же точно пример, зачем мне тестировать его еще раз? Если этот подход не сработал у меня, почему Вы считаете что он заработает если Вы его примените? Вот я и рассудил логически что и Ваш пример не сработает, потому что код одинаковый
Цитата
nikolz написал:
Я же не должен за вас все проверять
я просил помочь с конкретной проблемой, Вы мне показываете пример который ее не решает и просите протестировать, так как сами не знаете реашет он проблему или нет, так как не тестировали, я же тестировал такой же код, повторяюсь уже в который раз, и он не работает, но в любом случае спасибо за помощь
 
Konstantin777,
Объясняю вам, почему  данные не изменяются при смене инструмента.
-------------
Проблема в том, что индикатор использует данные инструмента, который отображен перед  загрузкой индикатора на график,
т е при начальной инициализации индикатора в нем сохраняется указатель на архив данных инструмента.
----------------
Когда Вы изменяете инструмент на графике, то в индикаторе остается указатель на прежний инструмент.
Поэтому он продолжает отображать данные первоначального инструмента.
--------------
Поэтому для смены инструмента в индикаторе при смене его на графике Вам надо обеспечить отслеживание этой замены в индикаторе
и при обнаружении замены изменить источник данных для индикатора.
---------------
Полагаю, что это можно сделать задействовав функции создания источника данных.
Но помогать Вам я не буду, нет желания.
 
Konstantin777, Да забудьте Вы и про getCandlesByIndex, и про индикаторы - этим дерьмом в принципе пользоваться невозможно, и оно в принципе неремонтопригодно. Я пару дней пытался получать свечи отсюда, но быстро всё понял, и давным-давно считаю все свечи сам, по нескольким сотням тикеров и по десятку таймфреймов у каждого из них. А это убожество неизбежно будет глючить даже на одном таймфрейме одного тикера. Оно Вам надо?
 
Цитата
nikolz написал:
Когда Вы изменяете инструмент на графике, то в индикаторе остается указатель на прежний инструмент. Поэтому он продолжает отображать данные первоначального инструмента.
но он отображает 0, а не данные предыдущего инструмента
Цитата
nikolz написал:
Поэтому для смены инструмента в индикаторе при смене его на графике Вам надо обеспечить отслеживание этой замены в индикатореи при обнаружении замены изменить источник данных для индикатора
причем тут источник данных? ведь данные из основного графика корректно считываются при смене инструмента
Цитата
nikolz написал:
Полагаю, что это можно сделать задействовав функции создания источника данных.
я не могу использовать эту функцию в индикаторе, судя по документации, так же как и getCandlesByIndex, я уже тестировал такой подход(создание источника данных) и он тоже не работает, но я уже не помню точно с чем именно там была проблема, так что возможно попробую еще раз и выложу результаты сюда
Цитата
nikolz написал:
Но помогать Вам я не буду, нет желания.
спасибо за советы еще раз, если обидел чем не поминайте лихом, добра Вам и Вашим близким
Цитата
Владимир написал:
давным-давно считаю все свечи сам, по нескольким сотням тикеров и по десятку таймфреймов у каждого из них.
не очень понимаю что Вы имеете ввиду
Цитата
Владимир написал:
Оно Вам надо?
ну у меня задача сделать именно индикатор, чтобы видно было что происходит, и так как инструментов много, по которым я хочу следить за ситуацией, мне не очень удобно при каждом заходе в квик заходить в настройки каждого нидикатора, чтобы он заработал.
С советником таких проблем не возникает, там эта функция не глючит
Цитата
Alexey Danin написал:
Действительно, такое поведение вероятно, Вам следует проработать алгоритм для обработки таких ситуаций или искать другой для решения Вашей задачи.
почему все работает нормально если зайти в настройки индикатора после смены таймфрейма, какое волшебство там происходит в этот момент? Если бы я мог это симулировать вручную, то проблема бы решилась легко. Я подозреваю что достаточно просто сделать то же самое при смене таймфрейма или при заходе в квик и функция заработает, для Ваших разработчиков это расплюнуть
 
Цитата
но он отображает 0, а не данные предыдущего инструмента
Если индикатор написан правильно, то отображает предыдущее значение а не ноль
 
 
Тот факт что индикатор остается привязанный к первоначальному инструменту косвенно подтверждает название окна индикатора
если его поместить в третье окно
На картинке
индикатор помещен первоначально  со Сбербанком
После смены инструмента название окна индикатора не меняется

 
 
вариант при котором индикатор работает при смене инструмента, если включить якорь
но при этом смена происходит и во всех окнах и название индикатора тоже изменяется


 
 
Konstantin777,
Я не понял, зачем Вам два окна с двумя инструментами.
Напишите подробнее, что Вы хотите сделать.
Возможно есть решение именно того, что хотите , но пока я не понимаю в чем смысл двух инструментов и
наблюдение трех первых и трех последних, если это не арбитраж.
----------------------  
Можно решить задачу многими способами.
В первом приближении выбранный вами неудачный.
 
Konstantin777,,
Как Вы изменяете инструмент?
------------------
Дело в том, что если Вы изменяете интервал или инструмент с помощью якоря, то эти изменения приводят к пересчету индикатора
--------------------
Но если инструмент заменяется через меню окна, то индикатор не пересчитывается.
 
если изменять инструмент через меню, то надо изменить инструмент и в индикаторе.
тогда все работает.
--------------------
Резюме:
Изменение данных в индикаторе будет происходить:
1) при изменении тайма
2) при изменении инструмента якорем
3) при изменении инструмента через меню в окне и в индикаторе
4)  Можно сделать изменение инструмента через меню лишь в окне, но тогда изменение в индикаторе можно сделать лишь на следующей обезличенной сделке.
Konstantin777,
Какой из этих 4 вариантов или иной Вам нужен?
 
Konstantin777,
Скажите, что не так в картинках ниже:
это исходное


это изменили инструмент через легенду в окне

это изменили интервал

Все верно?
 
Konstantin777, А что тут непонятного? Ценных бумаг разных видов на рынке, мягко говоря, до хрена, в портфеле их должно быть уж никак не менее десятка (у меня их обычно где-то в районе полусотни), каждая из них в разные моменты времени ведёт себя по-разному, причём даже поведение одного и того же тикера в один и тот же момент времени на минутных, часовых, дневных, недельных свечах может быть совершенно различным. Всё это программа должна бы учитывать и работать с самыми интересными тикерами, от которых в данный момент можно ожидать максимальной прибыли, и работать с ними на тех таймфреймах, для которых вероятность получения этой прибыли наиболее высока. Таким образом, речь должна идти о многих сотнях и тысячах отслеживаемых таймфреймов, и потому ценность имеющегося здесь софта для получения свечей даже не просто равна нулю - она отрицательная.

А зачем Вам "именно индикатор"? Мой скрипт не только следит за рынком, но и принимает решения, он сам торгует - мне остаётся только его включать и выключать, хотя даже это не обязательно. За каким хреном мне нужно, "чтобы видно было что происходит и следить за ситуацией"? Я для того и написал скрипт, чтобы этой фигнёй не заниматься - пусть железяка работает! Не говоря уже про "заходить в настройки каждого (!) индикатора, чтобы он заработал". На кой МНЕ все эти "советники"? Пущай скрипт советуется с кем хочет, а мне чтоб только деньги приносил - "подробности меня не интересуют". :smile:  
Страницы: 1
Читают тему
Наверх