Индикатор уровней High, Low определенной свечи определенного таймфрейма

Страницы: 1
RSS
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Прошу помочь в написании индикатора горизонтальной линии уровня Open определенной свечи на примере кода:
Код
Settings =
{
  Name = "*line",
  line =
  {
    {
      Name = "line",
      Color = RGB(140, 140, 140),  
      Type = TYPE_LINE  
    }
  }
}

function Init()
  return 1
end

function OnCalculate(index)
  if (T(index).hour == 16) and (T(index).min == 30) then
    return O(index)  
  end
end
Согласно этому коду линия открытия свечи 16:30 соединяется кривой линией с открытием свечи 16:30 следующего дня.

Мне же требуется прямая горизонтальная линия до конца дня.
Пример:

Код примера:
Код
Settings=
{
   Name="*DayOpenPrice",
   line =
   {
      {
         Name = "DayOpenPrice_line",
         Color = RGB(0,0,255),
         Type = TYPE_LINE,
         Width = 2
      }
   }
}

local curDayOpenPrice = nil
local lastSize = 0

function Init()
   return 1
end

function GetCandleDate(ind)  -- Получить полную дату свечи по индексу ind
   local dt = T(ind)
   local candleDate = 0
   if dt then
      candleDate = (tonumber(dt.year) or 0) * 10000               -- 20230000
      candleDate = candleDate + (tonumber(dt.month) or 0) * 100   -- 20230700
      candleDate = candleDate + (tonumber(dt.day) or 0)           -- 20230728
   end
   return candleDate
end

function OnCalculate(index)
   if index == 0 then
      return nil
   end
   
   if index == (lastSize-1) then     -- Для проверки не каждый тик, а только при появлении новой свечи
      return nil
   else
      lastSize = Size()        -- Запомнить текущее количество свечей
   
      local curDate = GetCandleDate(index)       -- Дата текущей свечи
      local lastDate = GetCandleDate(index - 1)  -- Дата предыдущей свечи
      
      if curDate > lastDate then        -- Если дата на текущей свече больше даты на предыдущей (т.е. сменилась дата - начался новый торговый день)
         curDayOpenPrice = O(index)    -- Сохранить данные цены открытия текущей свечи для отрисовки на графике
      end
   end
   return curDayOpenPrice
end
 
вместо этого:
Код
function OnCalculate(index)
  if (T(index).hour == 16) and (T(index).min == 30) then
    return O(index)  
  end
end
попробуйте так:
Код
function OnCalculate(index) 
local t=T(index);
 if (t.hour == 16) and (t.min == 30) and (t.sec==00) then  x=O(index)  end
return x
end
 
Цитата
nikolz написал:
вместо этого:
Код
   function   OnCalculate (index)
   if  (T(index).hour  =  =   16 )  and  (T(index).min  =  =   30 )  then 
     return  O(index)  
   end 
 end   
попробуйте так:
Код
   function   OnCalculate (index) 
 local  t = T(index);
  if  (t.hour  =  =   16 )  and  (t.min  =  =   30 )  and  (t.sec =  =  00 )  then   x = O(index)   end 
 return  x
 end 
  
Спасибо! Работает!  
 
Цитата
nikolz написал:
вместо этого:
Код
   function   OnCalculate (index)
   if  (T(index).hour  =  =   16 )  and  (T(index).min  =  =   30 )  then 
     return  O(index)  
   end 
 end   
попробуйте так:
Код
   function   OnCalculate (index) 
 local  t = T(index);
  if  (t.hour  =  =   16 )  and  (t.min  =  =   30 )  and  (t.sec =  =  00 )  then   x = O(index)   end 
 return  x
 end 
  
Код
if (t.hour == 16) and (t.min == 30) and (t.sec==00) then  x=H(index)  end
Простите, а как можно привязать к коду таймфрейм свечи, чтобы можно было смотреть линии границ свечи большего таймфрейма на меньшем таймфрейме? Например линию high свечи М30 16:30:00 можно было бы видеть на графике с таймфреймом 5 минут.
 
Или может применить math.max к определенному периоду времени?
Пример (но так показывает high каждой свечи за этот период):
Код
if (t.hour == 16) and (t.min  > 30 or t.min < 59) and (t.sec==00) then  x= math.max (H(index))  end
 
Код
if (t.hour == 16) and (t.min >= 30) and (t.sec == 00) then x = math.max(x, H(index)) end

Если на тиковом тоже надо постоянно обновлять, уберите проверку t.sec
 
Цитата
funduk написал:
Код
   if  (t.hour  =  =   16 )  and  (t.min  >  =   30 )  and  (t.sec  =  =   00 )  then  x  =   math.max (x, H(index))  end   

Если на тиковом тоже надо постоянно обновлять, уберите проверку t.sec
Не работает так:
Код
Settings =
{
  Name = "*HI930test",
  line =
  {
    {
      Name = "HI930test",
      Color = RGB(140, 140, 140),  -- 
      Type = TYPE_LINE
    }
  }
}

function Init()
  return 1
end

function OnCalculate(index) 
local t=T(index);
 if (t.hour == 16) and (t.min >= 30) and (t.sec == 00) then x = math.max(x, H(index)) end
return x
end
 
Конечно не работает, и даже ошибку пишет, что исправить. Перед началом каждого интересующего периода x должен быть инициализирован числом, не помешающим максимуму. Например, так.

Код
 if (t.hour < 16) or ((t.hour == 16) and (t.min < 30)) then x = nil end if (t.hour == 16) and (t.min >= 30) and (t.sec == 00) then x = math.max(x or 0, H(index)) end
 
