воскресенье, 23 ноября 2014 г.

Код робота на qpile для расчета количества открытых позиций

Алгоритм отслеживает изменения ОИ и если он за интервал работы цикла программы изменяется на N процентов то выдает алерт.


PORTFOLIO_EX OPEN INTEREST;
DESCRIPTION Алгоритм выявляет всплески открытого интереса;
CLIENTS_LIST  ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

PROGRAM
    ' =========ПОЛЬЗОВАТЕЛЬСКИЕ НАСТРОЙКИ=============
  ' Перечисляем маржинальные и наиболее ликвидные активы
    ' FINSTRUMENTS="GAZP"
    ' CLASSCODE="EQNE" ' код группы
    PRO=1 ' Процент изменения (чувствительности)
    INTERVAL=5 ' таймфрейм на открытом графике в минутах (0 < INTERVAL < 60)
  
    ' ====================ПЕРЕМЕННЫЕ==================
    HH = 0 ' обнуляем максимум за
    LL = 10000000 '  обнуляем минимум за
    tmp=CREATE_MAP()
    tmp=set_value(tmp, "RIM2", "SPBFUT")
    tmp=set_value(tmp, "SRM2", "SPBFUT")
    tmp=set_value(tmp, "GZM2", "SPBFUT")
    tmp=set_value(tmp, "LKM2", "SPBFUT")
    INSTRUMENTS="RIM2,SRM2,GZM2,LKM2"
    ' ===============ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ===============
    NEW_GLOBAL("LAST",CREATE_MAP()) ' последние (текущие) величины

    ' ===============СЕРВЕРНЫЕ ДАТА И ВРЕМЯ===============
    SERVERDATE=GET_INFO_PARAM("TRADEDATE") ' дата сервера в формате DD.MM.YYYY
    SERVERTIME=GET_INFO_PARAM("SERVERTIME") ' время сервера в формате HH:MM:SS
    DATETIME (SERVERDATE,SERVERTIME) ' вызов функции даты-времени

    CURTIME=0+CURTIME ' перевод времени в число

    IF CURTIME > 100001 AND CURTIME < 235000 ' время внутри ТС
     DELETE_ALL_ITEMS()
     OUTPUT=CREATE_MAP()

     ' В цикле делаем определение объемов и сравлиниваем со средним за период.
        FOR INSTRUMENT IN INSTRUMENTS
             CLASSCODE=GET_VALUE(tmp, INSTRUMENT)
             OI=0+GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,"NUMCONTRACTS"), "PARAM_VALUE") ' текущий открытый интерес по контракту
             OI0=0+GET_VALUE(LAST,INSTRUMENT)
             
             MAXVAL=0+GET_VALUE(LAST,INSTRUMENT & "MAXVAL")
             MAXTIME=GET_VALUE(LAST,INSTRUMENT & "MAXTIME")
             MAXCOST=0+GET_VALUE(LAST,INSTRUMENT & "MAXCOST")
             
             MINVAL=0+GET_VALUE(LAST,INSTRUMENT & "MINVAL")
             MINTIME=GET_VALUE(LAST,INSTRUMENT & "MINTIME")
             MINCOST=0+GET_VALUE(LAST,INSTRUMENT & "MINCOST")
             IF OI0=0
                OI0=OI
             END IF
             IF MINVAL=0
                MINVAL=LL
             END IF
             RATE=(OI-OI0)*100/OI0
             LAST=SET_VALUE(LAST, INSTRUMENT, OI)
             COST=GET_VALUE(GET_PARAM_EX(CLASSCODE, INSTRUMENT, "LAST"), "PARAM_VALUE") ' текущий открытый интерес по контракту
             IF OI>MAXVAL
                 MAXVAL=OI
                 MAXTIME=SERVERTIME
                 MAXCOST=0+COST
                 LAST=SET_VALUE(LAST, INSTRUMENT & "MAXVAL",MAXVAL)
                 LAST=SET_VALUE(LAST, INSTRUMENT & "MAXTIME",MAXTIME)
                 LAST=SET_VALUE(LAST, INSTRUMENT & "MAXCOST",MAXCOST)
             END IF
             IF OI<MINVAL
                 MINVAL=OI
                 MINTIME=SERVERTIME
                 MINCOST=0+COST
                 LAST=SET_VALUE(LAST, INSTRUMENT & "MINVAL",MINVAL)
                 LAST=SET_VALUE(LAST, INSTRUMENT & "MINTIME",MINTIME)
                 LAST=SET_VALUE(LAST, INSTRUMENT & "MINCOST",MINCOST)
             END IF
                  ' ===============ДАННЫЕ В ТАБЛИЦУ===============
                   OUTPUT=SET_VALUE(OUTPUT,"SERVERDATE", SERVERDATE)
                   OUTPUT=SET_VALUE(OUTPUT,"SERVERTIME", SERVERTIME)
                   OUTPUT=SET_VALUE(OUTPUT,"INSTRUMENT", INSTRUMENT)
                   OUTPUT=SET_VALUE(OUTPUT,"INTEREST", OI)
                   OUTPUT=SET_VALUE(OUTPUT,"RATE", RATE)
                   
                   OUTPUT=SET_VALUE(OUTPUT,"MAXVAL", MAXVAL)
                   OUTPUT=SET_VALUE(OUTPUT,"MAXTIME", MAXTIME)
                   OUTPUT=SET_VALUE(OUTPUT,"MAXCOST", MAXCOST)
                   
                   OUTPUT=SET_VALUE(OUTPUT,"MINVAL", MINVAL)
                   OUTPUT=SET_VALUE(OUTPUT,"MINTIME", MINTIME)
                   OUTPUT=SET_VALUE(OUTPUT,"MINCOST", MINCOST)
                   ADD_ITEM(1,OUTPUT)

             ' сравним и пересохраним в МАП
             IF RATE>PRO ' Если обнаружен ои больше обычного, то
                      MESSAGE("1% OI UP IN " & INSTRUMENT, 1)
                      SET_ROW_COLOR_EX (1, "RGB(0,255,0)", "RGB(0,255,0)", "DEFAULT_COLOR", "DEFAULT_COLOR") ' ПОДСВЕТИМ СТРОКУ ЗЕЛЕНЫМ 
             END IF
             IF RATE<0-PRO ' Если обнаружен ои меньше обычного, то
                      MESSAGE("1% OI DOWN IN " & INSTRUMENT, 1)
                      SET_ROW_COLOR_EX (1, "RGB(255,0,0)", "RGB(255,0,0)", "DEFAULT_COLOR", "DEFAULT_COLOR") ' ПОДСВЕТИМ СТРОКУ КРАСНЫМ 
             END IF
        END FOR
    END IF
    
    ' ФУНКЦИЯ СЕРВЕРНЫХ ДАТЫ И ВРЕМЕНИ
    FUNC DATETIME(FSERVERDATE,FSERVERTIME)
             CURYEAR=SUBSTR(FSERVERDATE,6,4) ' текущий год в текстовом формате
             CURMONTH=SUBSTR(FSERVERDATE,3,2) ' текущий месяц в текстовом формате
             CURDAY=SUBSTR(FSERVERDATE,0,2) ' текущий день в текстовом формате
             CURDATE(CURYEAR,CURMONTH,CURDAY) ' вызов функции перевода даты в текстовой формат

             CURHOUR=SUBSTR(FSERVERTIME,0,2) ' текущие часы в текстовом формате
             CURMIN=SUBSTR(FSERVERTIME,3,2) ' текущие минуты в текстовом формате
             CURSEC=SUBSTR(FSERVERTIME,6,2) ' текущие секунды в текстовом формате
             CURTIME(CURHOUR,CURMIN,CURSEC) ' вызов функции перевода времени в текстовой формат
    END FUNC

    ' ФУНКЦИЯ ПЕРЕВОДА ДАТЫ В ТЕКСТОВОЙ ФОРМАТ
    FUNC CURDATE (FCURYEAR,FCURMONTH,FCURDAY)
             IF (LEN(FCURMONTH) < 2)
                      CURMONTH = "0" & FCURMONTH
             END IF
             IF (LEN(FCURDAY) < 2)
                      CURDAY = "0" & FCURDAY
             END IF
             CURDATE = CURYEAR & CURMONTH & CURDAY
    END FUNC

    ' ФУНКЦИЯ ПЕРЕВОДА ВРЕМЕНИ В ТЕКСТОВОЙ ФОРМАТ
    FUNC CURTIME(FCURHOUR,FCURMIN,FCURSEC)
             IF (LEN(FCURHOUR) < 2)
                      CURHOUR = "0" & FCURHOUR
             END IF
             IF (LEN(FCURMIN) < 2)
                      CURMIN = "0" & FCURMIN
             END IF
             CURTIME = CURHOUR & CURMIN & "00"
    END FUNC

