Quantstrat: Можно ли выполнить несколько ордеров по одному и тому же инструменту в течение одного дня?

Я немного озадачен тем, как именно Quantstrat размещает заказы, если они генерируются в течение одного дня несколькими сигналами. Я пытаюсь реализовать простую стратегию парной торговли (где ноль является порогом входа и выхода), поэтому, когда z-оценка меняет знак, для каждого символа должны генерироваться два сигнала (ПРОДАЖА -> ПРОДАВАТЬ КОРОТКИЕ или ЗАКРЫТЬ). КОРОТКИЕ -> КУПИТЬ ДОЛГО). Проблема в том, что QS всегда игнорирует порядок выхода (делает его «замененным» последующим порядком входа). Что мне делать, чтобы сигналы не заменялись или не отменялись? Можно ли вообще на одном баре исполнять несколько ордеров?

Вот моя установка. Сигналы:

        add.signal( strategy = strategy_st, 
                    name = 'sigFormula', 
                    arguments = list(   columns = c('score', 'entry_threshold'),
                                        formula = 'score > entry_threshold',
                                        cross = TRUE
                                    ), 
                    label = 'sigEnterUpper')        

        add.signal( strategy = strategy_st, 
                    name = 'sigFormula', 
                    arguments = list(   columns = c('score', 'entry_threshold'),
                                        formula = 'score <= -entry_threshold', 
                                        cross = TRUE
                                    ), 
                    label = 'sigEnterLower')

    #exit
        add.signal( strategy = strategy_st, 
                    name = 'sigFormula', 
                    arguments = list(   columns = c('score', 'exit_threshold'),
                                        formula = 'score <= exit_threshold',
                                        cross = TRUE
                                    ), 
                    label = 'sigExitUpper')     

        add.signal( strategy = strategy_st, 
                    name = 'sigFormula', 
                    arguments = list(   columns = c('score', 'exit_threshold'),
                                        formula = 'score >= -exit_threshold', 
                                        cross = TRUE
                                    ), 
                    label = 'sigExitLower') 

Правила:

#entries    
    #longs

        add.rule(   strategy = strategy_st,     
                    name = 'ruleSignal',
                    label = 'increase_long_up',
                    arguments = list(   sigcol = 'sigEnterUpper',
                                        sigval = TRUE, 
                                        orderqty = default_order_quantity, 
                                        ordertype = 'market',
                                        orderside = 'long', 
                                        osFUN = orderSizeIncrease), 
                    type = 'enter',
                    path.dep = TRUE
                    )

        add.rule(   strategy = strategy_st,     
                    name = 'ruleSignal',
                    label = 'increase_long_low',
                    arguments = list(   sigcol = 'sigEnterLower', #sigcol = 'sigFlipper', #sigcol = 'sigStartTrading', 
                                        sigval = TRUE, 
                                        orderqty = default_order_quantity, 
                                        ordertype = 'market',
                                        orderside = 'long', 
                                        osFUN = orderSizeIncrease), 
                    type = 'enter',
                    path.dep = TRUE)

    #shorts
        add.rule(   strategy = strategy_st,     
                    name = 'ruleSignal',
                    label = 'increase_short_up',
                    arguments = list(   sigcol = 'sigEnterUpper', #sigcol = 'sigFlipper', #sigcol = 'sigStartTrading', 
                                        sigval = TRUE, 
                                        orderqty = default_order_quantity, 
                                        ordertype = 'market',
                                        orderside = 'short', 
                                        osFUN = orderSizeIncrease), 
                    type = 'enter',
                    path.dep = TRUE)

        add.rule(   strategy = strategy_st,     
                    name = 'ruleSignal',
                    label = 'increase_short_low',
                    arguments = list(   sigcol = 'sigEnterLower', #sigcol = 'sigFlipper', #sigcol = 'sigStartTrading', 
                                        sigval = TRUE, 
                                        orderqty = default_order_quantity, 
                                        ordertype = 'market',
                                        orderside = 'short', 
                                        osFUN = orderSizeIncrease), 
                    type = 'enter',
                    path.dep = TRUE)                  

#exits
    add.rule(   strategy = strategy_st,
                name = 'ruleSignal', 
                label = 'close_position_up',
                arguments = list(   sigcol = 'sigExitUpper', 
                                    sigval = TRUE, 
                                    orderqty = 'all', 
                                    ordertype = 'market', 
                                    orderside = NULL), 
                type = 'exit')

    add.rule(   strategy = strategy_st,
                name = 'ruleSignal', 
                label = 'close_position_low',
                arguments = list(   sigcol = 'sigExitLower', 
                                    sigval = TRUE, 
                                    orderqty = 'all', 
                                    ordertype = 'market', 
                                    orderside = NULL), 
                type = 'exit')

