Определение текущих заявок в опционах

Страницы: 1
RSS
Определение текущих заявок в опционах
 
 Подскажите, пожалуйста, почему не работает? Ставлю активную заявку на покупку, а BUYORDERS = 0

INSTRUMENT="RI107500BQ0B"
ACCOUNT="SPBFUT42..." (вместо ... буква, цифра, буква, в общем, мой аккаунт)

-----
' ТЕКУЩИЕ ЗАЯВКИ
BUYORDERS=0
SELLORDERS=0
TPPUT=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
       TPPUT=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "TOTAL_NET")+0
       BUYORDERS=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "OPEN_BUYS")+0
       SELLORDERS=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "OPEN_SELLS")+0
   END IF
END FOR
-----
 
Здравствуйте,
Описанная проблема у нас не воспроизводится.
Проверьте в самой таблице позиций по клиентским счетам, какое значение в колонке "Акт. покупка"?
Также уточните какая версия терминала QUIK используется.
 
Дополним,
Есть догадка, что портфель просто слишком редко проверяет значения.
Проверьте какой интервал указан в "Период расчета"
 
> Проверьте в самой таблице позиций по клиентским счетам, какое значение в колонке "Акт. покупка"?

1 на покупку и 1 на продажу, скрин прикрепил.



> Также уточните какая версия терминала QUIK используется.

8.4.1.6
 
Цитата
Sergey Gorokhov написал:
Дополним,
Есть догадка, что портфель просто слишком редко проверяет значения.
Проверьте какой интервал указан в "Период расчета"
2 секунды
 
 Уточню: в целом код на фьючерсах работает отлично, но тут робот для опционов (INSTRUMENT="RI107500BQ0B" - это пут опцион), на них не работает почему-то.
 
Цитата
Alexk написал:
Уточню: в целом код на фьючерсах работает отлично, но тут робот для опционов (INSTRUMENT="RI107500BQ0B" - это пут опцион), на них не работает почему-то.

А у нас работает.


Приложите полную версию кода который не работает
 
Вот робот полностью

-----------------------------------------
PORTFOLIO_EX STOPPUT!;
DESCRIPTION STOPPUT!;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
' НАСТРОЙКИ
ACCOUNT="SPBFUT420G2" ' ПРОПИСЫВАЕМ АККАУНТ НА ФОРТС
INDEX="RIM0"
INSTRUMENT="RI107500BQ0B"

'========= ГЛОБАЛЬНЫЕ РАСЧЕТЫ ============================================================­=
' ============================================================­=============================
DATETIME=GET_VALUE(GET_DATETIME(), "DATETIME")
DATE=SUBSTR(DATETIME,6,4)&SUBSTR(DATETIME,3,2)&SUBSTR(DATETIME,0,2)
SHORTDATE=SUBSTR(DATETIME,4,1)&SUBSTR(DATETIME,0,2)

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

' ФУНКЦИЯ ПЕРЕВОДА ДАТЫ И ВРЕМЕНИ В ТЕКСТОВЫЙ ФОРМАТ
FUNC FTEXTDATA(YEAR,MONTH,DAY)
   IF (LEN(MONTH) < 2)
       MONTH = "0" & MONTH
   END IF
   IF (LEN(DAY) < 2)
       DAY = "0" & DAY
   END IF
   RESULT = YEAR & MONTH & DAY
END FUNC
FUNC FTEXTTIME(HOUR,MIN,SEC)
   IF (LEN(HOUR) < 2)
       HOUR = "0" & HOUR
   END IF
   IF (LEN(MIN) < 2)
       MIN = "0" & MIN
   END IF
   RESULT = HOUR & MIN & "00"
END FUNC

'========= // ГЛОБАЛЬНЫЕ РАСЧЕТЫ ============================================================­

'========= INDEX
NEW_GLOBAL("OFFERINDEXNOW",0)
BIDINDEX=0
OFFERINDEX=0
' ========= СТАКАН
STAKAN = CREATE_MAP()
TEMP_MAP = CREATE_MAP()
TEMP_MAP1 = CREATE_MAP()
STAKAN=GET_QUOTES_II_LEVEL_DATA("SPBFUT",INDEX)
BIDCOUNT = GET_VALUE(STAKAN, "BID_COUNT")+0
OFFERCOUNT =GET_VALUE(STAKAN, "OFFER_COUNT")+0

' НАХОДИМ BIDINDEX
TEMP_MAP = GET_VALUE(STAKAN, "BID")
TEMP_MAP1 = GET_COLLECTION_ITEM(TEMP_MAP, BIDCOUNT-1)
BIDINDEX=GET_VALUE(TEMP_MAP1, "PRICE")+0

