Sergey Gorokhov написал: Здравствуйте, Приведите исходные коды скрипта
Выслал код на . Спасибо
Подгрузка старых данных при переподключении
Пользователь
Сообщений: Регистрация: 26.02.2015
25.05.2016 18:37:41
Добрый день! У меня система работает на данных 60 мин. Данные обрабатываются по колбэку: ds[1]:SetUpdateCallback(function(index) cb(index,v.idx, v.classcode,k) end) , в общем все стандартно. В функции рассчитываются максимумы и минимумы за определенные периоды. Заметил, что при переподключении (вследствие пропадания инета или еще почему-то), когда оно происходит между часами (т е в тот момент, когда окончился один час и начался другой и должен идти перерасчет), в максимумы и минимумы присваиваются абсолютно "левые" значения, которые не имеют отношения к текущей цене. При более тщательном рассмотрении можно заметить, что это какие-то давние цены (чуть ли не прошлого года). Еще раз подчеркну, что это все происходит в те неудачные моменты, когда квик переподключается к серверу в момент поступления новой свечки. В остальном все работает отлично. В самой функции, которая вызывается коллбэком, есть цикл, копающий "в глубь" по данным для расчета индикаторов. Но факт остается фактом, при переподключении между часами (между дискретами по времени, равными таймфремйму) система "ловит" старые данные. Как это обойти, или в чем ошибка? Спасибо
Синхронизация данных от SetUpdateCallback
Пользователь
Сообщений: Регистрация: 26.02.2015
05.02.2016 20:10:06
Суть такова: из 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 ..............
end
end
Синхронизация данных от SetUpdateCallback
Пользователь
Сообщений: Регистрация: 26.02.2015
04.02.2016 20:50:05
Попробую еще раз) Очередной вызов коллбэка происходит тогда, когда еще не закончились обрабатываться предыдущие данные, которые его вызвали. как с этим бороться?
Синхронизация данных от SetUpdateCallback
Пользователь
Сообщений: Регистрация: 26.02.2015
04.02.2016 18:12:15
Добрый день! Следующая ситуация: я получаю данные через SetUpdateCallback(function(index) cb(index,v.idx, v.classcode,k) end), там два инструмента. Данные приходят с разными задержками (в смысле срабатывания котировок). Это приводит к тому, что определенный кусок кода в функции cb (index,v.idx, v.classcode,k) у меня не исполняется, т к новые данные уже успели изменить значения переменных, но сама ф-я до конца не исполнилась. Наверняка есть локеры, которые не позволяют срабатывать коллбэку, пока не обработались старые значения. Наверное это не слишком оптимально, с точки зрения быстродействия, но в моем случае это не критично... Спасибо. ЗЫ заранее прошу прощения, если эта тема уже обсуждалась, т к проблема актуальная. но я не нашел.
Автоматический запуск скрипта при запуске QUIK
Пользователь
Сообщений: Регистрация: 26.02.2015
22.01.2016 18:37:46
Имеется в виду, если квик полностью перегружается, по разным причинам. Например, перегрузилась операционка незапланированно.
Автоматический запуск скрипта при запуске QUIK
Пользователь
Сообщений: Регистрация: 26.02.2015
22.01.2016 18:27:26
Добрый день!
Есть ли возможность задать квику натройку, чтобы он при своем запуске запускал также и луа-скрипт? Спасибо.
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. Жаль. Спасибо
Дезинформировал себя и, возможно, не только. В общем, к таймфрейму привязки здесь нет - при его изменении пересчет тоже меняется, все просто зависит от того, на сколько дискретизируем время. Единственный недостаток - не удаляются старые метки с прошлого таймфрейма, приходится перегружать индюк. Может есть возможность этого не делать?)
Индикатор с метками на графике
Пользователь
Сообщений: Регистрация: 26.02.2015
29.12.2015 22:15:05
Цитата
s_mike@rambler.ru пишет: 1. Поставить метку можно только на том времени, на котором существует свеча. 2. Раскрашивать свечи невозможно.
1.Т. е. метки расставить без привязки ко времени и, соответственно, к таймфрейму - нельзя. Т. е таймфрейм задается жестко. В общем, логично) 2. Жаль. Спасибо
Индикатор с метками на графике
Пользователь
Сообщений: Регистрация: 26.02.2015
29.12.2015 20:48:31
Здравствуйте! Есть ли возможность создать индикатор на LUA,чтобы он мог ставить метки на график в определенных точках (выявленный свечной паттерн), независимо от временного масштаба, т. е., например, привязка к дате и времени в функции AddLabel зависят от времени и привязывеются к ней жестко (минутки и часы разделить здесь не получится). И еще вопрос, тоже может чайниковский, можно ли окрашивать определенные свечки на графике (выявленные паттерн). Все это как индикатор. Спасибо
Время отклика заявки
Пользователь
Сообщений: Регистрация: 26.02.2015
16.11.2015 18:39:30
Спасибо
Время отклика заявки
Пользователь
Сообщений: Регистрация: 26.02.2015
16.11.2015 12:04:46
Добрый день! Подскажите пожалуйста, как получить время выставления заявки в торговую систему биржи. Можно ли это сделать вообще? На сколько я понимаю, OnTransReply () может вернуть время выставления заявки на сервер QUIK?
Индикатор связывающий два инструмента
Пользователь
Сообщений: Регистрация: 26.02.2015
08.07.2015 17:26:56
Добрый день! А можно ли сделать так, чтобы индикатор пересчитывался по тикам, а не по ценам закрытия?
Вопрос по ЛУА (округление)
Пользователь
Сообщений: Регистрация: 26.02.2015
05.03.2015 16:24:31
Цитата
Дмитрий пишет: А то, какие выражения вы используете при сравнении этих чисел, никак не повлияет на Ваши дальнейшие вычисления, так как значения этих чисел в результате сравнения все равно не изменятся.
Значения не изменятся, но мне нужно чтобы сами числа были такие, какие я для себя вижу, без дополнительных значений в n-цатом разряде.
Максим пишет: но потом нужно делать арифметические операции, и вновь эта проблема всплывет
А что мешает делать эти операции с исходными числами, без всяких преобразований?
Мне нужно оценить, отличатся ли цена на шаг цены или более. Шаг цены 0.0001. допустим идет сравнение по разности текщей цены и текущего бида в стакане. Дополнительные разряды искажают инфу.
Вопрос по ЛУА (округление)
Пользователь
Сообщений: Регистрация: 26.02.2015
05.03.2015 16:00:26
Цитата
Дмитрий пишет: Выражение даже можно упростить: qt.bid.price*PRICE_SCALE == math.floor(current_order_price_buy*PRICE_SCALE + 0.5)
Дмитрий, для сравнения это подойдет, но потом нужно делать арифметические операции, и вновь эта проблема всплывет. Я тут нашел функцию:
Возвращает два числа, Целую чать x и дробную часть x.
Как она возвращает дробную часть - я не совсем понял, но целую часть она возвращает хорошо). Если теперь записать так: math.modf(qt.bid[i].price*PRICE_SCALE)/PRICE_SCALE==math.modf(current_order_price_buy*PRICE_SCALE)/PRICE_SCALE
то числа будут совпадать.
Вопрос по ЛУА (округление)
Пользователь
Сообщений: Регистрация: 26.02.2015
05.03.2015 15:15:25
Цитата
Дмитрий пишет: Можно вместо tonumber(qt.bid.price)==tonumber(current_order_price_buy) попробовать написать qt.bid.price == tostring(current_order_price_buy)
Так тоже не проходит. нужно отрубить все разряды вплоть до 4-го после запятой
Вопрос по ЛУА (округление)
Пользователь
Сообщений: Регистрация: 26.02.2015
05.03.2015 15:05:32
Цитата
Дмитрий пишет: И кстати значение current_order_price_buy=91.7027 откуда берется? Если в результате какой-то арифметической операции, то разряды. дающие разницу между этими переменными, могут быть просто не видны, т.к. больше 6 разрядов после точки не отображается.
Да, Вы верно говорите, мне кажется все дело именно в это переменной. А как просто взять и обрубить эти разряды?
Вопрос по ЛУА (округление)
Пользователь
Сообщений: Регистрация: 26.02.2015
05.03.2015 15:04:10
Цитата
Дмитрий пишет: А если умножать оба числа на 10000 перед сравнением ?
Это делал math.floor((math.floor(tonumber(qt.bid[i].price)*PRICE_SCALE)/PRICE_SCALE В итоге получается число меньше: вместо 91.7027 получилось 91.7026
Вопрос по ЛУА (округление)
Пользователь
Сообщений: Регистрация: 26.02.2015
05.03.2015 14:55:02
Здравствуйте! Довольно чайниковский вопрос, но разобраться не могу. Возникает проблема со сравнением двух чисел и арифметическими операциями. Есть цена из стакана 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(), иначе терминал после этого виснет.
Выставляйте заявку в теле main(), а не в колбеках.
Такая уж архитектура программы. Хотелось бы ее сохранить.
Задержка в исполнении кода, Как оформить программную задержку
Пользователь
Сообщений: Регистрация: 26.02.2015
26.02.2015 15:42:44
Добрый день!
Подскажите пожалуйста, как в исполнении кода вставить задержку, только не sleep(), иначе терминал после этого виснет. Например, нужна задержка в 1 мин, которая вставляется перед исполнением заявки.