mbak (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Цитата
Игорь М написал:
Цитата
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))"?  
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Цитата
Игорь М написал:
Цитата
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?
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Код
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?

Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Цитата
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
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Или может применить 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
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Цитата
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 минут.
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Цитата
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 
  
Спасибо! Работает!  
Индикатор уровней 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
Страницы: 1
Наверх