R - квантраты заказов отменяют друг друга

Как вводить ордера, которые отменяют друг друга в quantstrat? Например, входя в сделку, я сразу открываю два ордера: "стоп-лосс" и "тейк-профит". Как только один будет заполнен, другой будет отменен.

#Enter signal 

strategy <- add.rule(strategy, name="ruleSignal", 
                     arguments=list(sigcol="EnterBuy", sigval=TRUE, orderqty=100,
                                    ordertype="market", orderside="long", 
                                    pricemethod="market", osFUN=osMaxPos),
                     type="enter", path.dep=TRUE)

#Stop loss

strategy <- add.rule(strategy, name="ruleSignal", 
                     arguments=list(sigcol="EnterBuy", sigval=TRUE, 
                                    orderqty="all", ordertype="stoplimit", 
                                    orderside="short", threshold=-5, 
                                    tmult=FALSE), 
                     type="exit", path.dep=TRUE)

#Take profit

strategy <- add.rule(strategy, name="ruleSignal", 
                     arguments=list(sigcol="EnterBuy", sigval=TRUE,
                                    orderqty="all", ordertype="stoplimit", 
                                    orderside="short", threshold=5, 
                                    tmult=FALSE),
                     type="exit", path.dep=TRUE) 

В настоящее время они работают самостоятельно.

1 ответ

Решение

SVN r 1010 добавляет код в quantstrat, чтобы упростить использование наборов заказов OCO (один отменяет другой). В демонстрационном примере 'macd' есть пример, в котором используется вновь выставленный параметр orderset, чтобы обеспечить функциональность OCO для ордеров на выход.

Вам нужно будет использовать текущий svn (r1010 или новее), чтобы использовать эту функцию. Также отмечу, что функция определения размера заказа сейчас немного нарушена, мы работаем над этим.

Ваш пример использования наборов заказов будет выглядеть примерно так:

#Enter signal 

strategy <- add.rule(strategy, name="ruleSignal", 
                     arguments=list(sigcol="EnterBuy", sigval=TRUE, orderqty=100,
                                    ordertype="market", orderside="long", 
                                    pricemethod="market", osFUN=osMaxPos),
                     type="enter", path.dep=TRUE)

#Stop loss

strategy <- add.rule(strategy, name="ruleSignal", 
                     arguments=list(sigcol="EnterBuy", sigval=TRUE, 
                                    orderqty="all", ordertype="stoplimit", 
                                    orderside="long", threshold=-5, 
                                    tmult=FALSE, orderset='altexits'), 
                     type="exit", path.dep=TRUE)

#Take profit

strategy <- add.rule(strategy, name="ruleSignal", 
                     arguments=list(sigcol="EnterBuy", sigval=TRUE,
                                    orderqty="all", ordertype="stoplimit", 
                                    orderside="long", threshold=5, 
                                    tmult=FALSE, orderset='altexits'),
                     type="exit", path.dep=TRUE) 

Обратите внимание на добавление параметра orderset = 'altexits' в список аргументов для ruleSignal.

Другие вопросы по тегам