Ответы на вопросы

Ответы на вопросы | Тест lua скрипта на исторических данных возможен? Как?

Тест lua скрипта на исторических данных возможен? Как?
★2
14 комментариев
getCandlesByIndex Функция предназначена для получения информации о свечках по идентификатору, необходимо нужному графику назначить уникальный идентификатор, нужный график должен быть открыт.
-- Функция предназначена для получения КОЛИЧЕСТВА ЛИНИЙ в графике (индикаторе) по выбранному идентификатору
getLinesCount(tag); -- Возвращает число
   -- tag - (STRING) идентификатор графика (индикатора), о котором писалось выше
 
-- Функция предназначена для получения информации о КОЛИЧЕСТВЕ СВЕЧЕЙ по выбранному идентификатору
getNumCandles(tag); -- Возвращает число
   -- tag - (STRING) идентификатор графика (индикатора), о котором писалось выше
 
-- Функция предназначена для получения информации о свечах по идентификатору (заказ данных для построения графика функция не осуществляет, поэтому для успешного доступа нужный график должен быть открыт)
t, n, l = getCandlesByIndex (tag, line, first_candle, count);
   -- Параметры:
      -- tag          – (STRING) строковый идентификатор графика или индикатора 
      -- line         – (NUMBER) номер линии графика или индикатора. Первая линия имеет номер 0 
      -- first_candle – (NUMBER) индекс первой свечи. !!! ПЕРВАЯ (САМАЯ ЛЕВАЯ) СВЕЧКА ИМЕЕТ ИНДЕКС 0 !!!
      -- count        – (NUMBER) количество запрашиваемых свечей
   -- Возвращаемые значения:
      -- t – таблица, содержащая запрашиваемые свечи, пример работы: 
         local O = t[i].open; -- Получить значение Open для указанной свечи (цена открытия свечи)
         local H = t[i].high; -- Получить значение High для указанной свечи (наибольшая цена свечи)
         local L = t[i].low; -- Получить значение Low для указанной свечи (наименьшая цена свечи)
         local C = t[i].close; -- Получить значение Close для указанной свечи (цена закрытия свечи)
         local V = t[i].volume; -- Получить значение Volume для указанной свечи (объем сделок в свече)
         local T = t[i].datetime; -- Получить значение datetime для указанной свечи
            -- Где i - индекс свечи от 0 до n-1
      -- n – количество свечей в таблице t
      -- l – легенда (подпись) графика
