Индекс формирующегося бара.

Страницы: 1
RSS
Индекс формирующегося бара.
 
Добрый день!

Пишу индикатор, необходимо чтобы он проводил расчёты по всем барам текущего графика, кроме первого (самого правого, формирование которого ещё не завершено).
Не могу найти способ вычислить номер этого бара, чтобы сравнить с Index в OnCalculate.
С увж.,

Александр.
 
В Квик нумерация баров идет от 1, в отличии от MT.

Поэтому последний бар равен результату выполнения функции Size(). Она возвращает текущее число баров. Если индекс равен ему, то он последний существующий бар.
 
Цитата
Nikolay написал:
В Квик нумерация баров идет от 1, в отличии от MT.

Поэтому последний бар равен результату выполнения функции Size(). Она возвращает текущее число баров. Если индекс равен ему, то он последний существующий бар.
Да отлично работает!
но это вызвало другую проблему. У меня остановились расчёты вообще. Новые бары формируются, а индикатор расчёты не проводит.

function OnCalculate(index)
if index ~= Size() then
if O(index) ~= C(index) then --исключаем пред и пост торговые бары, а также бары без движения.
if O(index) < C(index) then
sum = sum + V(index)
else
sum = sum - V(index)
end
end
end
return sum
end

Можете подсказать, где я ошибаюсь?
 
Так расчет будет только для исторических баров при старте. Текущий бар всегда равен Size, а значит и расчета нет.
Когда появится новый бар, он опять равен Size.
Также Вы переменную sum инициализировали где-то? Иначе будет арифметика с nil.
 
Alexander, А почему здесь круглые скобки? Все эти O, C, V - они что, функции?
 
Settings=
{
 Name = "Индикатор объёма v1",
 line =
      {
        { -- Первая линия - настройки
          Name = "Среднее Значение", -- надпись над линией при наведении курсора
          Color = RGB(255, 0, 0),
          Type = TYPE_LINE,
          Width = 2
        }
     }
}
function Init()
   return 1 --инициализируем одну линию на графике
end
sum = 0
function OnCalculate(index)
if T(index).hour == 9 then
sum = 0
end
if index ~= Size() then
if O(index) ~= C(index) then --исключаем пред и пост торговые бары, а также бары без движения.
if O(index) < C(index) then
sum = sum + V(index)
else
sum = sum - V(index)
end
end
end
return sum
end

========================
Прямая красная линия - это новые бары после запуска индикатора. Расчёты не идут.
 
Так я Вам уже написал:

Так расчет будет только для исторических баров при старте. Текущий бар всегда равен Size, а значит и расчета нет.
Когда появится новый бар, он опять равен Size.

Если Вы хотите при поступлении нового бара произвести расчет прошлого бара, то необходимо обеспечить хранение последнего рассчитанного бара он будет равен Size()-1, а при поступлении нового увеличить индекс рассчитанного бара и произвести расчет. Т.о. Вы будете производить расчет последнего закрытого бара.
 
Николай, понял, спасибо!
 
Цитата
Nikolay написал:
Так я Вам уже написал:

Текущий бар всегда равен Size
это неверное утверждение  
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Цитата
Nikolay написал:
Так я Вам уже написал:

Текущий бар всегда равен Size
это неверное утверждение  
Вы хотите сказать, что это до сих пор не исправили и Size считает временные интервалы?
 
Цитата
Nikolay написал:
Так я Вам уже написал:

Так расчет будет только для исторических баров при старте. Текущий бар всегда равен Size, а значит и расчета нет.
Когда появится новый бар, он опять равен Size.

Если Вы хотите при поступлении нового бара произвести расчет прошлого бара, то необходимо обеспечить хранение последнего рассчитанного бара он будет равен Size()-1, а при поступлении нового увеличить индекс рассчитанного бара и произвести расчет. Т.о. Вы будете производить расчет последнего закрытого бара.
Николай, затрудняюсь с решением задачи.
======================
sum = 0
lastClsBar = 0
function OnCalculate(index)
if T(index).hour == 9 then
sum = 0
end
if O(index) ~= C(index) then --исключаем пред и пост торговые бары, а также бары без движения.
if O(index) < C(index) then
sum = sum + V(index)
else
sum = sum - V(index)
end
end
if index == Size()-1 then
lastClsBar = sum
end
return sum
end
=======================
Рассчитанное значение сохранил, а вот дальше не понимаю, как это реализовать.
 
