валерий, Какой индекс? Какая база данных? Вы можете предметно сообщить что именно интересует? Сейчас Ваш вопрос не понятен. Вам уже было сказано, что сами графики вообще никак не менялись, а менялись только конкретные функции, а вернее результат их вывода в случае наличия пустых свечек. Остальное не менялось и поведение то же самое.
Sergey Gorokhov, Индекс в OnCalculate(index). Конкретно, вот график с одной фишкой, пропуски не показывать, фильтр по дневной сессии. Какие свечи будет перебирать индекс? Только те что на графике?
валерий написал: Это в 7.2. А что в 7.7? Организовать вычисления при наличии пустых свечек конечно можно, но это накладно и в 99 случаях не нужно.
Никто Вас не заставляет "производить вычисления при наличии пустых свечек", просто пропускайте их и все. Именно это корректно позволяют сделать изменения в 7.7.
Ну да, тогда о чем же эта тема? И почему бы в ваших индикаторах в ftp://ftp.quik.ru/public/INDICATORS.zip просто не вставить "просто пропускайте их и все"? Делов-то.
валерий написал: Sergey Gorokhov , Индекс в OnCalculate(index). Конкретно, вот график с одной фишкой, пропуски не показывать, фильтр по дневной сессии. Какие свечи будет перебирать индекс? Только те что на графике?
OnCalculate вернет столько свечек сколько на графике.
Ну да, тогда о чем же эта тема? И почему бы в ваших индикаторах в ftp://ftp.quik.ru/public/INDICATORS.zip просто не вставить "просто пропускайте их и все"? Делов-то.
Дело в том, что это совсем не так просто, как пишет Сергей Горохов. Иначе это было бы сделано в примерах индикатора из архива. Нужно делать дополнительный буфер свечей, в котором вырезаны все пропуски. После чего именно по этому буферу производятся вычисления. Также потребуется оглавление свечей, которое позволяло бы соотносить свечи между исходными (с пропусками) и свечами из буфера. Причем ссылки должны быть в общем случае двунаправленные, в обе стороны. И после вычислений результат проецируется на исходную нумерацию свечей
Очевидно, что этот вопрос в архитектуре терминала был упущен (как и многие другие) и теперь разработчики предлагают обходить эту проблему пользователям самомтоятельно, если они хотят писать индикаторы грамотно. Либо писать только для случая, когда на графике наложен только один источник для расчета.
В общем, очевидное недоваренное мясо, признать которое они не в силах.
валерий написал: Sergey Gorokhov , Индекс в OnCalculate(index). Конкретно, вот график с одной фишкой, пропуски не показывать, фильтр по дневной сессии. Какие свечи будет перебирать индекс? Только те что на графике?
OnCalculate вернет столько свечек сколько на графике.
Будем надеяться, что сие есть стандарт. Вечный. Спасибо.
s_mike@rambler.ru написал: Дело в том, что это совсем не так просто, как пишет Сергей Горохов. Иначе это было бы сделано в примерах индикатора из архива. Нужно делать дополнительный буфер свечей,
Я именно об этом. А он делает вид что не понимает. В общем, спасение утопающих...
валерий, Ваш вопрос не понятен. Вы что-то сказали конкретно про вычисление пустых свечек, и Вам был дан такой ответ конкретно относящийся к необходимости вычисления пустых свечек. А что касается индикаторов, это вообще никак к ним не относится.
Как из индикатора определить общее количество свечей инструмента, на котором индикатор запущен? Не текущую свечу - index, а общее количество. Нужно вставить проверку, чтобы индикатор не производил обсчёт на исторических свечах.
В основных функциях Init(), OnCalculate(), OnDestroy() поставил вывод в текстовый лог основных значений свечей: index, T(), C(). Обнаружил, что OnCalculate перебирает все свечи два раза, при этом общее количество свечей во вторую итерацию иногда меняется, иногда нет. Как такое поведение можно объяснить?
Sergey Gorokhov написал: В основных функциях Init(), OnCalculate(), OnDestroy() поставил вывод в текстовый лог основных значений свечей: index, T(), C(). Обнаружил, что OnCalculate перебирает все свечи два раза, при этом общее количество свечей во вторую итерацию иногда меняется, иногда нет. Как такое поведение можно объяснить?
Могу посоветовать следующее: 1) Пустые свечи определяете по нулевому объему. ------------------------------- 2) примеры индикаторов написаны правильно и работают правильно при двух условиях а)на графике один инструмент b) графики не в реале. --------------------------- 3) Примеры написаны не для использования в роботах, а для технического анализа. поэтому они написаны не оптимально.
Settings = {
Name = "test",
line =
{
{
Name = "test",
Color = RGB(192,224,255),
Type = TYPE_LINE,
Width = 2
}
}
}
function Init()
local params = {"VERSION", "TRADEDATE", "SERVERTIME",
"LASTRECORDTIME", "NUMRECORDS", "LASTRECORD","LATERECORD",
"CONNECTION", "IPADDRESS", "IPPORT", "IPCOMMENT",
"SERVER", "SESSIONID", "USER", "USERID", "ORG", "MEMORY",
"LOCALTIME", "CONNECTIONTIME", "MESSAGESSENT", "ALLSENT",
"BYTESSENT", "BYTESPERSECSENT", "MESSAGESRECV", "BYTESRECV",
"ALLRECV", "BYTESPERSECRECV", "AVGSENT", "AVGRECV",
"LASTPINGTIME", "LASTPINGDURATION", "AVGPINGDURATION",
"MAXPINGTIME", "MAXPINGDURATION"}
logfile = io.open(getScriptPath() .. "/Logs/" .. Settings.Name..".log", "a+");
for key,v in ipairs(params) do
logfile:write(v .. " = " .. GetInfoParam(v) .. "\n")
end
logfile:flush();
return 1
end
function OnCalculate(index)
WriteLog ("OnCalc() ".."CandleExist("..index.."): "..tostring(CandleExist(index)).."; T("..index.."); "..isnil(toYYYYMMDDHHMMSS(T(index))," - ").."; C("..index.."): "..isnil(C(index),"-"));
return nil;
end
-- Пользовательcкие функции
function WriteLog(text)
logfile:write(tostring(os.date("%c",os.time())).." "..text.."\n");
logfile:flush();
LASTLOGSTRING = text;
end;
function isnil(a,b)
if a == nil then
return b
else
return a
end;
end;
function toYYYYMMDDHHMMSS(datetime)
if type(datetime) ~= "table" then
message("в функции toYYYYMMDDHHMMSS неверно задан параметр: datetime="..tostring(datetime))
return ""
else
local Res = tostring(datetime.year)
if #Res == 1 then Res = "000"..Res end
local month = tostring(datetime.month)
if #month == 1 then Res = Res.."0"..month; else Res = Res..month; end
local day = tostring(datetime.day)
if #day == 1 then Res = Res.."0"..day; else Res = Res..day; end
local hour = tostring(datetime.hour)
if #hour == 1 then Res = Res.."0"..hour; else Res = Res..hour; end
local minute = tostring(datetime.min)
if #minute == 1 then Res = Res.."0"..minute; else Res = Res..minute; end
local sec = tostring(datetime.sec);
if #sec == 1 then Res = Res.."0"..sec; else Res = Res..sec; end;
return Res
end
end --toYYYYMMDDHHMMSS
Эту функцию: ------------------ function isnil(a,b) if a == nil then return b else return a end; end; ------------------------ можно записать так: ------------------ function isnil(a,b) return a or b; end;
Василий Петров написал: Обнаружил, что OnCalculate перебирает все свечи два раза, при этом общее количество свечей во вторую итерацию иногда меняется, иногда нет. Как такое поведение можно объяснить?
Цитата
Sergey Gorokhov написал: Что-то похожее уже чинилось, проверьте поведение на актуальной версии, сейчас доступна версия 7.7.
Цитата
Sergey Gorokhov написал: Проблема изучается. Постараемся в ближайшее время дать ответ.
В основных функциях Init(), OnCalculate(), OnDestroy() поставил вывод в текстовый лог основных значений свечей: index, T(), C(). Обнаружил, что OnCalculate перебирает все свечи два раза, при этом общее количество свечей во вторую итерацию иногда меняется, иногда нет. Как такое поведение можно объяснить?
Ошибка будет исправлена в одной из очередных версий программы. Приносим извинения за причиненные неудобства.
В основных функциях Init(), OnCalculate(), OnDestroy() поставил вывод в текстовый лог основных значений свечей: index, T(), C(). Обнаружил, что OnCalculate перебирает все свечи два раза, при этом общее количество свечей во вторую итерацию иногда меняется, иногда нет. Как такое поведение можно объяснить?
Ошибка будет исправлена в одной из очередных версий программы. Приносим извинения за причиненные неудобства.
Будем ждать. К слову, у Гута-Банка на VERSION = 7.6.1.1 ровно та же ошибка.
валерий написал: Концепции Амиброкера это почемуто не противоречит и пользователей устраивает. Я же не сам это придумал. Любой индикатор это вообще то, чего реально нет. Это отражение реальности, а не сама реальность. Способов отражения, в том числе и пропусков, несчетное множество. А предложение позволяет пользователю выбрать или самое простое и ходовое zero-order hold или полную своду творчества или компромисс, когда по нулевым объемам можно выявить пропуски и как-то дополнить зох.
Восприятие мира человеком - это отражение реальности, а не сама реальность.
Нет свечки, тогда значению массива текущей даем предудыщее значение.
Код
if not CandleExist(index) then
CC[index] = CC[index - 1 ]
return nil
end
Если надо получить значение пршлой свечки, то сначала находим ближайшую существующую прошлую, через эту функцию
Код
function FindExistCandle (I)
local out = I
while not CandleExist(out) do
out = out - 1
end
return out
end
Код
local previous = index - 1
if not CandleExist(previous) then
previous = FindExistCandle(previous)
end
if C(index) > C(previous) then
Соорудил подобное при помощи рекурсивного вызова функции.
Код
function GetPrice (ind)
if ind ~ = 0 then
if CandleExist(ind) = = false then
return GetPrice(ind - 1 );
else
return С(ind)
end
else
return 0
end
end
Быстрее будет, если вместо поиска свечки назад, просто запоминать индекс последней существующей свечки. При отсутствии свечки брать сохраненный индекс.
"Очень" это своя база данных, тестер, робот, анализ прошедшего дня с сохранением в эксель. Конечно есть и минусы. В том числе визуализация ценовых рядов. Но зато это "очень" в амиброкере под управлением того же матлаба. Там на одном графике у меня до четырех стратегий по четыре варианта параметров. А в квике получилось только три и без визуализации параметров.
Николай Камынин написал: Быстрее будет, если вместо поиска свечки назад, просто запоминать индекс последней существующей свечки. При отсутствии свечки брать сохраненный индекс.
Василий Петров написал: Будем ждать. К слову, у Гута-Банка на VERSION = 7.6.1.1 ровно та же ошибка.
Поправка: не смотря на то, что в логах "SERVER = Информационно-торговая система QUIK "Гута-Банк"", на самом деле это логи реального счёта ВТБ24 на версии VERSION = 7.8.1.21. На нём ровно та же проблема - 2 обсчёта свечей.
вообще-то свечи - это разделение сделок по одинаковым временным интервалам. Поэтому если в каком-то интервале нет сделок то и свеча нулевая. Поэтому пустая свеча - это время без сделок. Если сделок нет, то свеча пустая и считать нечего. Поэтому правильно - ничего не изменять на пустых свечах. Но так как применение различных статистических методов к свечам вообще не корректно, то можно считать все, что угодно. ----------------------------- Как говорится в анекдоте: Там висит кирпич, туда ехать нельзя, но вам можно.
Николай Камынин написал: Быстрее будет, если вместо поиска свечки назад, просто запоминать индекс последней существующей свечки. При отсутствии свечки брать сохраненный индекс.
Возможно, но не всегда надо именно прошлую свечку. Часто надо -3, -2. Так что просто запоминать будет та еще конструкция. А эта функция универсальна, получив индекс бери любое значение свечи.
Хотелось бы иметь "железную" функцию получения ближайшей существующей свечи к идексу вниз и вверх.
Николай Камынин написал: Быстрее будет, если вместо поиска свечки назад, просто запоминать индекс последней существующей свечки. При отсутствии свечки брать сохраненный индекс.
Возможно, но не всегда надо именно прошлую свечку. Часто надо -3, -2. Так что просто запоминать будет та еще конструкция. А эта функция универсальна, получив индекс бери любое значение свечи.
Хотелось бы иметь "железную" функцию получения ближайшей существующей свечи к идексу вниз и вверх.
Здравствуйте!
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Добрый день. Я уже давно пользуюсь этими индикаторами, но у меня старая редакция. После выхода новой редакции я пытался их применить, у меня пошли ошибки, я бросил это дело и вернулся на старую редакцию INDICATORS.ZIP --- Сейчас сижу разбираюсь с новой версией. Ошибка выскакивает даже на том примере, который приведён в файле readme
Код
dofile(getScriptPath().."\\MA.lua")
function main()
func = MA()
t_id = AllocTable()
AddColumn(t_id,1,"Price",true,QTABLE_INT_TYPE,10)
AddColumn(t_id,2,"MA",true,QTABLE_INT_TYPE,10)
CreateWindow(t_id)
SetWindowCaption(t_id,"MA")
ds = CreateDataSource("TQBR", "LKOH", INTERVAL_M5)
sleep(1000)
message (""..ds:Size(),1)
for i=1,ds:Size() do
ma_out=func(i, {Period=3, Metod = EMA, VType=ANY}, ds)
tmp=InsertRow(t_id,-1)
SetCell(t_id,tmp,1,tostring(ds:C(i)),ds:C(i))
SetCell(t_id,tmp,2,tostring(ma_out),ma_out)
end
end
выскакивает message 3106 (количество свечек), а потом ошибка: