В этой статье будет показано, как вывести свечи из Quik в Excel. Кроме того я представлю генератор скрипта для создания таблиц свечей в Quik, с открытым кодом на C#. Он нужен чтобы не разбирать Qple, при выводе свечек из Quik. А это основной затык, в этой простейшей связке. Опишу процесс работы с QuikTableScriptGenerator (далее «генератор скриптов») и дальнейший процесс вывода свечей по DDE в Excel. Всё в картинках и очень подробно. Думается, что всё вместе это поможет хоть немного алгоритмизироваться огромному множеству трейдеров.
plan:
1) Введение;
2) Как создать таблицу со свечками в Quik при помощи «генератора скриптов»;
3) Как вывести таблицу из Quik в Excel;
4) Программисту;
5)...;
6) profit.
1 Вместо введения
Есть такой не совсем быстрый, но очень простой способ создания советников (да и роботов, но надо знать VBA), при котором данные из Quik импортируются по DDE в EXCEL и там происходит их разбор и приведение к каким-то производным. Excel с его «умными» таблицами для этого подходит очень даже хорошо. Вывод по DDE в Quik реализован прекрасно и делается всё в два клика. Простые какие-то графики с производными и прочие расчёты можно и нужно делать в Excel, если нет желания учить несколько лет C# или разбирать несколько месяцев TSLab.
Когда только думал начать писать торговых роботов, четыре года назад, думал попробовать именно с такого способа. Мне нужны были данные о приращении цен множества инструментов относительно индекса по минутам, за последний час. Тогда я думал, что это будет прорывом в моём Скальпинге. Йохохо… Однако сразу же нарвался на очень большие и на тот момент для меня не преодолимые грабли. Стандартными способами невозможно вывести свечи из Quik по DDE, потому как свечи не хранятся в программе в виде таблиц, а экспортировать можно только их (таблицы). На тот момент в сети ещё не было на каждом шагу этих скриптов преобразующих свечи в таблицы, и плюс их надо редактировать вручную, а для этого понимать Qple хоть чуть — чуть. К чему я был совершенно не готов.
Четыре года спустя...© у меня в платформе давно реализован генератор скриптов и я хочу им поделиться.
Скачиваем со страницы:
sib-algo.ru/?p=162
Что в архиве:
1) Генератор скриптов. Язык реализации C#;
2) Этот пост вместо инструкции;
3) Открытая лицензия.
2 Как создать таблицу со свечками в Quik при помощи «генератора скриптов»
Для начала нам нужно создать текущую таблицу параметров в Quik, вот так:
И назначить ей следующие поля и источники данных:
В поле «Заголовки столбцов» должны быть поля как на рисунке. В поле «Заголовки строк» необходимо поместить те инструменты, которые планируется выводить по DDE.
Выглядеть всё должно вот так:
Далее создаём в Quik график того инструмента, который будем выводить по DDE. Именно с тем таймфреймом, который требуется. Это нужно чтобы Quik начал заказывать с сервера брокера соответствующие данные. В нашем случае это будет Сбербанк обыкновенный:
Далее открываем генератор скриптов и переносим в него необходимые данные, смотря на нашу таблицу текущих параметров:
Параметр 1 — это префикс к файлу со скриптом, который нужно придумать самому. Это также будущее имя скрипта внутри Quik. Т.ч. не стоит называть два скрипта одним именем...
Параметры 2,3,5 — переносим из таблицы текущих параметров
Параметр 4 — таймфрейм инструмента.
Нажав на кнопку «Указать», отмеченную цифрой 6, надо указать Exeшник Quik, вот так:
После чего можно нажимать кнопку создать:
Если всё нормально, то в этот момент в папке с Quik будет создан файл скрипта и появиться окошко с подтверждением операции:
Далее надо снова зайти в Quik и пройти по меню вот сюда:
В появившемся меню надо найти в корне Quik наш скрипт и выбрать его:
В следующем меню выбираем наш скрипт в таблице «Доступные портфели» и нажимаем загрузить локально:
После чего закрываем окно.
Далее идём по главному меню Quik вот сюда:
Появится окно:
1) выбираем в таблице «Доступные портфели» наш портфель;
2) Нажимаем на кнопку «Добавить всё».
3) Нажимаем кнопку «Да».
И наконец-то можем наблюдать таблицу с нужными нам данными:
3 Выводим таблицу из Quik в Excel
1. Создаём файл Excel в корне Quik (можно где угодно, но мне так удобнее):
1) Я создал файл ExportTest в корне Quik
2) Переименовал один из его листов в ListSber
3) Сохранил изменения.
Идём опять в Quik и тыкаем нашу таблицу правой кнопкой мыши:
Во всплывающем меню выбираем «Вывод через DDE сервер».
Появиться следующее меню:
1) Жмём на кнопку "..." и находим в меню наш файл Excel, который мы недавно создали. В нашем случае это «ExportTest».
2) Вводим вкладку, на которую будут транслироваться данные. В нашем случае это «ListSber».
3) Проверяем чтобы стояла галочка «Запускать приложение DDE сервера автоматически»
4) Нажимаем «Начать вывод»
Окошко должно выглядеть следующим образом:
Теперь смотрим в наш файл Excel И...
Наблюдаем за таблицей свечей.
Самое главное в этом процессе, это спокойствие и чёткое соблюдение инструкции. Если что-то не получилось, нужно расслабиться и прочитать ещё раз список действий. Повторюсь:
1) Создаём таблицу текущих параметров с инструментом который хотим вывести;
2) Создаём график инструмента, который планируется выводить. Таймфрейм также должен совпадать с тем, который будем выводить;
3) Загружаем генератор скрипта и аккуратно заполняем все поля. Указываем местоположение Quik и создаём скрипт;
4) Подгружаем наш скрипт/потрфель в Quik. Активизируем его для просмотра. И создаём таблицу свечей;
5) Создаём Excel файл;
6) Настраиваем вывод по DDE;
7) Радуемся жизни...
Проблемы могут возникнуть, в случае если в папку с Quik запрещена запись либо «генератор скриптов» открыт не от лица администратора. Так что, прежде всего, необходимо это дело проверить и исправить.
4 Программисту
Если ты всё ещё редактируешь скрипты вручную (ФИ!), то можно взять из представленного проекта два класса QuikScriptGenerator.cs и QuikScriptGeneratorUI.cs и, переименовав их namespace на свой, использовать их для этого. Как их использовать смотри в program.cs. Там происходит создание объекта «генератор скрипта» и вызов его меню. Всё очень и очень просто.
5 Начинающему программисту
Эти же скрипты и таблицы можно использовать для вывода свечей по DDE в свои приложения и платформы (как это у меня происходит в обёртке для Quik), для этого нужно развернуть свой DDE сервер, о чём я напишу немного позже. Поэтому тренируйся пока на Excel, сохрани ссылку на этот блог, поставь плюс статье и иди за попкорном.
upd:
Скрипт создаёт таблицы свечей с таймфреймом максимум часовым. К сожалению мне выше таймфреймы не нужны и я особо не парился по этому поводу. Если у кого-то есть скрипт для выгрузки дней/недель, будьте добры дайте ссылку, родина вас не забудет.
Цимес роботов в екселе это когда бары не нужны, работа с ттп по большому числу инструментов например.
Поэтому если нужна 100% точность свечей, лучше самому качать таблицу сделок по DDE и строить свечи с помощью того же vBA.
На LUA роботы пишутся намного легче, надежность достигается меньшими затратами и более простыми методами. В профиле сайт, там демо-версия (работоспособная) робота.
Ну а насчёт других программ, то это вообще проще париной репы, конечно если знаешь VBA или C#.
Visual Studio позволяет создавать свои интерфейсы в два клика. Для этого в ней есть несколько Frameworks (дополнений) для создания интерфейсов. Самый простой из них это Windows Forms.
Если освоить эти технологии, то можно пристраивать как к Excel свои приложения, т.к. коммуникация между ним и программами из .Net(написанными на Visual Studio) очень простая, так и вовсе убрать Excel из этой связки и перегонять данные напрямую в свои приложения.
Вот сайт с нужными книжками:
progbook.ru/visual_basic/
Желательно, чтобы в заголовке присутствовало слово .Net, а в содержании Visual Studio и Windows Forms. Так победим.
upd:
Visual Studio не обязательно покупать за 60 килорублей. Доступна на множестве торрентов.
или в таком способе создания и вывода котировок в ексель есть какое то преимущество?
Перечитай (прочитай), первый абзац.
Это и есть скрипт на Qple. Только его руками не надо редактировать.
))
DESCRIPTION IM 6;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
PROGRAM
' Настраиваемые параметры
ClassCodeList=«SPBFUT» ' код класса инструмента
Instrument=«RIU4» ' название инструмента
Interval=6 ' интервал (таймфрейм) на графике
DayToFind=35 ' сколько дней назад искать свечи (можно уменьшить, чтобы ускорить работу программы)
CandleToFind=3200' сколько свечей надо найти
OutFile = «c:\zzzzz.csv» ' файл, куда записывать данные в формате CSV
DELETE_ALL_ITEMS()
CandleCount=0
CurYear=get_value(GET_DATETIME(), «YEAR»)
CurMonth=get_value(GET_DATETIME(), «MONTH»)
CurDay=get_value(GET_DATETIME(), «DAY»)
CurHour = GET_VALUE(GET_DATETIME(), «Hour»)
CurMin = GET_VALUE(GET_DATETIME(), «Min»)
CurMin = Interval*Floor(CurMin/Interval) ' округляем минуты до «интервальных»
ID=«ID6» 'идентификатор графика
for i from 1 to (DayToFnd*24)*(Floor60/Interval))
TextDat=fTextData(CurYar,CurMonthCurDay) &""
TextTime=fTextTime(CurHour,CurMin) & ""
if (CandleCountdleToFind) ' если нашли сколько нам надо свяем пустой цикл
Candle=GET_CANDLE(ClassCodeList,Instrument, "", Interval & "", E", TextData, TextTime)
Open=GET_VALUE (Candle, «Open»)+0
if (Open>0)
CandleCount=CandleCount+1
High=GET_VALUE (Candle, «High»)+0
Low=GET_VALUE (Candle, «Low»)+0
Close=GET_VALUE (Candle, «Close»)+0
Volume=GET_VALUE (Candle, «Volume»)+0
o1=0+GET_VALUE(GET_VALUE(GET_CANDLE_EX(ID,TextData,TextTime),«LINES»),«OPEN»)
h1=0+GEE(GET_VALUE(GET_CANDLE_EX(ID,TextData,TextTime),«LINES»),«HIGH»)
l1=+GET_VALUE(GET_VALUE(GET_CANDLE_EX(ID,TextData,TextTime),«LINES»),«LOW»)
c1=0+GETVALUE(GT_VALUE(GET_CANDLE_EX(ID,TextData,TextTime),«LI),»CLOSE")
v1=0+GET_VALUE(GET_VALUE(GET_CANDLE_EX(ID,TextData,TextTime),«LINES»),«VOLUME»)
output=CREATE_MAP()
output=SET_VALUE(output,«Date»,TextData)
output=SET_VALUE(output,«Time»,TextTime)
'output=SET_VALUE(output,«Open»,Open)
'output=SET_VALUE(output,«High»,High)
'output=SET_VALUE(output,«Low»,Low)
'output=SET_VALUE(output,«Close»,Close)
'output=SET_VALUE(output,«Volume»,Volume)
output=SET_VALUE(output,«Open»,o1)
output=SET_VALUE(output,«High»,h1)
output=SET_VALUE(output,«Low»,l1)
output=SET_VALUE(output,«Close»,c1)
output=SET_VALUE(output,«Volume»,v1)
ADD_ITEM(CandleCount,output)
WRITELN(OutFile, TextData & "," & TextTime & "," & Open & "," & High & "," & Low & "," & Close)
end if
' откат на «интервал назад
CurMin=CurMn-Interval
if CurMn<0
CurMin=60+CurMin
CuHour=CuHour-1
if CurHour<0
CurHour=23
CurDay=CurDay-1
if curDay<1
CurDay=31
CurMonth=CurMonth-1
if CurMonth<1
CurMonth=12
CurYear=CurYear-1
if CurYear<0
message (»Не найдены котировки до рождества Христова! ",1)
end if
end if
end if
end if
end if
end if
end for
' функция перевода даты в текстовый формат
func fTextData(Year,Month,Day)
if (LEN(Month) < 2)
Month = «0» & Month
end if
if (LEN(Day) < 2)
Day = «0» & Day
end if
result = Year & Month & Day
end func
' функция перевода времени в текстовый формат
func fTextTime(Hour,Min,Sec)
if (LEN(Hour) < 2)
Hour = «0» & Hour
end if
if (LEN(Min) < 2)
Min = «0» & Min
end if
result = Hour & Min & «00»
end func
END_PROGRAM
PARAMETER Time;
PARAMETER_TITLE Время;
PARAMETER_DESCRIPTION Время;
PARAMETER_TYPE STRING(30);
END
PARAMETER High;
PARAMETER_TITLE High;
PARAMETER_DESCRIPTION High;
PARAMETER_TYPE NUMERIC(10,0);
END
PARAMETER Low;
PARAMETER_TITLE Low;
PARAMETER_DESCRIPTION Low;
PARAMETER_TYPE NUMERIC(10,0);
END
PARAMETER Open;
PARAMETER_TITLE Open;
PARAMETER_DESCRIPTION Open;
PARAMETER_TYPE NUMERIC(10,0);
END
PARAMETER Close;
PARAMETER_TITLE Close;
PARAMETER_DESCRIPTION Close;
PARAMETER_TYPE NUMERIC(10,0);
END
PARAMETER Volume;
PARAMETER_TITLE Volume;
PARAMETER_DESCRIPTION Volume;
PARAMETER_TYPE NUMERIC(10,0);
END
END_PORTFOLIO_EX
Lua->WCF->C#
Сложно? А по другому никак. Это тоже самое, что пытаться управлять космическим кораблем, но при этом отучиться только на управление автомобилем.
Я уже давно на C# и разрабатываю для себя алгоритмы на основе машинного обучения. Почитайте мои предыдущие статьи.
Этот же пост для начинающих алготрейдеров. Пишу о том, что бы мне самому было бы очень полезно 4 года назад.
По LUA нет ещё открытых кодов, а учить его нет никакого желания. Меня DDE + Trans2Quik.dll вполне устраивали, когда я торговал через Quik.
Исходя из своего опыта могу сказать, что мне жаль время потраченное на начальных этапах на Qpile, Excel и прочие костыли. Они реально имеют очень низкий КПД.
Просто для тех кто серьезно хочет торговать хочу обратить внимание на то, что низкоуровневые языки программирования изучать придется. Никуда от этого не деться. Лучше, конечно, С++ или С#. Ничего в них страшного нет. К примеру я с абсолютного нуля до более-менее приемлемого уровня научился самостоятельно писать примерно за полгода. И это без отрыва от основной работы! А если у меня получилось, значит и у 90% здесь присутствующих получится.
Желаю всем в этом развитии удачи!
+++++
Какое у вас проскальзывание по основным фишкам?
Как считаете проскальзывание: от расчетной цены или от первого своего бида?
Не пробовали ставить заявки на 5-10 минут раньше/позже расчетного конца таймфрема?
1) по проскальзыванию:
Понятия не имею.
Во время тестирования никак не считаю, т.к. IMHO это замутняет понимание результатов.
Во время торговли уже поздно считать. Выставляюсь в центр стакана и стою там. Исполнилось — хорошо. Ушла цена — ну и не нада. Зачем его считать отдельно во время торгов? Результат и так видно в вариационке и движениям по счёту. Но это всё не значит что это правильно, просто я ленив в каких то местах.
2) по раннему закрытию свечек:
Пробовал. Получилось. Всегда теперь так делаю. Перед закрытием сессии и перед клирингами. Просто надо раньше закрыть свечку и передать массив торговому алгоритму на обработку. Т.к. я пишу сам роботов на C# это вообще не проблема.
upd: Да, кстати. У меня же в роботах скальперский привод встроенный. Можно вообще в любой момент открыть или закрыть позицию.
Можно ли добавить поддержку дневных таймфреймов?
www.finam.ru/profile/moex-akcii/gaz-tek-oao-ao/export/?market=1&em=82115&code=GAZT&apply=0&df=4&mf=3&yf=2018&from=04.04.2018&dt=4&mt=3&yt=2018&to=04.04.2018&p=8&f=GAZT_180404_180404&e=.txt&cn=GAZT&dtf=1&tmf=1&MSOR=1&mstime=on&mstimever=1&sep=1&sep2=1&datf=1&at=1
Есть на сайте финама сервис, позволяющий выгружать данные