Author Archive

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

       В процессе написания торговой системы на QPILE для QUIK я разрабатывал различные тестовые программы.  Ниже приведен тестовый вариант одного из алгоритмов.
            Все алгоритмы принятия решения я разделяю на два класса.
К первому классу относятся методы(алгоритмы), основанные на истории сделок, т.е. данные алгоритмы смотрят в прошлое и на прошлом опыте прогнозируют будущее, т.е. принимают решение.
Ко второму классу относятся методы(алгоритмы), основанные на намерениях (желаниях) участников рынка – эти алгоритмы для принятия решения используют информацию о котировках, т.е. информацию в “стакане” и на ее основе принимают решение.
            Ниже приведена программа алгоритма второго класса.
  Суть алгоритма сводится к поиску в стакане заявки, которую я называю “забором”,т.е. заявки существенно большей, чем средняя заявка по стакану. Именно эти заявки определяют очень часто точки разворота или пробоя. Определяя их , можно строить стратегию торговлю, располагая свои ордера перед или за забором.
     Приведенную ниже программу предлагаю рассматривать , как пример для практического освоения языка QPILE.
          Изучайте, развивайте, спрашивайте.

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FUNC QUOTES_WORK_1()  ‘ поиск забора 
  ‘ описание алгоритма
 ‘ ищем среднее число заявок в стакане
 ‘ после этого ищем первое значение выше среднего
            MAP2=GET_QUOTES_II_LEVEL_DATA (ClassCode, SecCode)
 ‘———
            BID_COUNT=0+GET_VALUE(MAP2,»BID_COUNT») ‘глубина стакана на покупку
 IF BID_COUNT==0
            RETURN
 END IF
            OFFER_COUNT=0+GET_VALUE(MAP2,»OFFER_COUNT») ‘глубина стакана на покупку
 IF OFFER_COUNT==0
            RETURN
 END IF
 ‘——————
 BID=GET_VALUE(MAP2,»BID») ‘коллекция котировок от минимальной цены к максимал покупка правильно
 OFFER=GET_VALUE(MAP2,»OFFER») ‘коллекция котировок от минимальной цены к максимал продажу инверсный счет
 SUM_BID=0
 SUM_OFFER=0
            QUANTITY_OFFER_FIRST=0
            PRICE_OFFER_FIRST=0
            QUANTITY_BID_FIRST=0
            PRICE_BID_FIRST=0
            IND_OFFER=0
            IND_BID=0
 ‘          BREAKPOINT()
 ‘——————
 FOR Index FROM 0 TO BID_COUNT-1
            Index2=BID_COUNT-1-Index
            MAP1=Get_Collection_Item (BID,Index2) ‘котировка покупки
            PRICE_BID=0+GET_VALUE(MAP1,»PRICE») ‘цена
            QUANTITY_BID=0+GET_VALUE(MAP1,»QUANTITY») ‘количество
            SUM_BID=SUM_BID+QUANTITY_BID
 END FOR
            SUM_BID=SUM_BID/BID_COUNT
 ‘      поиск первого значения в стакане больше среднего
 FOR Index FROM 0 TO BID_COUNT-1
            Index2=BID_COUNT-1-Index
            MAP1=Get_Collection_Item  (BID,Index2) ‘котировка покупки
            PRICE_BID=0+GET_VALUE(MAP1,»PRICE») ‘цена
            QUANTITY_BID=0+GET_VALUE(MAP1,»QUANTITY») ‘количество
                        IF QUANTITY_BID>SUM_BID
                        QUANTITY_BID_FIRST=QUANTITY_BID
                        PRICE_BID_FIRST=PRICE_BID
                        IND_BID=Index
                        BREAK
                        END IF
 END FOR
‘—————
 FOR Index FROM 0 TO OFFER_COUNT-1
            MAP1=Get_Collection_Item  (OFFER,Index) ‘котировка на продажу
            PRICE_OFFER=0+GET_VALUE(MAP1,»PRICE») ‘цена
            QUANTITY_OFFER=0+GET_VALUE(MAP1,»QUANTITY») ‘количество
            SUM_OFFER=SUM_OFFER+QUANTITY_OFFER
 END FOR
            SUM_OFFER=SUM_OFFER/OFFER_COUNT
 ‘      поиск первого значения в стакане больше среднего
 FOR Index FROM 0 TO OFFER_COUNT-1
            MAP1=Get_Collection_Item (OFFER,Index) ‘котировка продажу
            PRICE_OFFER=0+GET_VALUE(MAP1,»PRICE») ‘цена
            QUANTITY_OFFER=0+GET_VALUE(MAP1,»QUANTITY») ‘количество
                        IF QUANTITY_OFFER>SUM_OFFER
                                   QUANTITY_OFFER_FIRST=QUANTITY_OFFER
                                   PRICE_OFFER_FIRST=PRICE_OFFER
                                   IND_OFFER=Index
                        BREAK
                        END IF
 END FOR
 ‘——————-
 END FUNC

Tags: , , , , ,