END_PROGRAM

PARAMETER SERVERDATE;
PARAMETER_TITLE Дата;
PARAMETER_DESCRIPTION Текущая дата;
PARAMETER_TYPE STRING(10);
END

PARAMETER SERVERTIME;
PARAMETER_TITLE Время;
PARAMETER_DESCRIPTION Текущее время;
PARAMETER_TYPE STRING(10);
END

PARAMETER INSTRUMENT;
PARAMETER_TITLE Инструмент;
PARAMETER_DESCRIPTION Торгуемый инструмент;
PARAMETER_TYPE STRING(5);
END

PARAMETER INTEREST;
PARAMETER_TITLE ОИ;
PARAMETER_DESCRIPTION Открытый интерес;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER RATE;
PARAMETER_TITLE Изменение;
PARAMETER_DESCRIPTION Относительное зменение ОИ за интервал;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER MAXVAL;
PARAMETER_TITLE Макс ОИ;
PARAMETER_DESCRIPTION Максимальный ОИ за ТС;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER MAXTIME;
PARAMETER_TITLE Время Макс;
PARAMETER_DESCRIPTION Время макс. знач.;
PARAMETER_TYPE STRING(10);
END

PARAMETER MAXCOST;
PARAMETER_TITLE Цена Макс;
PARAMETER_DESCRIPTION Цена макс. знач.;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER MINVAL;
PARAMETER_TITLE Мин ОИ;
PARAMETER_DESCRIPTION Минимальный ОИ за ТС;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER MINTIME;
PARAMETER_TITLE Время Мин;
PARAMETER_DESCRIPTION Время мин. знач.;
PARAMETER_TYPE STRING(10);
END

PARAMETER MINCOST;
PARAMETER_TITLE Цена Мин;
PARAMETER_DESCRIPTION Цена мин. знач.;
PARAMETER_TYPE NUMERIC(10,2);
END

END_PORTFOLIO_EX

Комментариев нет:

Отправить комментарий