Код
if (t.hour < 16) or ((t.hour == 16) and (t.min < 30)) then x = nil end if (t.hour == 16) and (t.min >= 30) and (t.sec == 00) then x = math.min (x or 0, L(index)) end 

Объясните еще последнее пожалуйста: почему в данном примере math.min за период показывает только 0?
При

then x = math.min (x, L(index))

Ошибка: attempt to compare number with nil - попытка сравнить число с нулем. Получается, что значение Low видит только, как 0?

 
Цитата
mbak написал:
Код
   if  (t.hour  <   16 )  or  ((t.hour  =  =   16 )  and  (t.min  <   30 ))  then  x  =   nil   end   if  (t.hour  =  =   16 )  and  (t.min  >  =   30 )  and  (t.sec  =  =   00 )  then  x  =  math.min (x  or   0 , L(index))  end    
     Объясните еще последнее пожалуйста: почему в данном примере math.min за период показывает только 0?
При   then x = math.min (x, L(index))
 Ошибка: attempt to compare number with nil - попытка сравнить число с нулем. Получается, что значение Low видит только, как 0?
Вам funduk написал: "Перед началом каждого интересующего периода x должен быть инициализирован числом". У вас x = nil, (nil or 0) дает 0. math.min (x, L(index)) закономерно пишет ошибку, только перевод неправильный: nil это не ноль, math.min и math.max не могут работать с nil, а с нулем могут.
 
Цитата
Игорь М написал:
Цитата
mbak написал:
 
Код
      if   (t.hour   <     16  )   or   ((t.hour   =    =     16  )   and   (t.min   <     30  ))   then   x   =     nil     end     if   (t.hour   =    =     16  )   and   (t.min   >    =     30  )   and   (t.sec   =    =     00  )   then   x   =   math.min (x   or     0  , L(index))   end       
      Объясните еще последнее пожалуйста: почему в данном примере math.min за период показывает только 0?
При   then x = math.min (x, L(index))
 Ошибка: attempt to compare number with nil - попытка сравнить число с нулем. Получается, что значение Low видит только, как 0?
Вам funduk  написал: "Перед началом каждого интересующего периода x должен быть инициализирован числом". У вас x = nil, (nil or 0) дает 0. math.min (x, L(index)) закономерно пишет ошибку, только перевод неправильный: nil это не ноль, math.min и math.max не могут работать с nil, а с нулем могут.
почему
Код
if (t.hour < 16) or ((t.hour == 16) and (t.min < 30)) then x = nil end if (t.hour == 16) and (t.min >= 30) and (t.sec == 00) then x = math.max(x or 0, H(index)) end
правильно всё показывает.
Код
if (t.hour < 16) or ((t.hour == 16) and (t.min < 30)) then x = nil end if (t.hour == 16) and (t.min >= 30) and (t.sec == 00) then x = math.min(x or 0, L(index)) end
показывает только 0?
 
mbak, поясните,  пожалуйста, что на самом деле Вы хотите? "помочь в написании" одного  скрипта, или написать его за Вас,  или написать его за Вас и объяснить, почему именно так, а не иначе, или обучить части базовых основ  математики и программирования, необходимых для написания конкретно этого  скрипта? Могу предложить платную помощь  :smile:  
 
Цитата
mbak написал:почему  
Код
   if  (t.hour  <   16 )  or  ((t.hour  =  =   16 )  and  (t.min  <   30 ))  then  x  =   nil   end   if  (t.hour  =  =   16 )  and  (t.min  >  =   30 )  and  (t.sec  =  =   00 )  then  x  =   math.max (x  or   0 , H(index))  end   
правильно всё показывает.
Код
   if  (t.hour  <   16 )  or  ((t.hour  =  =   16 )  and  (t.min  <   30 ))  then  x  =   nil   end   if  (t.hour  =  =   16 )  and  (t.min  >  =   30 )  and  (t.sec  =  =   00 )  then  x  =   math.min (x  or   0 , L(index))  end   
показывает только 0?
Потому что у вас H(index) и L(index) положительные числа. В первом случае определяете максимум между 0 и H(index): получаете H(index), а во втором - определяете минимум между 0 и L(index): получаете 0.
 
Цитата
Игорь М написал:
Цитата
mbak написал:почему  
Код
      if   (t.hour   <     16  )   or   ((t.hour   =    =     16  )   and   (t.min   <     30  ))   then   x   =     nil     end     if   (t.hour   =    =     16  )   and   (t.min   >    =     30  )   and   (t.sec   =    =     00  )   then   x   =    math.max (x   or     0  , H(index))   end      
 правильно всё показывает.  
Код
      if   (t.hour   <     16  )   or   ((t.hour   =    =     16  )   and   (t.min   <     30  ))   then   x   =     nil     end     if   (t.hour   =    =     16  )   and   (t.min   >    =     30  )   and   (t.sec   =    =     00  )   then   x   =    math.min (x   or     0  , L(index))   end      
 показывает только 0?
Потому что у вас H(index) и L(index) положительные числа. В первом случае определяете максимум между 0 и H(index): получаете H(index), а во втором - определяете минимум между 0 и L(index): получаете 0.
Спасибо, понял! А можно как-то более правильно-корректно написать, чем например просто "x = math.min(x or 5000, L(index))"?  
 
Цитата
mbak написал: Спасибо, понял! А можно как-то более правильно-корректно написать, чем например просто "x = math.min(x or 5000, L(index))"?  
Я, если честно, в саму задачу не вникал, просто по написанию посмотрел откуда ошибки. По написанию этого выражения нормально всё. Вопрос только откуда этот x и как его следует обрабатывать, если он nil. Здесь он просто поменяется на минимум между 5000 и L(index). Может этого для задачи и достаточно.
Страницы: 1
Читают тему
Наверх