Блог им. Toshkin

Робот под квик для подачи заявки по времени / уровню

По просьбам трудящихся выкладываю свою рабочую лошадку:

4-я строка FIRMS_LIST — «фирма», например из «позиций по клиентским счетам».
9-я ClientCode — «код клиента», например из «таблицы заявок».
10-я Depo — «торговый счет», например из «позиций по клиентским счетам».
11-я ClassCodeList — «код класса бумаги» для FInstrument из «таблицы заявок».
14-я Instrument — «код бумаги» от цены которой зависит выставление заявки.
15-я FInstrument — «код бумаги», по которой выставляется заявка.
21-я Operation «B» — покупка, «S» — продажа.
22 Volume — количество лотов в заявке.
23, 24, 25 — время для заявки по времени.
26 Delta — если 0, заявка пойдет по цене последней сделки на момент срабатывания, если нет — то с указанным сдвигом по цене.
27 PriceControl — если 0 — заявка по времени, -1 — заявка, если цена Instrument падает ниже PCLevel, 1 — заявка, если цена Instrument поднимается выше PCLevel.
28 PCLevel — уровень для PriceControl.

Цена Instrument берется из часовой диаграммы (закрытие предыдущей свечки). Создаем в квике диаграмму на инструмент, интервал 1 час. Правой кнопкой мыши на свечку => «Редактировать» => «Дополнительно», здесь указываем «Идентификатор». Такое же значение присваиваем переменной Instrument.

Последний параметр «Выход» = 0 пока условие для выставления заявки не выполнено, 1 — после выставления заявки.
После выставления заявки, дабы избежать всяких случайностей / неприятностей рекомендую кликнуть правой кнопкой мыши по табличке робота и выбрать «приостановить расчет», после чего закрыть табличку.

Сохраняем в текстовый файл с расширением .qpl
В квике идем в «Сервисы» => «QPILE скрипты...»
нажимаем «Добавить», выбираем файл, жмем «Загрузить локально» и «Создать таблицу», выбираем параметры, которые хотим видеть в таблице.

Для желающих погрузиться в эту тему советую скачать описание языка qpile отсюда: arqatech.com/upload/iblock/04f/Doc725.zip


PORTFOLIO_EX Time_public;
DESCRIPTION Time_public;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST 00000;

PROGRAM

' ОБЪЯВЛЯЕМ КОНСТАНТЫ
  ClientCode = ""
  Depo = ""
  ClassCodeList = «SPBFUT»

'=============================================
  Instrument = «SBER»
  FInstrument = «RIH9»
'=============================================

'=============================================
'==============   Параметры   ================
'=============================================
  Operation = «B»
  Volume = 10
  XHour = 14
  XMin = 40
  XSec = 0
  Delta = 0
  PriceControl = 0   ' -1 — <, 0 — без контроля, 1 — >
  PCLevel = 120.3
'=============================================

  Data = GET_DATETIME()
  Hour = GET_VALUE(Data,«HOUR») + 0
  Min = GET_VALUE(Data,«MIN»)+0
  Sec = GET_VALUE(Data,«SEC»)+0

  Output = CREATE_MAP()

' Не первый расчет
  IF GET_NUMBER_OF(«OWN») > 0

    OwnRow = GET_ITEM(«OWN»,1)

    FClose = GET_PARAM(ClassCodeList,FInstrument,«LAST») + 0

    Output = SET_VALUE(Output,«p_close»,FClose)

    Ext = GET_VALUE(OwnRow,«p_ext») + 0

    IF (Ext = 0) AND (FClose <> 0) AND (Hour = XHour) AND (Min = XMin) AND (Sec >= XSec)
      IF PriceControl = 0
        IF Operation = «S»
          FClose = FClose — Delta
        ELSE
          FClose = FClose + Delta
        END IF
        fNewOrder(Operation,Volume,FClose)
        Output = SET_VALUE(Output,«p_ext»,1)
      ELSE
        Year = GET_VALUE(Data,«YEAR») + 0
        Month = GET_VALUE(Data,«MONTH») + 0
        Day = GET_VALUE(Data,«DAY») + 0
        TextData = Year & fFormDat(Month) & fFormDat(Day)
        TextTime = fFormDat(Hour — 1) & fFormDat(Min) & «00»

        CandlePrice = GET_CANDLE_EX(Instrument,TextData,TextTime)
        Close = GET_VALUE(GET_COLLECTION_ITEM(GET_VALUE(CandlePrice,«LINES»),0),«CLOSE») + 0

        IF ((PriceControl = — 1) AND (Close < PCLevel)) OR ((PriceControl = 1) AND (Close > PCLevel))
          IF Operation = «S»
            FClose = FClose — Delta
          ELSE
            FClose = FClose + Delta
          END IF
          fNewOrder(Operation,Volume,FClose)
          Output = SET_VALUE(Output,«p_ext»,1)
        END IF
      END IF
    END IF

    Output = SET_VALUE(Output,«p_time»,fFormDat(XHour) & ":" & fFormDat(XMin) & ":" & fFormDat(XSec))