' НАХОДИМ OFFER
TEMP_MAP = GET_VALUE(STAKAN, "OFFER")
TEMP_MAP1 = GET_COLLECTION_ITEM(TEMP_MAP, 0)
OFFERINDEX=GET_VALUE(TEMP_MAP1, "PRICE")+0

'========= // INDEX

'========= INSTRUMENT
' ========= СТАКАН
STAKAN = CREATE_MAP()
TEMP_MAP = CREATE_MAP()
TEMP_MAP1 = CREATE_MAP()
STAKAN=GET_QUOTES_II_LEVEL_DATA("SPBOPT",INSTRUMENT)
BIDCOUNT = GET_VALUE(STAKAN, "BID_COUNT")+0
OFFERCOUNT =GET_VALUE(STAKAN, "OFFER_COUNT")+0

' НАХОДИМ BID
TEMP_MAP = GET_VALUE(STAKAN, "BID")
TEMP_MAP1 = GET_COLLECTION_ITEM(TEMP_MAP, BIDCOUNT-1)
BIDINSTRUMENT=GET_VALUE(TEMP_MAP1, "PRICE")+0

' НАХОДИМ OFFER
TEMP_MAP = GET_VALUE(STAKAN, "OFFER")
TEMP_MAP1 = GET_COLLECTION_ITEM(TEMP_MAP, 0)
OFFERINSTRUMENT=GET_VALUE(TEMP_MAP1, "PRICE")+0
'========= // INSTRUMENT

'========= ФУНКЦИЯ ПОСТАНОВКИ ЗАЯВКИ НА ПРОДАЖУ
FUNC ORDERSELL(INSTRUMENT,FPRICE,FLOTS,"S",FIGURA)
   FLOTS=CEIL(FLOTS)
   NEW_GLOBAL("TRANS_PARAMS", "")
   NEW_GLOBAL("TRANS_RESULT", "")
   MASKORDER=TRID+0
   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", "SPBOPT")
   TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
   TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
   TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "OPERATION", "S"&"")
   TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "PRICE", FPRICE&"")
   TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "QUANTITY", FLOTS&"")
   TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLIENT_CODE", FIGURA&"")
   TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
   RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
   MESSAGE (TRANS_RESULT,1)
END FUNC

' =========== УДАЛЯЕМ ЗАЯВКИ
 FUNC KILLALLORDERS(KEY)
   MESSAGE ("СНИМАЕМ "&KEY,1)
   N=GET_NUMBER_OF("ORDERS")
   IF N>0
       FOR I FROM 0 TO N
           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", "7"&TIME)
               TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", "SPBOPT")
               TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", KEY)
               TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ORDER_KEY", GET_VALUE (GET_ITEM ("ORDERS", I), "ORDER_NUMBER")&"")
               TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "KILL_ORDER")
               TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
           END IF
       END FOR
    END IF
 END FUNC

' ТЕКУЩИЕ ЗАЯВКИ
BUYORDERS=0
SELLORDERS=0
TPPUT=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
       TPPUT=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "TOTAL_NET")+0
       BUYORDERS=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "OPEN_BUYS")+0
       SELLORDERS=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",I), "OPEN_SELLS")+0
   END IF
END FOR
 
 
OUTPUT=CREATE_MAP()
DELETE_ALL_ITEMS()
OUTPUT=SET_VALUE(OUTPUT,"NAME",TIME)
OUTPUT=SET_VALUE(OUTPUT,"TPPUT","")
OUTPUT=SET_VALUE(OUTPUT,"BID",BIDINDEX)
OUTPUT=SET_VALUE(OUTPUT,"OFFER",OFFERINDEX)
OUTPUT=SET_VALUE(OUTPUT,"BUYORDERS","")
OUTPUT=SET_VALUE(OUTPUT,"SELLORDERS","")
ADD_ITEM(1,OUTPUT)
OUTPUT=SET_VALUE(OUTPUT,"NAME",INSTRUMENT)
OUTPUT=SET_VALUE(OUTPUT,"TPPUT",TPPUT)
OUTPUT=SET_VALUE(OUTPUT,"BID",BIDINSTRUMENT)
OUTPUT=SET_VALUE(OUTPUT,"OFFER",OFFERINSTRUMENT)
OUTPUT=SET_VALUE(OUTPUT,"BUYORDERS",BUYORDERS)
OUTPUT=SET_VALUE(OUTPUT,"SELLORDERS",SELLORDERS)
ADD_ITEM(2,OUTPUT)
END_PROGRAM

