Прошу помочь в написании индикатора горизонтальной линии уровня 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
Код
if (t.hour == 16) and (t.min == 30) and (t.sec==00) then x=H(index) end
Простите, а как можно привязать к коду таймфрейм свечи, чтобы можно было смотреть линии границ свечи большего таймфрейма на меньшем таймфрейме? Например линию high свечи М30 16:30:00 можно было бы видеть на графике с таймфреймом 5 минут.
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?
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.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
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.
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). Может этого для задачи и достаточно.