Торговый робот — таймер

1 июля 2010

timerПродолжаем серию простых торговых роботов, выполняющих сервисные функции. Сегодня рассмотрим алгоритм снятия активных заявок по таймеру, и заодно научимся работать с темпоральными значениями заявок. Итак, что умеет этот торговый робот:

  • отслеживать факт соединения с сервером;
  • определять серверное время;
  • функционировать в заданном пользователем промежутке между началом и окончанием сессии;
  • отфильтровывать активные заявки по времени постановки;
  • снимать активные заявки, с момента постановки которых прошло больше времени, чем заданно пользователем.

Робот очень простой, и это будет полезно новичкам, которые недавно присоединились в нашему сообществу, поэтому код выкладываю в общий, бесплатный доступ. Блоки, использованные в этом торговом роботе универсальные, которые я применяю повсеместно. Код ориентирован на ФОРТС, но с применением знаний, полученных Вами из публикации «Особенности торговых роботов для ММВБ»  можно легко его адаптировать под эту площадку.

Код:

PORTFOLIO_EX TIMER-FORTS;
DESCRIPTION TIMER-FORTS;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;

PROGRAM
' рекомендуемый редактор: http://notepad-plus.sourceforge.net/ru/site.htm в меню Синтаксис выберите QPL, будет приятная подсветка блоков.
' инструкция по загрузке робота в Квик: http://www.hirobot.ru/2009/03/kak-zagruzhat-i-nastraivat-torgovogo-robota/
' ************************

' НАСТРОЙКИ ТОЛЬКО ЗДЕСЬ!
ACCOUNT="SPBFUT00XXX" ' ВПИСАТЬ АККАУНТ!!!
INSTRUMENT="RIU0" ' КОД НУЖНОГО ИНСТРУМЕНТА
TIMER=5 ' ДЛИТЕЛЬНОСТЬ ПЕРИОДА АКТИВНОСТИ ЗАЯВКИ В МИНУТАХ
BEGINSES=93000 ' НАЧАЛО СЕССИИ
ENDSES=234000 ' КОНЕЦ
' *************

'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM("SERVERTIME")
SERVERDATE=GET_INFO_PARAM("TRADEDATE")
TIMESERV=SUBSTR(SERVERTIME,0,2)&SUBSTR(SERVERTIME,3,2)&SUBSTR(SERVERTIME,6,7)
HOUR=SUBSTR(TIMESERV,0,2)+0
MIN=SUBSTR(TIMESERV,2,2)+0
SEC=SUBSTR(TIMESERV,4,2)+0
TIME=TIMESERV+0
DATE=SUBSTR(SERVERDATE,6,4)&SUBSTR(SERVERDATE,3,2)&SUBSTR(SERVERDATE,0,2)
TRID=TIME&DATE

'========= КОНТРОЛЬ СОЕДИНЕНИЯ С СЕРВЕРОМ И ВРЕМЕНИ СЕССИИ
IF IS_CONNECTED()<>1 OR TIME<BEGINSES OR TIME>ENDSES
RETURN
END IF

'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ТЕКУЩЕЙ ПОЗИЦИИ И КОЛ-ВА АКТИВНЫХ ЗАЯВОК
TP=0
ORDERCOUNTBUY=0
ORDERCOUNTSELL=0
ORDERCOUNT=0
FOR I FROM 0 TO GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")
IF GET_VALUE (GET_ITEM ("FUTURES_CLIENT_HOLDINGS", I), "SECCODE")=INSTRUMENT AND GET_VALUE (GET_ITEM ("FUTURES_CLIENT_HOLDINGS", I), "TRDACCID")=ACCOUNT
TP=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "TOTAL_NET")+0
ORDERCOUNTBUY=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "OPEN_BUYS")+0
ORDERCOUNTSELL=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "OPEN_SELLS")+0
ORDERCOUNT=ORDERCOUNTBUY+ORDERCOUNTSELL
END IF
END FOR