PARAMETER NAME;
PARAMETER_TITLE NAME;
PARAMETER_DESCRIPTION NAME;
PARAMETER_TYPE STRING(25);
END
PARAMETER BID;
PARAMETER_TITLE BID;
PARAMETER_DESCRIPTION BID;
PARAMETER_TYPE STRING(25);
END
PARAMETER OFFER;
PARAMETER_TITLE OFFER;
PARAMETER_DESCRIPTION OFFER;
PARAMETER_TYPE NUMERIC(4,0);
END
PARAMETER BUYORDERS;
PARAMETER_TITLE BUYORDERS;
PARAMETER_DESCRIPTION BUYORDERS;
PARAMETER_TYPE NUMERIC(4,0);
END
PARAMETER SELLORDERS;
PARAMETER_TITLE SELLORDERS;
PARAMETER_DESCRIPTION SELLORDERS;
PARAMETER_TYPE NUMERIC(4,0);
END
PARAMETER TPPUT;
PARAMETER_TITLE TPPUT;
PARAMETER_DESCRIPTION TPPUT;
PARAMETER_TYPE NUMERIC(4,0);
END

END_PORTFOLIO_EX
-----------------
 
Цитата
Alexk написал:
Вот робот полностью

К сожалению затруднимся назвать причины, присланный код у нас также нормально работает, даже на версии 8.4.1.6

Проверьте внимательней корректно ли указан Ваш счет (параметр ACCOUNT)
особо отметим что регистр символов имеет значение т.е. если в QUIK в счете присутствуют маленькие буквы, то и в скрипте тоже должны быть указаны маленькие буквы.

Если разобраться не получится пришлите на quiksupport@arqatech.com архив всей папки с терминалом QUIK (без ключей доступа)
Архив следует паковать при закрытом терминале QUIK
 
 Причина оказалась в регистре букв параметра ACCOUNT. Проблема решена. Спасибо!
 
 Подскажите, пожалуйста, почему не работает функция "УДАЛЯЕМ ЗАЯВКИ", робот полностью показан выше?

Я пробовал вызвать функцию и KILLALLORDERS(INSTRUMENT), и KILLALLORDERS(899), заявки не снимаются.

--------
' =========== УДАЛЯЕМ ЗАЯВКИ
 FUNC KILLALLORDERS(KEY)
   MESSAGE ("СНИМАЕМ "&KEY,1)
   N=GET_NUMBER_OF("ORDERS")
   IF N>0
       FOR I FROM 0 TO N
            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", "7"&TIME)
               TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", "SPBOPT")
               TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", KEY)
               TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ORDER_KEY", GET_VALUE (GET_ITEM ("ORDERS", I), "ORDER_NUMBER")&"")
               TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "KILL_ORDER")
               TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
           END IF
       END FOR
    END IF
 END FUNC
----------------------
 
Alexk,

Уточните зачем Вам QPILE?

Биржа вот вот переведет срочный рынок на новую систему в которой будут 19ти значные номера заявок.
А в QPILE нет поддержки 19ти значных цифр.
В результате, после обновления ТС Вы вообще не сможете снимать заявки через QPILE.

Судя по всему, Вы только начали изучение программирования в QUIK
В связи с чем рекомендуем даже не начинать пытаться что то делать на QPILE, а сразу перейти на работу с QLUA скриптами.
 
> В связи с чем рекомендуем даже не начинать пытаться что то делать на QPILE, а сразу перейти на работу с QLUA скриптами.

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

Можете написать, пожалуйста, почему не работает функция "УДАЛЯЕМ ЗАЯВКИ" на опционах (повторюсь, на фьючерсах работает отлично)?
 
Alexk,

Цитата
Alexk написал:
но мне нужен небольшой робот, который, в принципе, рабочий,
Ваше право. Хотя смысла нет ибо скрипт будет работать не долго, потом сами будете себя корить когда он вдруг сломается и переходить на QLUA будет уже поздно.
Цитата
Alexk написал:
Можете написать, пожалуйста, почему не работает функция "УДАЛЯЕМ ЗАЯВКИ" на опционах (повторюсь, на фьючерсах работает отлично)?

У нас работает, почему у Вас не работает непонятно, опять что то недоговариваете.
Посмотрите что возвращается в TRANS_RESULT
Для этого добавьте строку сразу после TRANS_RESULT
message("Result: " & get_value (TRANS_RESULT, "RESULT") & ", Result_ex: " & get_value (TRANS_RESULT, "RESULT_EX") & ", OrderNum: " & get_value (TRANS_RESULT, "ORDER_NUMBER") & ", Description: " & get_value (TRANS_RESULT, "DESCRIPTION"),1)
 
 Перепроверил, немного поправил, все работает. Спасибо!
Страницы: 1
Читают тему
Наверх