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 плохо работает именно в инидикаторах
Страницы: 1
Читают тему (гостей: 1)
Наверх