Есть желание поэкспериментировать в выходной день, но в выходной день DS:SetUpdateCallback(....) не приходят, но мы можем тиковый график сохранить в файл. Для имитации SetUpdateCallback(....) я хочу с помощью луа читать файл с тиковыми значениями (построчно) и заносить в DS. Ввиду отсутствия опыта, прошу помочь, как это реализовать - чтение из файла и введение новых значений в DS.
Другими словами (чтобы крестьянам было понятно), например за 1 сек. я по варианту 1 и 2 получу данные (например) 10 раз?, т.е. получаемые данные не зависят от интервала (от интервала зависит организация предыдущих данных по временным интервалам)
Возник такой вопрос: Есть разница в частоте получения данных по разным интервалам вариант 1 -> CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL_M1) вариант 2 -> CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL_TICK)
Разница в организации данных (минутные свечи при INTERVAL_M1) понятна.
Есть несколько файлов, во всех примерно один набор переменных, функций. При корректировке приходится менять везде, поэтому появилась идея -> определить все общие переменные и функции в одном файле и включать его/их в файл основной программы. Какие возможны проблемы при таком подходе (видимость переменных, функций .....)?
ЗЫ Вопрос теоретический, к квику отношения не имеющий, но боюсь, что моего английского не хватит для полного понимания документации на луа, думаю, что это поможет многим начинающим избавиться от мартышкиного труда.
Еще один вопрос. 1 отправка транзакции на сервер Идентификатор транзакции ->TRANS_ID 2 по OnTransReply(trans_reply) Получаем номер заявки ->orderNum = trans_reply.order_num
Вопрос: Если OnTransReply не дойдет, то как узнать номер заявки, которая была выставлена по транзакции TRANS_ID?
https://forum.quik.ru/messages/forum10/message11477/topic996/#message11477 Вот в этом примере в ф-ции заполняются только эти поля local transaction={ ["TRANS_ID"]=tostring(1000*os.clock()), ["ACTION"]="KILL_ORDER", ["CLASSCODE"]=classCode, ["SECCODE"]=secCode, ["ORDER_KEY"]=tostring(getItem(ord,orders[i]).order_num) } Для не посвященного сплошной мрак
Добрый день Не могу разобраться я выставил заявку (не смотрите, что она рыночная) local Transaction={ ['TRANS_ID'] = tostring(TRANS_ID), -- Номер транзакции ['ACCOUNT'] = ACCOUNT, -- Код счета ['CLASSCODE'] = CLASS_CODE, -- Код класса ['SECCODE'] = SEC_CODE, -- Код инструмента ['ACTION'] = "NEW_ORDER", -- Тип транзакции ('NEW_ORDER' - новая заявка) ['OPERATION'] = "S", -- Операция ('B' - buy, или 'S' - sell) ['TYPE'] = "M", -- Тип ('L' - лимитированная, 'M' - рыночная) ['QUANTITY'] = "1", -- Количество ['PRICE'] = tostring(OpenPrice) -- Цена }
Теперь мне надо ее снять local Transaction={ ['TRANS_ID'] = tostring(TRANS_ID), -- Номер транзакции ['ACCOUNT'] = ACCOUNT, -- Код счета ['CLASSCODE'] = CLASS_CODE, -- Код класса ['SECCODE'] = SEC_CODE, -- Код инструмента ['ACTION'] = "KILL_ORDER", -- Тип транзакции ('NEW_ORDER' - новая заявка) ['OPERATION'] = "B", -- Операция ('B' - buy, или 'S' - sell) ['TYPE'] = "M", -- Тип ('L' - лимитированная, 'M' - рыночная) ['QUANTITY'] = "1", -- Количество ['PRICE'] = "0" -- Цена ["ORDER_KEY"] = TRANS_ID_OLD -- "<номер снимаемой заявки>" }
1. Какие варианты снятия существуют: 1-перебор таблицы заявок, 2-снятие по ["ORDER_KEY"], 3-какие еще? 2. не могу найти описание ВСЕХ полей таблицы Transaction, в одних примерах нет поля ["ORDER_KEY"], в других оно есть 3 при выставлении определенных видов заявок, требуется заполнение полей, которые лишены смысла при таком типе заявки и эти поля не помечены как "обязательные" 4.Если я устанавливаю ['ACTION'] = "KILL_ORDER", то такие поля как OPERATION, TYPE, QUANTITY, PRICE (может и другие) вообще теряют смысл? Важно только поле ORDER_KEY - номер снимаемой заявки(если я правильно понимаю назначение этого поля), или и другие поля необходимо заполнять?.
Для тех.поддержки по поводу хелпа к луа Я, думаю, тут не так много людей, которые пишут что-то подобное игре в "крестики-нолики". Пример этой программы, безусловно, интересен и позволит расширить функционал интерфейса программ на Lua, но хотелось бы видеть примеры реализации простейших вещей: выставление заявок(рыночных, лимитированных, условных,...), снятие этих заявок, отслеживание исполнения заявок.
Теоретическая разница получения данных CreateDataSource+SetUpdateCallback или getNumCandles()+getCandlesByIndex(), В чем разница получения данных 1 способом и 2 способом
При создании ds в создателе/конструкторе указывается временной интервал графика INTERVAL_M1 ds1 = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1, "last") Это меня немножко запутало, я посчитал, что это интервал передачи данных, а на самом деле формирование свечей по времени - каждая свеча - INTERVAL_M1. Теоретически, по времени, есть разница между колбэком и таймером (sleep()), а практически разница заметна? может кто проводил измерения/исследования? Какой вариант предпочтительней: SetUpdateCallback или sleep()+getNumCandles()+getCandlesByIndex()? Возможно SetUpdateCallback при не сильно нагруженных вычислениях/обработке будет меньше грузить машину и будет грузить только по существу?
Теоретическая разница получения данных CreateDataSource+SetUpdateCallback или getNumCandles()+getCandlesByIndex(), В чем разница получения данных 1 способом и 2 способом
Николай Камынин написал: CreateDataSource+SetUpdateCallback - получаем данный в момент прихода их с сервера,
Т.е если таймфрейм установлен в 3 минуты - то получение данных ~ 1 раз в 3 минуты, т.е. объективную информацию по последней свечке(текущей) мы не знаем, знаем только по предпоследней?
Хочу знать о заявке все: принята сервером, поставлена в очередь, исполнена частично(сколько сталось), исполнена полностью, снята(пользователем/системой) Я представляю такой алгоритм 1. sendTransaction() - отправляем на сервер 2. OnTransReply(trans_reply) - ждем и анализируем состояние транзакции. Если 3 то транзакция выполнена (я считаю, что заявка поставлена в очередь.) 3. Отслеживать исполнение заявки частичное/полное мне надо с помощью OnOrder() или OnTrade() и в чем разница между этими функциями? 4 Что бы снять/изменить заявку мне надо использовать sendTransaction() или что? По какому параметру определять, что это одна и та же заявка?
Теоретическая разница получения данных CreateDataSource+SetUpdateCallback или getNumCandles()+getCandlesByIndex(), В чем разница получения данных 1 способом и 2 способом
Добрый вечер, Я в луа не силен, поэтому додумываю существующие варианты. Нашел очередь, ее и додумывал :) . В очереди - при добавлении нового элемента - предыдущие элементы сдвигаются на шаг. Будет ли реализовываться это в вашем варианте - не знаю в силу недостаточности знаний луа. За пример кода - спасибо!
Добрый день В прошлой версии форума я задавал вопрос про массивы и очереди, так вот - разобрался!!! Выкладываю код, может кому понадобится ********************************* Queue = {}
function Queue.new(q_size) return { first = 0, last = -1, max_size = q_size } end
function Queue.push( queue, value ) queue.last = queue.last + 1 queue[queue.last] = value
if queue.last >= queue.max_size then local val = queue[queue.first] queue[queue.first] = nil queue.first = queue.first + 1 end end
function Queue.pop( queue ) if queue.first > queue.last then return nil end
local val = queue[queue.first] queue[queue.first] = nil queue.first = queue.first + 1 return val end
function Queue.empty( queue ) return queue.first > queue.last end
function Queue.get( queue, pos) if queue.first > queue.last then return nil end if pos > queue.last then return nil end
local val = queue[queue.first + pos] return val end ********************************* Использование: q = Queue.new(5) -> Создаем очередь фиксированной длины, в данном случае - 5 элементов. По мере добавления новых элементов, лишние(свыше 5) удаляются qq = Queue.new() -> Создаем очередь бесконечной длины v1 = Queue.get(q,0) -> Доступ к элементу v2 = Queue.get(q,1) -> Доступ к элементу v3 = Queue.get(q,2) -> Доступ к элементу v4 = Queue.get(q,3) -> Доступ к элементу v5 = Queue.get(q,4) -> Доступ к элементу v6 = Queue.get(q,5) -> Доступ к элементу
Если ГУРУ заметят ошибки в коде - прошу высказать!!!