Тема: Задержка расчетов индикатора.

Здравствуйте! Помогите пожалуйста вставить в код индикатора задержку между расчетами, или расчет по предыдущей свече.
Проблема в том, что spred иногда выносит в макс или в мин (не все данные приходят одновременно) на доли секунды, и max_price и low_price тоже соответственно искажаются, потом spred принимает нормальное значение а max и low - нет...

--- Вычислить спред.
-- @param index номер свечи на графике
-- @return значение спреда или nil, если оно неопределено
local function getSpread(index)
   local timeCode = getTimeCode(T(index))
   local securityPrice = C(index)
   if securityPrice == nil then
       return nil
   end
   -- Получение свечей дополнительных инструментов
   local candle1 = getCandleByTimeCode(Settings.tag1, timeCode)
   local candle2 = getCandleByTimeCode(Settings.tag2, timeCode)
   if candle1 == nil or candle2 == nil then
       return nil
   end
   -- Получение цен дополнительных инструментов
   local price1 = candle1.close
   local price2 = candle2.close
   if price1 == nil or price2 == nil then
       return nil
   end
   -- Вычисление спреда
   local spread = (50 - (100 / (1 + price1 /  price2)))*Settings.k
   
    -- Вычисление максимума минимума среднего для спреда
   if index == 1 then
        max_price = nill
        med_price = nill
        low_price = nill
    elseif T(index).hour < T(index-1).hour then
        max_price = nill
        med_price = nill
        low_price = nill
    end
    if max_price == nill then
        max_price = spread
        
    elseif spread > max_price then
        max_price = spread
        low_price = spread - Settings.a
        med_price =  (max_price+low_price)/2
    end

    if low_price == nill then
        low_price = spread
        
    elseif spread < low_price then
        low_price = spread
        max_price = spread + Settings.a
        med_price =  (max_price+low_price)/2
    end
    if med_price == nill then
        med_price =  (max_price+low_price)/2
    elseif spread < low_price then
        med_price =  (max_price+low_price)/2
    elseif spread > max_price then
        med_price =  (max_price+low_price)/2
    end
   return spread, (max_price+low_price)/2 , max_price, low_price
end

function OnCalculate(index)
   if index > 1 then
       local spread = getSpread(index - 1)
       if spread then
           SetValue(index - 1, 1, spread)
           SetValue(index , 2, med_price)
           SetValue(index , 3, max_price)
           SetValue(index , 4, low_price)
       end
   end
   return getSpread(index), med_price , max_price, low_price
end

Извиняюсь, я не программист, лепил из того что было...

2 (2022-07-14 13:01:37 отредактировано swerg)

Re: Задержка расчетов индикатора.

Предлагаю не задержку делать
Просто добавить условие: если спред "слишком большой" ("подозрительно большой") - либо не возвращать значение индикатора, т.к. оно "не валидное", либо возвращать предыдущее значение спреда, либо еще что-то, по ситуации.

Что такое "слишком большой спред" и чему он равен - вам придется решить.

3

Re: Задержка расчетов индикатора.

Индикатор рассчитывается от +50 до -50, Settings.a ставлю 10 ("max_price = spread + Settings.a" ), т.к. spred считается по двум значениям, которые иногда приходят не одновременно, то получается spred уходит либо в +50 либо в -50, потом возвращается, но из-за Settings.a = 10 max и low получаются не корректны.
Например: предыдущий spred был +10, на следующей свече из-за корявых данных происходит скачек в +50 и сразу возврат в например +11, но max остается на показании +11 + Settings.a = 21, а должен быть на +11...
Тут оптимальный вариант max и low считать по закрытию, либо между расчетом spred и max/low ставить что-то типа sleep...
Помогите с кодом пожалуйста!

4

Re: Задержка расчетов индикатора.

Исходя из формулы спреда, при корявых данных он будет уходить в -50, поэтому с max особо проблем не возникает... если спред конечно растет!
Проще наверное считать max/low по предыдущей свече, ну т.е. не в реальном времени а по закрытию.

5

Re: Задержка расчетов индикатора.

Никакие sleep не помогут, т.к.
- на сколько sleep? всегда найдется ситуация, когда вот так вот просто sleep - не хватит
- на sleep всё тупо стоит, новые данные не приходят.

Не надо пытаться "обмануть" обьективно присутствующий поток данных. Ведь на самом деле в других случаях вы тоже несинхронно получаете данные, из которых вы вычисляете spread, просто там не так это бросается в глаза, потому вы "не замечаете".

Далее. Увы, но события "закрытие свечи" - не бывает. Никто не знает когда свеча закрылась. Скажу больше: иногда могут доехать тики в предыдущую свечу, хотя уже новая начала формироваться.
И тогда, раз вы пишете:

chel74gagar пишет:

Тут оптимальный вариант max и low считать по закрытию, либо между расчетом spred и max/low

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

Это если в общих словах.
Поправить код - это надо думать.

6

Re: Задержка расчетов индикатора.

Да, Вы правы! В моменте не увидел применения max/low в своей стратегии... Мне полезней смотреть спред относительно предыдущих значений. Чисто визуальное сравнение.

7

Re: Задержка расчетов индикатора.

Увы, но события "закрытие свечи" - не бывает. Никто не знает когда свеча закрылась

На самом деле этот момент легко определить
Если предыдущий индекс свечи меньше текущего то появилась новая свеча, для этого достаточно запомнить предыдущий индекс свечи и сравнивать его с текущим

8

Re: Задержка расчетов индикатора.

iforts пишет:

Если предыдущий индекс свечи меньше текущего то появилась новая свеча

swerg пишет:

Скажу больше: иногда могут доехать тики в предыдущую свечу, хотя уже новая начала формироваться.

У меня, правда, есть смутное воспоминание, что вроде разработчики обещали, что в этом случае для формирующейся свечи заново вызовутся тики, но точно не помню чем закончилось то обсуждение.