Торговый робот — таймер
Продолжаем серию простых торговых роботов, выполняющих сервисные функции. Сегодня рассмотрим алгоритм снятия активных заявок по таймеру, и заодно научимся работать с темпоральными значениями заявок. Итак, что умеет этот торговый робот:
- отслеживать факт соединения с сервером;
- определять серверное время;
- функционировать в заданном пользователем промежутке между началом и окончанием сессии;
- отфильтровывать активные заявки по времени постановки;
- снимать активные заявки, с момента постановки которых прошло больше времени, чем заданно пользователем.
Робот очень простой, и это будет полезно новичкам, которые недавно присоединились в нашему сообществу, поэтому код выкладываю в общий, бесплатный доступ. Блоки, использованные в этом торговом роботе универсальные, которые я применяю повсеместно. Код ориентирован на ФОРТС, но с применением знаний, полученных Вами из публикации «Особенности торговых роботов для ММВБ» можно легко его адаптировать под эту площадку.
Код:
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, Торговый робот
Этот робот отслеживает только настроенный инструмент, если нужно — скажите, я выложу этот же робот без привязки к инструменту вообще.
Привет,отличный робот полезен всем,очень понравилось элегантное решение по настройке времени торговой сессии
Евгений Reply:
июля 4, 2010 at 18:32
Привет. Я рад, что оказался полезен.
На днях выложу робота. который просто закрывает ВСЕ открытые позиции в установленное время.
Привет,будет интересно,но если не ошибаюсь Б.Х уже реалезована функция закрытия позици в установленное время.
Евгений Reply:
июля 5, 2010 at 10:04
Нет, в BlackHole такой функции нет.