Здравствуйте. При создании или редактировании индикатора расчёт индикатора происходит несколько раз, каждый раз расчет производится, начиная с первой свечи и заканчивая последней. Как определить, какой расчет окончательный? Проблема ещё в том, что при добавлении нового индикатора на график с одновременным изменением параметров в Setting ( последовательность действий: редактировать / добавить / далее меняем параметры индикатора и только затем применить или OK), расчёт производится 3 раза, при этом первый расчёт производится с параметрами по умолчанию, т. е. не изменёнными. При изменении параметров уже существующего на графике индикатора расчёт производится 2 раза, оба раза с уже изменёнными параметрами. Если меняем таймфрейм или если создаём копию окна, в котором есть индикатор, расчёт производится 1 раз. Проверял, добавляя индикатор на чистый график цены. Версия 8.9.0.107
К сожалению, не совсем поняли суть Вашего вопроса. Просьба немного подробнее описать, что Вас интересует. Желательно с прикрепленными скриншотами (снимками экрана).
Settings = { Name = "xTest", param = 100, line= { { Name = "Test", Color = RGB(0, 128, 0), Type = TYPE_LINE, Width = 2 }
} }
function Init() return 1 end
function OnCalculate(index)
if index > 3 then return end message("index="..index.." param="..Settings.param) end
Прицепляю индикатор к графику и в зависимости от выполняемой операции получаю следующие результаты.
Если при добавлении индикатора одновременно изменил параметр с 100 на 200, получаю такие сообщения (от более ранних к поздним)index=1 param=100 index=2 param=100 index=3 param=100 index=1 param=200 index=2 param=200 index=3 param=200 index=1 param=200 index=2 param=200 index=3 param=200 Видно, что произошло 3 расчёта индикатора, первый расчёт с параметром по умолчанию, хотя с таким параметром запуска вообще не было, т.к. в индикаторе при добавлении сразу менял параметр на 200.
Ещё вопрос по функции SetValue. Она не работает по последней формирующейся свече?
Код
function OnCalculate(index)
local i1 = index - 1
local i2 = index
if O(i1) == nil or O(i2) == nil then return end
SetValue(i2, 1, O(i2)) -- так не работает
-- SetValue(i1, 1, O(i1)) -- так работает
end
Александр написал: Ещё вопрос по функции SetValue. Она не работает по последней формирующейся свече?
Для последнего индекса происходит возврат данных из функции OnCalculate. Эти данные устанавливаются на график. Так что даже если вы используете функцию, все равно произойдет переопределение.
Вопрос с повторными расчетами добавляемого индикатора или индикатора, у которого меняют параметры, имеет давнюю историю и разумно решен, похоже, не будет.
Напомню, что в QUIK версии 6.17 при редактировании параметров индикатора пересчитывался только он один, остальные индикаторы на диаграмме не пересчитывались ("1+0"). В одной из последующих версий сделали улучшение - "2+1". На просьбу вернуть "1+0" Разработчик откликнулся доведением до абсурда в версии 7.2.15 - при редактировании параметров какого-либо индикатора он пересчитывался 3 раза, а все остальные на диаграмме - по 2 ("3+2"). Это он шутил так. Чтоб пользователю жизнь раем не казалась.
Так что, нынешние "2+1" (при изменении параметров индикатора) или "3+1" (при добавлении), очень нужные Разработчику, опасно беспокоить, может получиться, как тогда. А пользователь перебьется как-нибудь на нынешних.
"Как определить, какой расчет окончательный?" Они близнецы, все окончательные.
Совет - со временем переходите от индикаторов к скриптам-роботов. Там этого вопроса не будет.
Evgeniy Karnaukhov написал: В этой функции такой возможности нет. Так как в принципе невозможно определить, какая сделка в периоде свечки будет последней.
Евгений, т. к. при изменении параметров индикатор пересчитывается несколько раз (от одного до трёх) вместо одного раза, то возник вопрос, как определить, какой из этих расчётов окончательный. Это не вопрос о том, какая сделка последняя на свече, после которой будет переход к следующей свече. Историю проблемы прояснил Борис Гудылин в своём посте.