'    Output = SET_VALUE(Output,«p_time»,fFormDat(Hour) & ":" & fFormDat(Min) & ":" & fFormDat(Sec))
    MODIFY_ITEM(1,Output)

' Первый расчет (пропускаем из-за глюка — уходит в себя при старте без данных)
  ELSE
    Output = SET_VALUE(Output,«p_ext»,0)
    Output = SET_VALUE(Output,«p_oper»,Operation)
    Output = SET_VALUE(Output,«p_volume»,Volume)
    Output = SET_VALUE(Output,«p_time»,fFormDat(XHour) & ":" & fFormDat(XMin) & ":" & fFormDat(XSec))
'    Output = SET_VALUE(Output,«p_time»,fFormDat(Hour) & ":" & fFormDat(Min) & ":" & fFormDat(Sec))
    IF PriceControl <> 0
      Output = SET_VALUE(Output,«p_level»,PCLevel)
    END IF
    ADD_ITEM(1,Output)
  END IF


' ===========================================
' =====   ФУНКЦИЯ ФОРМАТИРОВАНИЯ ДАТЫ   =====
' ===========================================
FUNC fFormDat(d)
  IF LEN(d) < 2
    d = «0» & d
  END IF
  RESULT = d
END FUNC
' ===========================================


' ==============================================================
' ===========   ФУНКЦИЯ ДЛЯ ВЫСТАВЛЕНИЯ ЗАЯВКИ   ===============
' ==============================================================
FUNC fNewOrder(pOper,pQuant,pPrice)
  TransID = GET_NUMBER_OF(«ORDERS»)+1
  NEW_GLOBAL(«TransParams»,"")
  NEW_GLOBAL(«TransResult»,"")
  TransParams = ""
  TransParams = SET_VALUE(TransParams,«TRANS_ID»,TransID & "")
  TransParams = SET_VALUE(TransParams,«ACTION»,«NEW_ORDER»)
  TransParams = SET_VALUE(TransParams,«CLASSCODE»,ClassCodeList)
  TransParams = SET_VALUE(TransParams,«SECCODE»,FInstrument)
  TransParams = SET_VALUE(TransParams,«ACCOUNT»,Depo)
  TransParams = SET_VALUE(TransParams,«OPERATION»,pOper)
  TransParams = SET_VALUE(TransParams,«PRICE»,pPrice & "")
  TransParams = SET_VALUE(TransParams,«QUANTITY»,pQuant & "")
  TransParams = SET_VALUE(TransParams,«CLIENT_CODE»,ClientCode)
  TransParams = SET_VALUE(TransParams,«TYPE»,«L»)
  TransResult = SEND_TRANSACTION(30,TransParams)
  Result = TransID
END FUNC
' ==============================================================


END_PROGRAM

PARAMETER p_level;
PARAMETER_TITLE Уровень;
PARAMETER_DESCRIPTION Условный уровень выхода;
PARAMETER_TYPE NUMERIC(3,2);
END

PARAMETER p_time;
PARAMETER_TITLE Время;
PARAMETER_DESCRIPTION Время сигнала;
PARAMETER_TYPE STRING(8);
END

PARAMETER p_close;
PARAMETER_TITLE Закрытие;
PARAMETER_DESCRIPTION Цена закрытия свечи;
PARAMETER_TYPE NUMERIC(3,2);
END

PARAMETER p_oper;
PARAMETER_TITLE Операция;
PARAMETER_DESCRIPTION Операция;
PARAMETER_TYPE STRING(4);
END

PARAMETER p_volume;
PARAMETER_TITLE Объём;
PARAMETER_DESCRIPTION Объём;
PARAMETER_TYPE NUMERIC(4,0);
END

PARAMETER p_ext;
PARAMETER_TITLE Выход;
PARAMETER_DESCRIPTION Выход;
PARAMETER_TYPE NUMERIC(1,0);
END

END_PORTFOLIO_EX

  • обсудить на форуме:
  • QUIK
★32
8 комментариев
Будет работать под любой версией квика?
avatar
Не знаю, попробуйте. А вы квик не обновляете по религиозным соображениям?
avatar
Антон О., ага, бывает, по меркурианским.) Иногда раздражают глюки после обновления.
avatar
скажите, а у квика дельта есть??
avatar
Дарина Фролова, не понял вас
avatar
Антон О., не пытайся понять блондинку))
avatar

теги блога Антон О.

....все тэги



UPDONW
Новый дизайн