QPILE робот закрывающий позиции на ночь / QUIK Profit
Главная Quikprofit twiiter Quikprofit Rss

Закрываем позиции вовремя

Март 5, 2010 | Нет комментариев

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

Идея успешно была воплощена в жизнь. Любуйтесь бесплатно …

К слову о том, зачем это надо.

Вариант первый «Лентяй»: не люблю оставлять позиции открытыми на выходные или праздники или просто на ночь, но не всегда имеется возможность сделать это вручную (подойти к компьютеру).

Вариант второй «Стратегия»: согласно выбранной стратегии позиция закрывается каждый час.

Вполне убедительно. Утилита CloseInTime нужна.

Значит будем писать!

Входящие данные:

  • список отслеживаемых инструментов (ToolSecCodeList),
  • желаемое время закрытия позиций (CloseDayTime и CloseDayPeriod
  • личные опознавательные данные (ClientCode, FirmId, Account).

Пожалуй этого достаточно.

Алгоритм прост: Quik проверяет совпадение текущего времени с временем закрытия позиций, если совпадает и имеются открытые позиции по указанным инструментам, то выставляются заявки по лучшей цене на закрытие. При этом задается время начала закрытия, так называемый «старт» (CloseDayTime) и период активности в минутах (CloseDayPeriod).

В нашем примере мы используем следующие значения переменных:

  • CloseDayTime = 1830 (указывается в формате ЧЧММ без каких либо пробелой, точек и т.д. Секунды не учитываются)
  • CloseDayPeriod = 10 (указывается значение от 01 до 60)

Это означает, что начиная с 18.30 в течение 10 минут Quik должен закрывать позиции.

А теперь от слов к делу:

Код утилиты:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
PORTFOLIO_EX Закрытие позиций;
DESCRIPTION QuikProfit CloseInTime;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
 
PROGRAM
' Список инструментов, по которым необходимо закрыть позиции, через запятую
ToolSecCodeList = "VTBR,GAZP"
' Время закрытия
CloseDayTime = 1830
' Интервал в течении которого необходимо закрыть позиции (мин)
CloseDayPeriod = 10
ClientCode = "56786"
FirmId = "MC02193454630"
Account = "Y02-00000B01"
 
output = create_map()
delete_all_items()
CurrentDay = get_value(GET_DATETIME(), "DAY") + 0
CurrentMonth = get_value(GET_DATETIME(), "MONTH") + 0
CurrentYear = get_value(GET_DATETIME(), "YEAR") + 0
CurrentHours = get_value(GET_DATETIME(), "Hour") + 0
CurrentMinutes = (get_value(GET_DATETIME(), "Min") + 0
CloseTime = ((substr(CloseDayTime, 0, 2) + 0) * 60 + (substr(CloseDayTime, 2, 2) + 0)) + 0
CurrentTime = CurrentHours * 60 + CurrentMinutes
 
if ((CurrentTime < CloseTime) or (CurrentTime >= (CloseTime + CloseDayPeriod)))
    output = set_value (output, "ParamName", "Статус")
    output = set_value (output, "ParamValue", "Выкл")
    add_item(1, output)
    return
end if
 
output = set_value (output, "ParamName", "Статус")
output = set_value (output, "ParamValue", "Вкл")
add_item(1, output)
for Tool_SecCode in ToolSecCodeList
    Tool_Info = GET_SECURITY_INFO ("", Tool_SecCode)
    Tool_Quantity = depo_current_balance (ClientCode, FirmId, Tool_SecCode, Account)
    if (Tool_Quantity <> 0)
        output = set_value (output, "ParamName", "Инструмент")
        output = set_value (output, "ParamValue", Tool_SecCode)
        add_item(1, output)
        OrderQuery = create_map()
        OrderQuery = SET_VALUE (OrderQuery, "ACCOUNT", Account)
        OrderQuery = SET_VALUE (OrderQuery, "CLIENT_CODE", ClientCode)
        OrderQuery = SET_VALUE (OrderQuery, "CLASSCODE", get_value(Tool_Info, "CLASS_CODE"))
        OrderQuery = SET_VALUE (OrderQuery, "SECCODE", Tool_SecCode)
        OrderQuery = SET_VALUE (OrderQuery, "ACTION", "NEW_ORDER")
        OrderPrice = 0
        Operation = ""
        if (Tool_Quantity < 0)
            OrderPrice = get_param(get_value(Tool_Info, "CLASS_CODE"), Tool_SecCode, "BID") + 0
            Tool_Quantity = Tool_Quantity * -1
            Operation = "B"
        else
            OrderPrice = get_param(get_value(Tool_Info, "CLASS_CODE"), Tool_SecCode, "OFFER") + 0
            Operation = "S"
        end if
        findx = find(OrderPrice, 0, ".")
        if (findx <> -1)
            OrderPrice = substr(OrderPrice, 0, findx) & "." & SUBSTR(OrderPrice, (findx + 1), get_value(Tool_Info, "SCALE"))
        else
            Message("Неправильный формат цены", 1)
            return
        end if
        OrderQuery = SET_VALUE (OrderQuery, "PRICE", OrderPrice)
        OrderQuery = SET_VALUE (OrderQuery, "QUANTITY", (Tool_Quantity / get_value (Tool_Info, "LOT_SIZE")))
        OrderQuery = SET_VALUE (OrderQuery, "OPERATION", Operation)
        OrderQuery = SET_VALUE (OrderQuery, "TRANS_ID", 100)
        QueryResult = send_transaction(400, OrderQuery)
        if (get_value(QueryResult, "RESULT_EX") == "3")
            output = set_value (output, "ParamName", "Заявка")
            output = set_value (output, "ParamValue", "Отправлена")
            add_item(1, output)
            output = set_value (output, "ParamName", "Номер заявки")
            output = set_value (output, "ParamValue", get_value(QueryResult, "ORDER_NUMBER"))
            add_item(1, output)
        else
            output = set_value (output, "ParamName", "Заявка")
            output = set_value (output, "ParamValue", "Ошибка: " & get_value (QueryOrder, "RESULT_EX"))
            add_item(1, output)
        end if
    end if
    output = set_value (output, "ParamName", "----")
    output = set_value (output, "ParamValue", "----")
    add_item(1, output)
end for
 
' Доп функции
func fStrToTime (fStrToTime_Hour, fStrToTime_Minutes)
    if (len(fStrToTime_Hour) < 2)
        fStrToTime_Hour = "0" & fStrToTime_Hour
    end if
    if (len(fStrToTime_Minutes) < 2)
        fStrToTime_Minutes = "0" & fStrToTime_Minutes
    end if
    result = fStrToTime_Hour & fStrToTime_Minutes
end func
 
END_PROGRAM
 
PARAMETER ParamName;
PARAMETER_TITLE Название параметра;
PARAMETER_DESCRIPTION Название параметра;
PARAMETER_TYPE STRING(30);
END
 
PARAMETER ParamValue;
PARAMETER_TITLE Значение параметра;
PARAMETER_DESCRIPTION Значение параметра;
PARAMETER_TYPE STRING(30);
END
 
END_PORTFOLIO_EX

Это важно! Утилита не контролирует уже выставленные заявки на закрытие, так что если заявка не исполнится, то при следующем расчете портфеля, заявки вновь будут выставлены. А это грозит Вам либо открытием новых коротких позиций, либо увеличение объема длинных позиций.

Понравилось? Следите за обновлениями по RSS! Также можете следить за обновлениями в Twitter.
          0 проголосовавших

Комментарии

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





Поля помеченные (*) обязательны к заполнению

Страница 1 из 11
  • Меню

  • Облако тегов

  • Рубрики

  • Для пользователя