Главная > Начинающим, Полезные программы для QUIK, Торговый робот > Торговый робот — «Уходя гасите всех!»

Торговый робот — «Уходя гасите всех!»

bombaВ предыдущей публикации мы рассмотрели код торгового робота, который снимает активные заявки по прошествии заданного времени, с момента их постановки в систему. Сейчас мы познакомимся с подобным, простым сервисным роботом, который в определенное время закрывает открытые позиции по выбранному инструменту. Логика проста: задаем время старта и время окончания работы, отслеживаем серверное время, кол-во открытых позиций и кол-во активных заявок, и при наступлении времени окончания — снимаем все активные заявки по инструменту и закрываем открытые позиции. Таким образом мы останавливаем все действия по инструменту автоматически. Робот выложен в бесплатном доступе. Enjoy!!


PORTFOLIO_EX CLOSE_ALL_POSITION;
DESCRIPTION CLOSE_ALL_POSITION;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;

PROGRAM

' НАСТРОЙКИ ТОЛЬКО ЗДЕСЬ!
INSTRUMENT="RIU0"
BEGINSES=101000 ' СТАРТ РОБОТА
ENDSES=184000 ' ОКОНЧАНИЕ РАБОТЫ РОБОТА. ПОСЛЕ ЭТОГО ВРЕМЕНИ ПОЗИЦИИ ЗАКРЫВАЮТСЯ

'========= ПЕРЕМЕННЫЕ
ACCOUNT=GET_VALUE(GET_ITEM("FUTURES_CLIENT_LIMITS",1), "TRDACCID")&""
NEW_GLOBAL("FLAGEND",0)

'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
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

'========= ПОЛУЧАЕМ ДАННЫЕ ПО БУМАГЕ
LAST=GET_VALUE(GET_PARAM_EX("SPBFUT",INSTRUMENT,"LAST"),"PARAM_VALUE")+0
STEP=GET_VALUE(GET_PARAM_EX("SPBFUT",INSTRUMENT,"SEC_PRICE_STEP"),"PARAM_VALUE")+0
BID=GET_VALUE(GET_PARAM_EX("SPBFUT",INSTRUMENT,"BID"),"PARAM_VALUE")+0
ASK=GET_VALUE(GET_PARAM_EX("SPBFUT",INSTRUMENT,"OFFER"),"PARAM_VALUE")+0

'========= КОНТРОЛЬ ДАННЫХ ПО БУМАГЕ
IF LAST=0 OR BID=0 OR ASK=0
MESSAGE("НЕПРАВИЛЬНАЯ НАСТРОЙКА КОДА БУМАГИ",1)
RETURN
END IF

'========= TP&ORDERCOUNT
TP=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
END IF
END FOR
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
ORDERCOUNT=ORDERCOUNT+1
END IF
END FOR

'========= ЗАКРЫТИЕ ПОЗИЦИЙ В КОНЦЕ СЕССИИ
IF TIME>ENDSES
IF TP>0
KILLALLORDERS(1)
LOTS=ABS(TP)
SELL(1)
END IF
IF TP<0
KILLALLORDERS(1)
LOTS=ABS(TP)
BUY(1)
END IF
END IF

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

'========= ФОРМИРОВАНИЕ ТАБЛИЦЫ
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT,"TIME",TIME)
OUTPUT=SET_VALUE(OUTPUT,"TP",TP)
OUTPUT=SET_VALUE(OUTPUT,"LAST",LAST)

DELETE_ALL_ITEMS()
ADD_ITEM(1,OUTPUT)

'========= ФУНКЦИИ
' BUY
FUNC BUY(KEYS)
PRICE=ASK+STEP*10
LOG="ЗАКРЫВАЮ ШОРТ"
MESSAGE (LOG,1)
ORDER(PRICE,LOTS,"B")
END FUNC

' SELL
FUNC SELL(KEYS)
PRICE=BID-STEP*10
LOG="ЗАКРЫВАЮ ЛОНГ"
MESSAGE (LOG,1)
ORDER(PRICE,LOTS,"S")
END FUNC

' ORDER
FUNC ORDER(FPRICE,FLOTS,FDIRECTION)
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, "ACTION", "NEW_ORDER")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TYPE", "L")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", "SPBFUT")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "OPERATION", FDIRECTION&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "PRICE", FPRICE&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "QUANTITY", FLOTS&"")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
MESSAGE(RESULT,1)
PAUSE(5)
END FUNC

' PAUSE
FUNC PAUSE(PAUSE_TIME)
PST = GET_DATETIME()
FIRST_SYS_TIME = 0+GET_VALUE(PST, "HOUR")*3600000 + GET_VALUE(PST, "MIN")*60000 + GET_VALUE(PST, "SEC")*1000 + GET_VALUE(PST, "MILLISEC")
FOR PST_FLAG FROM 0 TO 1
PST = GET_DATETIME()
SECOND_SYS_TIME = 0+GET_VALUE(PST, "HOUR")*3600000 + GET_VALUE(PST, "MIN")*60000 + GET_VALUE(PST, "SEC")*1000 + GET_VALUE(PST, "MILLISEC")
DIFF_TIME=(SECOND_SYS_TIME-FIRST_SYS_TIME)
IF  DIFF_TIME<= PAUSE_TIME*1000
PST_FLAG = -1
END IF
END FOR
END FUNC

' KILLALLORDERS
FUNC KILLALLORDERS(KEY)
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
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", "1"&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", GET_VALUE (GET_ITEM ("ORDERS",I),"NUMBER")&"")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
END IF
END FOR
END IF
END FUNC

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 LAST;
PARAMETER_TITLE КОТИРОВКА;
PARAMETER_DESCRIPTION КОТИРОВКА;
PARAMETER_TYPE NUMERIC(10,2);
END
END_PORTFOLIO_EX

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

п.с. Возьму уроки рисования связки динамита с часами :)

  1. alex_davyd
    12 Август 2010 в 21:39 | #1

    Привет,элегантно,у себя добавил удаление стопов после закрытия позиции,всегда работаю со стопами ,

  2. home30
    6 Октябрь 2011 в 13:43 | #2

    Здравствуйте!

    У меня при работе робота, после того, как наступит время из параметра endses? квик выдает сообщение «Ошибка транзакции».Что делать?

  3. home30
    6 Октябрь 2011 в 13:44 | #3

    Точнее пишет «неправильно указан идентификатор транзакции:134322111006» Я так понимаю-что это время и дата, когда закрывается позиция.

    Евгений Reply:

    Вместо TRID=TIME&DATE сделайте

    TRID=TIME

    В новых версиях Квика укоротили ID транзакции. В публикации наверху тоже поправил код.

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