Alexander, так пойдет?
Код
v={}
function OnCalculate(index)
  if(v[index]==nil)then
    if(T(index).hour==9)and(T(index).min==0)or(index==1)then v[index]=0
    else
      if O(index-1)<C(index-1) then v[index]=v[index-1]+V(index-1) end
      if O(index-1)>C(index-1) then v[index]=v[index-1]-V(index-1) end
      if O(index-1)==C(index-1)then v[index]=v[index-1] end
    end
  end
  return v[index]
end
 
Цитата
Alexander написал:
Цитата
   s_mike@rambler.ru написал:
 
Цитата
Nikolay  написал:
Так я Вам уже написал:

Текущий бар всегда равен Size
 это неверное утверждение  
Вы хотите сказать, что это до сих пор не исправили и Size считает временные интервалы?
Size() совершенно необязательно возвращает номер последнего формирующегося бара инструмента. Это может быть в случае (например) если на диаграмму нанесены графики разных инструментов. И ещё в нескольких случаях.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
И ещё в нескольких случаях.
Огласите весь список, пожалуйста!
 
Код
bar=1;
function OnCalculate(index)
     if bar < index then
          --[[ Выполним наш код в начале каждого нового бара
               Текущий бар всегда в индикаторе равен index
               значит просто нужно index-1 чтоб получить предыдущий,
               или как видно по условию это будет переменная bar
                Т.к. работаем по сформированной истории то и пересчитывать
               нужно только раз при наступлении нового бара ]]
          bar = index
     end
     return v[index]end
И нечего огород городить. Он и так уже нормально сформирован.
 
Ну и если вам нужно пропустить старт до последнего бара, то так

bar=1
function OnCalculate(index)
    if index == 1 then bar = Size() end
    if index < bar then
         return nil
    end
    -- Наш код
     return v[index
]end
 
В данном контексте у нас последний бар = Size. Можно порассуждать о теоретических ситуациях, но зачем.

Я такие задачи предпочитаю решать через замыкание. Но можно, конечно, и переменные создать.
Код
--Общая сумма
local sum  = 0
--Сумма текущего бара
local ind_sum = 0
--Последний рассчитанный индекс
local last_index = 0
function OnCalculate(index)

    --Рассчет необходимо произвести один раз при появлении нового бара, рассчитав только что завершившийся.
    --Если этот код вызывать на каждой сделке, то sum не будет равен сумме объемов баров
    if index ~= last_index then
        sum = sum + ind_sum
    end

    if not C(index) then return sum end

    ind_sum = 0

    if T(index).hour == 9 then
        ind_sum = 0
    end
    if O(index) ~= C(index) then --исключаем пред и пост торговые бары, а также бары без движения.
        if O(index) < C(index) then
            ind_sum = V(index)
        else
            ind_sum = -V(index)
        end
    end
    last_index = index
    return sum + ind_sum
end
 
Великолепно работает!!!

Ещё бы квик позволял видеть историю минуток не только за последнюю неделю и вообще была бы сказка.
 
Alexander, Истории минутных свечей (да хоть тиков!) практически за любой период в Инете до мамы! Я когда-то этим интересовался (историю брал с сайта mfd.ru), но уже с полгода как завязал с этим занятием: сейчас меня интересуют максимум часовые свечи, причём теперь я их считаю сам. Чего и другим советую. СКАЗКА!  :smile:  
 
Цитата
Цитата
Владимир написал:
Alexander, Истории минутных свечей (да хоть тиков!) практически за любой период в Инете до мамы! Я когда-то этим интересовался (историю брал с сайта mfd.ru), но уже с полгода как завязал с этим занятием: сейчас меня интересуют максимум часовые свечи, причём теперь я их считаю сам. Чего и другим советую. СКАЗКА!  ::  
Пробовал запрашивать минутки на mfd, например за какую либо неделю 2011 года, итог: "Вы запросили данные за слишком большой временной период."  
 
Николай, подскажите,
какой код внутри индикатора, при выполнении какого либо условия позволяет издавать Alert (звуковой сигнал, наподобие того когда приходит сообщение в квике) ?
 
Alexander, Странно. Я уже забыл, как это делается, но точно помню, что получал минутные свечи за полгода, причём сразу по 30 тикерам (больше они не давали), а всего тикеров было порядка полутысячи. Данные с тиками действительно давались не более, чем на месяц (кажется), а свечи.. но уж точно счёт шёл не на недели! Не говоря уже о более тяжёлых.
 
Для проигрывания звуковых файлов Вы можете воспользоваться библиотекой w32:
https://quik2dde.ru/viewtopic.php?id=78
 
Добрый вечер!
Нет ни у кого примера простенького скрипта для открытия "по рынку" с выставлением стоп лоса и тейк профита?
И простенького скрипта закрытия этого  ордера "по рынку".
Спасибо!
Страницы: 1
Читают тему
Наверх