Blackninja (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Последовательность поступления индексов в callback для источника данных (выбор архитектуры скрипта), Поступают в строгом порядке или это не гарантируется?
 
Добрый день!

На текущий момент есть реализованный скрипт на Lua, но недавно задался вопросом правильности его архитектурной реализации.

Основной  принцип работы скрипта заключается в создании источника данных через  функцию CreateDataSource() и обработка поступающих индексов для расчета  индикаторов и принятия торгового решения.
При запуске скрипта  реализуется проход по истории всех индексов в источнике данных - это  реализовано самой платформой QUIK через последовательные вызовы callback() функции для всех индексов. Функция callback() - это просто  функция, которой передается индекс. При условии, что свеча пока не  закрылась может происходить множественный вызов функции callback() с  одним и тем же индексом.


Перед началом торговой сессии при  запуске скрипта необходимо произвести последовательный расчет всех  индексов, чтобы принять правильное решение. Сейчас я доверяю QUIK и его логике последовательного вызова callback() функции для всех индексов из источника данных. При НЕпоследовательном  поступлении индексов нельзя корректно рассчитать значения индикаторов.

В документации не нашел упоминания о последовательности поступления индексов в callback функцию.
То есть, индексы в callback() функцию поступают в строгом последовательном порядке или это не гарантируется?

Если  принять, что индексы потенциально могут поступать в callback() функцию в  произвольном порядке, то гарантируется только размер источника данных -  ds:Size(). То есть, нужно реагировать на изменение размера источника  данных, а не на вызов callback() функции, так как индекс может быть  старым.
Исходя из описанного выше встает вопрос выбора архитектуры скрипта (ниже приведу 2 варианта в псевдокоде для простоты):

Вариант 1 - Доверяем последовательности индексов

Код
is_run = false

function OnInit(script)
 is_run = true
end

function OnStop()
 is_run = false
end


function cb_for_ds(index)
-- получение нового индекса и его обработка, 
   if (last_processing_index>0 and ds:Size()>0 and last_processing_index< ds:Size()-1) then
      full_processing(index)
   end
end

function full_processing(index)
-- здесь выполняется тяжелая логика обработки нового индекса из источника данных с расчетом индикаторов и т.д. 
   
end


function main()
 
    ds = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)
    ds: SetUpdateCallback (cb_for_ds)

    while is_run do
 
   sleep(100)
    end
end



Вариант 2 - Нельзя доверять порядку индексов,  поступающих в  функцию callback. Надо самим контролировать  последовательность обработки.
Код
last_processing_index=0
is_run = false

function OnInit(script)
 is_run = true
end

function OnStop()
 is_run = false
end


function cb_for_ds( index )
-- получение нового индекса и выставление флага
   if (last_processing_index>0 and ds:Size()>0 and last_processing_index< ds:Size()-1) then
      get_new_index = true
   end
end

function full_processing()
-- здесь выполняется тяжелая логика обработки индекса (last_processing_index+1) из источника данных с расчетом индикаторов и т.д. 
   
   if (last_processing_index == (ds:Size()-1)) then
      return
   end
   
   new_processing_index = last_processing_index+1
   . . .
   . . .
   last_processing_index= new_processing_index
end


function main()
 
    ds = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)
    ds: SetUpdateCallback (cb_for_ds)

    while is_run do
 
   if (get_new_index == true) then
      full_processing()
   end

   sleep(100)
    end
end




Вопрос:

Гарантируется ли строгий  линейный порядок поступления индексов источника данных в callback()  функцию или вызов callback()-функции стоит рассматривать только как  событие выставления флага, после которого необходимо проверить реальное  поступление нового индекса (через увеличение размера) и потом его  обработать?


Любые комментарии и ссылки на документацию будут полезны.
Благодарю заранее за ответы!
Как правильно установить и запустить несколько терминалов QUIK на одном компьютере для доступа к разным счетам одного брокера?
 
Добрый день!

У меня в одном брокере имеется несколько брокерских счетов: ИИС и обычный брокерский счет. Для каждого счета необходимо настраивать и запускать отдельный терминал. Я скачал инсталлятор терминала QUIK от брокера и установил для одного счета.

Хочу установить второй терминал QUIK для запуска на том же компьютере и в сеансе того же пользователя, то есть параллельно 2 терминала. Уже не помню как я ставил 2 терминала, но иногда наблюдаются разрывы связи и непонятно по какой причине. Возможно, я что-то неправильно сделал и брокер разрывает соединение на сервере.

Вопросы:
1) Как правильно запускать несколько терминалов QUIK на одном компьютере для доступа к разным счетам одного брокера, чтобы терминалы не конфликтовали между собой? То есть, провести установку 1 раз (например, в директорию c:\QUIK), а потом просто скопировать директорию c:\QUIK в c:\QUIK2 ? Или нужно провести 2 установки из дистрибутива в 2 разные директории?