avatar
luks sluk, спасибо! Вариант...
Таймфрейм, соответственно, тот, который открыт на графике? И минимальный — 1 мин.?
И получается нужно ручками делать цикл, где от 0 до getNumCandles() — 1 будет вызываться рабочая функция скрипта? 
И сделки как таковые нужно «имитировать», ну и результаты сбрасывать в Лог? (это я сейчас и так делаю на реальных данных для тестирования внутри торгового дня)
но тестировать lua на исторических данных это как гланды удалять через задницу
Саханов Виталий, это да, но я сунулся в TSLab, а там еще похлеще будет… Во всяком случае там с наскоку не разберешься… И навыки программирования не особо в помощь. Я даже не понял пока — какие навыки там были бы полезны… )
Что ты хочешь тестировать? 1) Торговую стратегию или 2) подачу заявок из робота?
Для 1) я предпочитаю C# в WealthLab'е.
Для 2) использую Lua в Quik Junior.
Если хочешь максимально приблизить тестирование высокочастотной стратегии в WealthLab'е к реальности, можешь скриптом QLua набрать историю нескольких дней по бидам и оферам с дискретностью 0.1-0.5 сек.
PS Имея историю котировок, например с Финама, для тестирования торговой стратегии можно использовать автономный интерпретатор Lua,  на заморачиваясь с добыванием хакнутого WealthLab. Или вообще любой компилятор или интерпретатор твоего любимого языка программирования. Хоть JavaScript или Excel VBA.
Rostislav Kudryashov, спасибо за ответ, коллега! 
«Что ты хочешь тестировать? 1) Торговую стратегию или 2) подачу заявок из робота?» — и то и другое.
Но в идеале хотелось бы тестировать в самом Квике, или в чем-то, что так же показывает график, свечи. А вообще в идеале — чтоб еще и треугольнички сделок на графике отображались… )
Чтоб визуализировано было.
Так то понятно, что можно любой алгоритм хоть на Паскале реализовать и протестировать… НО! Это означает, что нужно руками написать некую имитацию подачи данных. И интерпретатор данных. Опять же понятно — есть массив котировок с Финама того же, в тхт или в csv, ну и делай с ним что хочешь. Но мне этот «движок» руками писать — как-то не хочется. Надеялся, что он уже есть. В том же Квике ну элементарно же было бы разработчикам сделать имитатор на любом отрезке графика, по которому имеются данные. Эхх... 
Кроме того, хотелось бы сразу увидеть кривую эквити, так сказать, по итогам работы скрипта… А тут — опять же — выгружать в файл, потом обрабатывать в Экселе? Колхоз какой-то… (
Кстати, про данные с Финама. Я что-то не смог скачать оттуда тики (по Бренту пробовал, за 1-2 апреля, конкретно). Минимум — минутки получается скачать. И с mfd.ru аналогично. Возможно вообще тики получить? Подскажите, пожалуйста, путь.
И еще про «автономный интерпретатор Lua». Читал про отладчик Lua - Decoda. Он не позволит как-то поизящнее прогнать скрипт через массив данных? Т.е. его можно использовать именно не как отладчик, а как тестировщик на истории?
Илья Просто, если с Финама скачать историю в формате .csv с разделителями ";", Excel берёт такой файл как родной.
 PS Под тиками имею в виду данные, скажем, раз в секунду. Просто Время, Цена (хоть покупки хоть продажи, не суть), Объем. Как-то так.
 PPS Пока больше всего понравился вариант с getCandlesByIndex. Использование стандартных средств для получения данных, ну и использование «естественной среды» скрипта. Минимум изменений. Просто вместо бесконечного цикла в реальном масштабе времени — конечный цикл по свечкам. Красиво. Но результаты — ручками лопатить… И свечки только минутные получается… Дискретность большевата для меня… Но для начала — пойдет. Даже интересно.
На графике — Интервал — Тиковый
Функция getCandlesByIndex умеет получать тиковые данные.
avatar
CreateDataSource() -- Функция предназначена для создания таблицы Lua и позволяет работать со свечами, полученными с сервера QUIK
ds, Error = CreateDataSource (class_code, sec_code, interval [, param]);<br />CreateDataSource возвращает таблицу QLua с параметрами, получать значения которых можно следующим образом:
local O = ds:O(i); -- Получить значение Open для указанной свечи (цена открытия свечи)
local H = ds:H(i); -- Получить значение High для указанной свечи (наибольшая цена свечи)
local L = ds:L(i); -- Получить значение Low для указанной свечи (наименьшая цена свечи)
local C = ds:C(i); -- Получить значение Close для указанной свечи (цена закрытия свечи)
local V = ds:V(i); -- Получить значение Volume для указанной свечи (объем сделок в свече)
local T = ds:T(i); -- Получить значение Time для указанной свечи (время открытия свечи (таблица datetime))
   -- Где i - индекс свечи (от 1 до ds:Size())
 
local Size = ds:Size(); -- Возвращает текущий размер (количество свечей в источнике данных) 
ds:Close(); -- Удаляет источник данных, отписывается от получения данных
avatar
luks sluk, спасибо! Я использую как раз CreateDataSource(). 
И потом «ds:SetEmptyCallback();» — подписываюсь на обновления и соответственно получаю автоматически обновляемые данные в реальном масштабе времени.
Получается — по сути можно делать все то же самое, просто в цикле с 0. И работать с имеющимся массивом данных. Спасибо!
Берешь и эмулируешь все функции квика и тогда можно написать.
WebQuik прекрасно принимает и передает всю необходимую информацию через Websocket. Рабочий пример https://github.com/DmitryPukhov/pytrade
WebQuik <--> Websocket <--> Python
avatar

теги блога Илья Просто

....все тэги



UPDONW
Новый дизайн