'========= ФОРМИРОВАНИЕ МОМЕНТА ВРЕМЕНИ, БОЛЬШЕГО НА TIMER ЧЕМ ТЕКУЩЕЕ
IF MIN-TIMER>=0
MIN=MIN-TIMER
ELSE
MIN=(60+MIN)-TIMER
HOUR=HOUR-1
END IF
IF MIN<10
MIN="0"&MIN
END IF
IF SEC<10
SEC="0"&SEC
END IF
TIMEFORKILL=HOUR&MIN&SEC ' ПОЛУЧИЛИ МОМЕНТ В ТЕКСТОФОМ ФОРМАТЕ
TIMEFORKILL=TIMEFORKILL+0 ' ПРЕВРАЩАЕМ ТЕКСТ В ЧИСЛО

'========= ФИЛЬТР ПО ВРЕМЕНИ В ТАБЛИЦЕ ЗАЯВОК
IF ORDERCOUNT<>0
FOR I FROM 0 TO GET_NUMBER_OF("ORDERS")
' ЕСЛИ АКТИВНАЯ ЗАЯВКА И У НЕЕ ВРЕМЯ МЕНЬШЕ ИЛИ РАВНО ВЫЧЕСЛЕННОМУ МОМЕНТУ..
IF GET_VALUE (GET_ITEM ("ORDERS", I), "STATUS")="ACTIVE" AND GET_VALUE (GET_ITEM ("ORDERS", I), "SECCODE")=INSTRUMENT AND GET_VALUE (GET_ITEM ("ORDERS", I), "TIME")+0<=TIMEFORKILL
NUMBER=GET_VALUE(GET_ITEM ("ORDERS", I), "NUMBER")
KILLORDER(NUMBER) ' ..ПЛИ!!!
END IF
END FOR
END IF

'========= ФУНКЦИИ
' ФУНКЦИЯ СНЯТИЯ ОДНОЙ ЗАЯВКИ ПО НОМЕРУ.
FUNC KILLORDER(NUMBER)
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", TRID)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", "SPBFUT")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "KILL_ORDER")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ORDER_KEY", NUMBER&"")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
MESSAGE(RESULT,1)
END FUNC

'========= ФОРМИРУЕМ ТАБЛИЦУ РОБОТА
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT,"TIME",TIME)
OUTPUT=SET_VALUE(OUTPUT,"TP",TP)
OUTPUT=SET_VALUE(OUTPUT,"ORDERCOUNT",ORDERCOUNT)
DELETE_ALL_ITEMS()
ADD_ITEM(1,OUTPUT)

END_PROGRAM

PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING(30);
END

PARAMETER TP;
PARAMETER_TITLE ТЕКУЩАЯ ПОЗИЦИЯ;
PARAMETER_DESCRIPTION ТЕКУЩАЯ ПОЗИЦИЯ;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER ORDERCOUNT;
PARAMETER_TITLE КОЛ-ВО ЗАЯВОК;
PARAMETER_DESCRIPTION КОЛ-ВО ЗАЯВОК;
PARAMETER_TYPE NUMERIC(10,0);
END
END_PORTFOLIO_EX

Скачать торговый робот.

п.с. На будильничке внизу — турбийон :)

Евгений QUIK, Начинающим, Полезные программы для QUIK, Торговый робот , , , ,

  1. Евгений
    2 Июль 2010 в 10:36 | #1

    Этот робот отслеживает только настроенный инструмент, если нужно — скажите, я выложу этот же робот без привязки к инструменту вообще.

  2. alex_davyd
    4 Июль 2010 в 11:56 | #2

    Привет,отличный робот полезен всем,очень понравилось элегантное решение по настройке времени торговой сессии

    Евгений Reply:

    Привет. Я рад, что оказался полезен.

    На днях выложу робота. который просто закрывает ВСЕ открытые позиции в установленное время.

  3. alex_davyd
    5 Июль 2010 в 09:41 | #3

    Привет,будет интересно,но если не ошибаюсь Б.Х уже реалезована функция закрытия позици в установленное время.

    Евгений Reply:

    Нет, в BlackHole такой функции нет.

Необходимо войти на сайт, чтобы написать комментарий.