2) При подключении терминала предлагается выбрать сервер. Нужно ли выбирать разные сервера при подключении из 2 разных терминалов? Например, в первом терминале выбираем Сервер1, а во втором терминале выбираем Сервер2.


Спасибо!
Ошибка при создании заявки на субсчете
 
Добрый день!

Использую QUIK 9.2.3.15. Попробовал создать заявку на субсчете, но получил ошибку: "Указанный счет депо не найден: 512514/17FZM"

Номер счета беру из колонки "Код клиента" в таблице "Клиентский портфель"

Формирование таблицы заявки приведено ниже:
Код
my_broker_account = "512514/17FZM"

 transaction = {
 ["ACCOUNT"]=my_broker_account,
 ["CLIENT_CODE"]="unnecessary_param",
 ["TYPE"]="L",
 ["TRANS_ID"]=trans_id,
 ["CLASSCODE"]=ticker_class_code,
 ["SECCODE"]=ticker_sec_code,
 ["ACTION"]="NEW_ORDER",
 ["OPERATION"]=operation,
 ["PRICE"]=tostring(price),
 ["QUANTITY"]=tostring(qty1),
 ["EXPIRY_DATE"]="TODAY"
 }
 
 
 ErrOrder = sendTransaction(transaction)

Вопросы:

1) Использую русифицированный интерфейс. Имеет ли значение как указывать поля в таблице на английском или русском ("ACCOUNT" или "Торговый счет")? На английском удобнее и привычнее.  

2) Что я делаю неправильно и в чем ошибка? Может субсчета как-то по-другому указывать нужно.

Заранее спасибо.  
Ошибка в данных источника DataSource (брокер ВТБ)
 
Цитата
Anton написал:
Цитата
Blackninja написал:
идут данные от 05.05.2021 и потом почему-то начинаются 06.09.2021
Попробую угадать. Пятого мая квик подключался в последний раз, а потом только 1 октября. Подключившись, он ровно 3000 свечек накачал, как раз это будет шестое сентября 18:05
Запускаю скрипт каждый раз, поэтому квик перезапускается сейчас, а не когда-то давно... это в источнике DataSource такие данные... и ситуация стабильна... такое ощущение, что проблема именно на стороне брокера ВТБ    
Ошибка в данных источника DataSource (брокер ВТБ)
 
Цитата
Sergey Gorokhov написал:
А если открыть график и посмотреть, там так же?
На график эти данные не выводил. Получил их из источника и вывел для просмотра через DebugView
Ошибка в данных источника DataSource (брокер ВТБ)
 
Написал простенький скрипт на LUA для получения данных M5 и теста стратегии для акций Сбербанка (SBER).

Код
function main()
local t_M5

ticker_class_code = "TQBR"
ticker_sec_code = "SBER"

ds_M5, error_desc = CreateDataSource(ticker_class_code, ticker_sec_code, INTERVAL_M5)
if (ds_M5 == nil) then
MyPrintDbgStr("Error in getting DS INTERVAL_M5: " .. error_desc)
end

for index_M5=1,ds_M5:Size() do
t_M5 = ds_M5:T(index_M5)
str1 = string.format("M5_min_time %02d.%02d.%04d %02d:%02d %d", t_M5.day, t_M5.month, t_M5.year, t_M5.hour, t_M5.min, index_M5)
MyPrintDbgStr(str1)
end

if true then
return
end

end


При выводе в DebugView вижу, что данные сбиваются при условии правильной последовательности индексов таблицы.

Вот так выглядят "битые" данные:
Код
[14624] <QUIK> M5_min_time 05.05.2021 23:30 6583
[14624] <QUIK> M5_min_time 05.05.2021 23:35 6584
[14624] <QUIK> M5_min_time 05.05.2021 23:40 6585
[14624] <QUIK> M5_min_time 05.05.2021 23:45 6586
[14624] <QUIK> M5_min_time 06.09.2021 18:05 6587
[14624] <QUIK> M5_min_time 06.09.2021 18:10 6588
[14624] <QUIK> M5_min_time 06.09.2021 18:15 6589
[14624] <QUIK> M5_min_time 06.09.2021 18:20 6590
[14624] <QUIK> M5_min_time 06.09.2021 18:25 6591

То есть, идут данные от 05.05.2021 и потом почему-то начинаются 06.09.2021.
Полный вывод доступен по ссылке (https://drive.google.com/file/d/1s103BzpxuGWVHgzYhvLBIwwq1LmAqJiX/view?usp=sharing).

Брокер ВТБ

Подскажите в чем проблема и можно ли ее как-то исправить?

Заранее спасибо.
 
Страницы: 1
Наверх