Добрый день! У меня система работает на данных 60 мин. Данные обрабатываются по колбэку: ds[1]:SetUpdateCallback(function(index) cb(index,v.idx, v.classcode,k) end) , в общем все стандартно. В функции рассчитываются максимумы и минимумы за определенные периоды. Заметил, что при переподключении (вследствие пропадания инета или еще почему-то), когда оно происходит между часами (т е в тот момент, когда окончился один час и начался другой и должен идти перерасчет), в максимумы и минимумы присваиваются абсолютно "левые" значения, которые не имеют отношения к текущей цене. При более тщательном рассмотрении можно заметить, что это какие-то давние цены (чуть ли не прошлого года). Еще раз подчеркну, что это все происходит в те неудачные моменты, когда квик переподключается к серверу в момент поступления новой свечки. В остальном все работает отлично. В самой функции, которая вызывается коллбэком, есть цикл, копающий "в глубь" по данным для расчета индикаторов. Но факт остается фактом, при переподключении между часами (между дискретами по времени, равными таймфремйму) система "ловит" старые данные. Как это обойти, или в чем ошибка? Спасибо
Суть такова: из main дергаются данные по доллару и евро, коллбэк cb их обрабатывает. как только пришла новая свеча (1 час масштаб), я выравниваю время в коллбеке по доллару и евро, чтобы он не перерасчитывался многократно полностью. Для этого стоит условие на проверку выравнивания времени (предыдущее время сравнивается с текущим). Однако, как только время по обоим инструментам выравнивается, кусок кода, который стоит после условных блоков с обработкой данных от инструментов, не исполняется, т к уже срабатывает return, стоящий в начале коллбэка. Т. е. получается ситуация, что время выравнялось, но код до конца не успел исполниться, т к произошел новый вызов, который делает выход из коллбека до того, как успел отработать последний кусок кода.
function main() ............ local i = 1 for k,v in pairs(shares) do ds[i],er= CreateDataSource(v.classcode,k, INTERVAL_H1) v.idx = i if er==nil then ds[i]:SetUpdateCallback(function(index) cb(index,v.idx, v.classcode,k) end) toLog(log,"ds added i="..i.." classcode:"..v.classcode.." seccode:"..k) i=i+1 end if er~=nil then Log(log,"er="..er) end end
while is_run do sleep(1000) end
.................. end
function cb( index , ds_index, classcode, seccode)
local t = ds[ds_index]:T(index-1) local h = t.hour local curhms = h*100
if (curhms==oldt_si and curhms==oldt_eu ) then return end
if (ds_index==1 and curhms~=oldt_eu) then oldt_eu=curhms ........................... end
if (ds_index==2 and curhms~=oldt_si) then oldt_si=curhms ........................... end --этот кусок кода не исполняется if (curhms==oldt_si and curhms==oldt_eu and data.eq==0 and GetEquity==true) then ..............
Попробую еще раз) Очередной вызов коллбэка происходит тогда, когда еще не закончились обрабатываться предыдущие данные, которые его вызвали. как с этим бороться?
Добрый день! Следующая ситуация: я получаю данные через SetUpdateCallback(function(index) cb(index,v.idx, v.classcode,k) end), там два инструмента. Данные приходят с разными задержками (в смысле срабатывания котировок). Это приводит к тому, что определенный кусок кода в функции cb (index,v.idx, v.classcode,k) у меня не исполняется, т к новые данные уже успели изменить значения переменных, но сама ф-я до конца не исполнилась. Наверняка есть локеры, которые не позволяют срабатывать коллбэку, пока не обработались старые значения. Наверное это не слишком оптимально, с точки зрения быстродействия, но в моем случае это не критично... Спасибо. ЗЫ заранее прошу прощения, если эта тема уже обсуждалась, т к проблема актуальная. но я не нашел.
s_mike@rambler.ru пишет: 1. Поставить метку можно только на том времени, на котором существует свеча. 2. Раскрашивать свечи невозможно.
1.Т. е. метки расставить без привязки ко времени и, соответственно, к таймфрейму - нельзя. Т. е таймфрейм задается жестко. В общем, логично) 2. Жаль. Спасибо
Дезинформировал себя и, возможно, не только. В общем, к таймфрейму привязки здесь нет - при его изменении пересчет тоже меняется, все просто зависит от того, на сколько дискретизируем время. Единственный недостаток - не удаляются старые метки с прошлого таймфрейма, приходится перегружать индюк. Может есть возможность этого не делать?)
function oncalculate(indx) if indx == 1 then delete_labels() end .......... end
s_mike@rambler.ru пишет: 1. Поставить метку можно только на том времени, на котором существует свеча. 2. Раскрашивать свечи невозможно.
1.Т. е. метки расставить без привязки ко времени и, соответственно, к таймфрейму - нельзя. Т. е таймфрейм задается жестко. В общем, логично) 2. Жаль. Спасибо
Дезинформировал себя и, возможно, не только. В общем, к таймфрейму привязки здесь нет - при его изменении пересчет тоже меняется, все просто зависит от того, на сколько дискретизируем время. Единственный недостаток - не удаляются старые метки с прошлого таймфрейма, приходится перегружать индюк. Может есть возможность этого не делать?)
s_mike@rambler.ru пишет: 1. Поставить метку можно только на том времени, на котором существует свеча. 2. Раскрашивать свечи невозможно.
1.Т. е. метки расставить без привязки ко времени и, соответственно, к таймфрейму - нельзя. Т. е таймфрейм задается жестко. В общем, логично) 2. Жаль. Спасибо
Здравствуйте! Есть ли возможность создать индикатор на LUA,чтобы он мог ставить метки на график в определенных точках (выявленный свечной паттерн), независимо от временного масштаба, т. е., например, привязка к дате и времени в функции AddLabel зависят от времени и привязывеются к ней жестко (минутки и часы разделить здесь не получится). И еще вопрос, тоже может чайниковский, можно ли окрашивать определенные свечки на графике (выявленные паттерн). Все это как индикатор. Спасибо
Добрый день! Подскажите пожалуйста, как получить время выставления заявки в торговую систему биржи. Можно ли это сделать вообще? На сколько я понимаю, OnTransReply () может вернуть время выставления заявки на сервер QUIK?
Дмитрий пишет: А то, какие выражения вы используете при сравнении этих чисел, никак не повлияет на Ваши дальнейшие вычисления, так как значения этих чисел в результате сравнения все равно не изменятся.
Значения не изменятся, но мне нужно чтобы сами числа были такие, какие я для себя вижу, без дополнительных значений в n-цатом разряде.
Максим пишет: но потом нужно делать арифметические операции, и вновь эта проблема всплывет
А что мешает делать эти операции с исходными числами, без всяких преобразований?
Мне нужно оценить, отличатся ли цена на шаг цены или более. Шаг цены 0.0001. допустим идет сравнение по разности текщей цены и текущего бида в стакане. Дополнительные разряды искажают инфу.
Дмитрий пишет: Выражение даже можно упростить: qt.bid.price*PRICE_SCALE == math.floor(current_order_price_buy*PRICE_SCALE + 0.5)
Дмитрий, для сравнения это подойдет, но потом нужно делать арифметические операции, и вновь эта проблема всплывет. Я тут нашел функцию:
math.modf (x) Возвращает два числа, Целую чать x и дробную часть x.
Как она возвращает дробную часть - я не совсем понял, но целую часть она возвращает хорошо). Если теперь записать так: math.modf(qt.bid[i].price*PRICE_SCALE)/PRICE_SCALE==math.modf(current_order_price_buy*PRICE_SCALE)/PRICE_SCALE
Дмитрий пишет: Можно вместо tonumber(qt.bid.price)==tonumber(current_order_price_buy) попробовать написать qt.bid.price == tostring(current_order_price_buy)
Так тоже не проходит. нужно отрубить все разряды вплоть до 4-го после запятой
Дмитрий пишет: И кстати значение current_order_price_buy=91.7027 откуда берется? Если в результате какой-то арифметической операции, то разряды. дающие разницу между этими переменными, могут быть просто не видны, т.к. больше 6 разрядов после точки не отображается.
Да, Вы верно говорите, мне кажется все дело именно в это переменной. А как просто взять и обрубить эти разряды?
Здравствуйте! Довольно чайниковский вопрос, но разобраться не могу. Возникает проблема со сравнением двух чисел и арифметическими операциями. Есть цена из стакана qt.bid[i].price=91.702700. И есть цена current_order_price_buy=91.7027 (визуально совпадают) Однако их сравнение tonumber(qt.bid[i].price)==tonumber(current_order_price_buy) не происходит! При этом разность этих чисел равна diff=-1.4210854715202e-014 Как сделать так, чтобы они все же совпадали, т е какими видятся, такими были и фактически.
Подскажите пожалуйста, как в исполнении кода вставить задержку, только не sleep(), иначе терминал после этого виснет. Например, нужна задержка в 1 мин, которая вставляется перед исполнением заявки.