Сгенерированные сигналы:

    EWA.Close   score   entry_threshold exit_threshold  sigEnterUpper   sigEnterLower   sigExitUpper    sigExitLower
2006-04-04  22.95   0.00000000  0   0   NA  NA  NA  NA
2006-04-05  22.78   0.00000000  0   0   NA  NA  NA  NA
2006-04-06  22.94   0.00000000  0   0   NA  NA  NA  NA
2006-04-07  23.05   0.00000000  0   0   NA  NA  NA  NA
2006-04-08  23.32   0.00000000  0   0   NA  NA  NA  NA
2006-04-09  23.12   0.00000000  0   0   NA  NA  NA  NA
2006-04-10  23.01   0.00000000  0   0   NA  NA  NA  NA
2006-04-11  23.33   0.00000000  0   0   NA  NA  NA  NA
2006-04-12  23.23   0.00000000  0   0   NA  NA  NA  NA
2006-04-13  23.54   0.00000000  0   0   NA  NA  NA  NA
2006-04-14  23.56   0.00000000  0   0   NA  NA  NA  NA
2006-04-15  23.17   0.00000000  0   0   NA  NA  NA  NA
2006-04-16  22.76   0.00000000  0   0   NA  NA  NA  NA
2006-04-17  22.20   0.00000000  0   0   NA  NA  NA  NA
2006-04-18  22.29   0.00000000  0   0   NA  NA  NA  NA
2006-04-19  21.79   0.00000000  0   0   NA  NA  NA  NA
2006-04-20  21.47   0.00000000  0   0   NA  NA  NA  NA
2006-04-21  21.55   0.00000000  0   0   NA  NA  NA  NA
2006-04-22  21.35   0.00000000  0   0   NA  NA  NA  NA
2006-04-23  21.37   0.00000000  0   0   NA  NA  NA  NA
2006-04-24  21.15   0.00000000  0   0   NA  NA  NA  NA
2006-04-25  21.99   0.00000000  0   0   NA  NA  NA  NA
2006-04-26  22.20   1.89349767  0   0   NA   1  NA  1
2006-04-27  22.10   2.05270575  0   0   NA  NA  NA  NA
2006-04-28  22.38   2.68490142  0   0   NA  NA  NA  NA
2006-04-29  22.38   2.40434146  0   0   NA  NA  NA  NA
2006-04-30  22.60   1.87012946  0   0   NA  NA  NA  NA
2006-05-01  22.09   1.42771737  0   0   NA  NA  NA  NA
2006-05-02  21.86   1.49838977  0   0   NA  NA  NA  NA
2006-05-03  21.44   1.18071344  0   0   NA  NA  NA  NA
2006-05-04  21.04   0.59868857  0   0   NA  NA  NA  NA
2006-05-05  21.32   0.85730960  0   0   NA  NA  NA  NA
2006-05-06  21.02   0.77078417  0   0   NA  NA  NA  NA
2006-05-07  20.23   0.74856764  0   0   NA  NA  NA  NA
2006-05-08  20.41   -0.01843937 0   0    1  NA  1   NA  #I expect to cover short and buy long here
2006-05-09  21.00   -0.26363152 0   0   NA  NA  NA  NA
2006-05-10  20.78   -0.44662726 0   0   NA  NA  NA  NA
2006-05-11  20.32   -0.71957534 0   0   NA  NA  NA  NA
2006-05-12  20.29   -0.76088199 0   0   NA  NA  NA  NA

Сгенерированные заказы:

 Order.Qty Order.Price Order.Type Order.Side Order.Threshold Order.Status Order.StatusTime      Prefer Order.Set Txn.Fees Rule                 Time.In.Force
2006-04-26 "-1.046"  "22.2"      "market"   "short"    NA              "closed"     "2006-04-27 00:00:00" ""     NA        "0"      "increase_short_low" ""           
2006-05-08 "all"     "20.41"     "market"   "short"    NA              "replaced"   "2006-05-08"          ""     NA        "0"      "close_position_up"  ""           
2006-05-08 "1.046"   "20.41"     "market"   "long"     NA              "closed"     "2006-05-09 00:00:00" ""     NA        "0"      "increase_long_up"   ""

person Vyacheslav Zotov    schedule 16.01.2018    source источник


Ответы (1)


Да, вы должны установить параметр replace в ruleSignal на FALSE. В противном случае все, кроме последнего обработанного ордера на символ в данный момент времени, будут заменены последним ордером.

person James Hirschorn    schedule 24.07.2018
comment
Спасибо, Джеймс! К сожалению, я давно полностью перешел на торговые библиотеки Python, поэтому я не могу проверить, хорошо ли это работает с моим кодом. - person Vyacheslav Zotov; 25.07.2018