Пишем на QPILE (Урок 2: работа со свечами )

20 ноября, 2010

Автор: Николай Камынин

Так как я считаю, что в любом произведении важен не язык, на котором его пишут, а сценарий , алгоритм, сюжет, который реализуют, то поговорим сначала о методах и алгоритмах.

Я разделяю торговых роботов на два класса.

К первому классу отношу роботов, в которых решение принимается на основе совершенных сделок.

Как правило , история таких сделок  представляется в виде свечей.

Хочу заметить, что свечи – это своеобразный фильтр.

И как всякий фильтр они упрощают, искажают первичную информацию,

но именно это и помогает выделить интересующие нас признаки.

В таких роботах на QPILE одной из основных задач является чтение и разборка параметров свечей для дальнейших вычислений.

Все торговые роботы относятся к системам обработки сигналов реального времени.

Рассмотрим  два основных алгоритма работы со свечами. Классификация моя.

Первый: АЛГОРИТМ ДИЛЕТАНТОВ

В большинстве случаев этот алгоритм реализуют любители –самоучки.

Суть его сводится к тому, что в каждый момент времени считывается с графика некоторое количество свечей, например 100, они распаковываются и по ним вычисляются максимум , минимум на интервале и т д.

На основе полученных  параметров  принимается решение.

В следующий момент опять читаются эти же 100 свечей и так до появления новой свечи.

С появлением  новой свечи опять читается 100 свечей, из которых 99 старых.

Теперь давайте посчитаем, сколько бессмысленной работы Вы создаете процессору,

при реализации данного алгоритма.

Например, если время расчета портфеля 1 секунда, а интервал графика 1 минута,

то, как минимум, 59 раз Вы в пустую будете распаковывать 100 свечей.

Если же Вы будете читать нужные Вам 100  ( число взято для примера ) свечей

в момент закрытия новой свечи,

то объем вычислений сократится для нашего примера примерно в 50 раз.

На этом дилетанский метод обработки свечей исчерпан.

Второй: АЛГОРИТМ ПРОФИ

Основной принцип обработки сигналов в реальном масштабе времени —

НЕ ОБРАБАТЫВАТЬ ВТОРИЧНО, РАНЕЕ ПОЛУЧЕННЫЕ ДАННЫЕ.

Поэтому в таких системах считается плохим приемом использование циклов в прошлое.
Основное правило такое:

Получили новые данные и сделали с ними все,

что требуется, а не обращаетесь к ним многократно чтобы делать одно и тоже.

Поэтому задачу принятия решения по параметрам свечей разделяем на две подзадачи.

Первая подзадача состоит в том ,

чтобы в момент закрытия новой свечи прочитать данную свечу с графика,

распаковать ее параметры и сохранить их в файле, массиве или коллекции.

Вторая подзадача сводится к вычислению по параметрам 100 свечей требуемые параметры принятия решения.

При таком алгоритме решения задачи,

нам потребуется ВМЕСТО ЧТЕНИЯ  с графика каждый раз  СТА  свечей,

ЧИТАТЬ  всего лишь ОДНУ- новую.

В результате мы сокращаем объем вычислений в 100 – 5000 раз, по сравнению с первым методом.

Думаю, игра стоит свеч.
Успехов в изучении методов обработки сигналов.

~~~~~~~~~~~~~~~~

В завершение статьи привожу пример функции на QPILE для распаковки параметров новой свечи.

FUNC CANDLE_SET() ‘обработка принятой свечи и запись в конец файла
H1=H
L1=L
O1=O
C1=C
V1=V
T1=T
D1=D
H=APPLY_SCALE (0+Get_Value (CANDLE,»HIGH»),SCALE)
L=APPLY_SCALE (0+Get_Value (CANDLE,»LOW»),SCALE)
O=APPLY_SCALE (0+Get_Value (CANDLE,»OPEN»),SCALE)
C=APPLY_SCALE (0+Get_Value (CANDLE,»CLOSE»),SCALE)
V=APPLY_SCALE (0+Get_Value (CANDLE,»VOLUME»),0)
D=DF
IF TIME_+0=0
T=»000000″
ELSE
T=TIME_
FINE_OCHLD() ‘вычисление параметров дня
END IF
DTOCHLV=D & «,» & T & «,» & O &»,» & H &»,» & L &»,» & C &»,» & V ‘свеча в виде строки
WRNF(fileOHLCV,DTOCHLV) ‘запись в конец файлаD,T,O,H,L,C,V
INDICATOR() ‘чтение индикаторов
RS() ‘вычисление параметров R,TR,S,TS,DR,nDR,DS,nDS
robot() ‘принятие решения в момент появления новой свечи
END FUNC

Привожу без редакции, из работающего робота ,что не нужно — удалите
Успехов

Упрощение языка QPILE для QUIK

13 ноября, 2010

Автор: Николай Камынин

При работе с коллекциями и ассоциативными массивами можно исключить из использования функции   CREATE_MAP и CREATE_COLLECTION
Так как операция создания пустого массива или коллекции реализуется присвоением пустой строки ,
например,
вместо X=CREATE_MAP()
или
X=CREATE_COLLECTION()
можно писать
X=» «,
где X — массив или коллекция зависит от дальнейшего обращения.
Операция копирования реализуется через присвоение
например,
вместо
X=CREATE_MAP(X2)
или
X=CREATE_COLLECTION(X2)
можно записать X=X2
При этом пустой массив можно не создавать, а записывать первое значение следующим образом:

Вместо двух операторов, которые согласно документации требуется написать для создания массива и сохранения переменной в нем:

X=CREATE_MAP()

X=SET_VALUE(X,»CLOSE»,CLOSE) ‘запись в массив X значение переменной CLOSE под именем CLOSE

можно записать всего один:

X=SET_VALUE(«»,»CLOSE»,CLOSE) ‘запись в массив X значение переменной CLOSE под именем CLOSE

Успехов в программировании.