2015-09-02 5 views
0

Когда у меня есть стратегия, которая идет как длинная, так и короткая, и я установил функцию addPosLimit(), чтобы иметь maxpos=1 and minpos=-1. Он по-прежнему занимает больше одного длинной и одной короткой позиции. Но если я сделаю стратегию только длинной или короткой, она работает так, как ожидалось.Функция quantstrat addPosLimit() не ограничивает мои позиции при переходе как длинной, так и короткой по той же стратегии.

Я создал базовую стратегию для этого примера. Он имеет 3 скользящих средних, один долговременный SMA как фильтр с длинным/коротким смещением, а два краткосрочных SMA - как крест, чтобы идти долго, когда есть длинный уклон, и перекрестный до короткого, когда есть короткий смещение. У меня есть цель прибыли и стоп-лосс, помещенный на фиксированное расстояние после открытия торгов.

Стратегия.

require(quantstrat) 
    require(IKTrading) 

    symbols <- "mySymbol" 

    options("getSymbols.warning4.0"=FALSE) 
    rm(list=ls(.blotter), envir=.blotter) 
    currency('USD') 
    Sys.setenv(TZ="UTC") 

    stock(symbols, currency="USD", multiplier=1) 
    initDate="1980-01-01" 

    tradeSize <- 1000 
    initEq <- tradeSize*length(symbols) 

    account.st <- 0 
    strategy.st <- portfolio.st <- account.st <- "smatest" 
    rm.strat(portfolio.st) 
    rm.strat(strategy.st) 
    initPortf(portfolio.st, symbols=symbols, initDate=initDate, currency='USD') 
    initAcct(account.st, portfolios=portfolio.st, initDate=initDate, currency='USD',initEq=initEq) 
    initOrders(portfolio.st, initDate=initDate) 
    strategy(strategy.st, store=TRUE) 

    addPosLimit(portfolio.st, symbols, timestamp=initDate, maxpos=1, minpos=-1) 


    nSMAquick = 15 
    nSMAslow = 30 
    nSMAbias= 300 

    add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAquick), label="quickMA") 
    add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAslow), label="slowMA") 
    add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAbias), label="bias") 


    add.signal(strategy.st, name = "sigCrossover", arguments = list(columns=c("quickMA", "slowMA"), 
                    relationship="gt"), label="smaup") 

    add.signal(strategy.st, name = "sigCrossover", arguments = list(columns=c("quickMA", "slowMA"), 
                    relationship="lt"), label="smadown") 

    add.signal(strategy.st, name = "sigComparison", arguments = list(columns=c("Close", "bias"), 
                    relationship="gt"), label="biasup") 

    # 
    add.signal(strategy.st, name = "sigComparison", arguments = list(columns=c("Close", "bias"), 
                    relationship="lt"), label="biasdown") 


    add.signal(strategy.st, name="sigAND", arguments=list(columns=c("smaup", "biasup"), cross=F), 
       label="longentry") 


    add.signal(strategy.st, name="sigAND", arguments=list(columns=c("smadown", "biasdown"), cross=F), 
       label="shortEntry") 


    #enter rule 
    add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol="longentry", 
                   sigval=TRUE, 
                   ordertype="market", 
                   orderside="long", 
                   replace=FALSE, 
                   prefer="Open", 
                   orderqty=1, 
                   orderset="orderslong", 
                   osFUN=osMaxPos), 
      type="enter",path.dep=TRUE,label="long") 
    # 


    #take profit 
    add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="longentry", 
                  sigval=TRUE, 
                  ordertype="limit", 
                  orderside="long", 
                  replace=FALSE, 
                  orderqty=-1, 
                  threshold=quote(.75), 
                  orderset="orderslong"), 
      type="chain", 
      parent="long", 
      label="takeProfitLong", 
      path.dep=TRUE) 



    #stop loss 
    add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="longentry", 
                  sigval=TRUE, 
                  ordertype="stoplimit", 
                  orderside="long", 
                  replace=FALSE, 
                  orderqty=-1, 
                  threshold=quote(.25), 
                  orderset="orderslong"), 
      type="chain", 
      parent="long", 
      label="stopLossLong", 
      path.dep=TRUE) 


    # 
    # ########### 
    # #short rule 
    add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol="shortEntry", 
                   sigval=TRUE, 
                   ordertype="market", 
                   orderside="short", 
                   replace=FALSE, 
                   prefer="Open", 
                   orderqty=-1, 
                   orderset="ordersshort", 
                   osFUN=osMaxPos), 
      type="enter",path.dep=TRUE,label="short") 
    # 


    #take profit 
    add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="shortEntry", 
                  sigval=TRUE, 
                  ordertype="limit", 
                  orderside="short", 
                  replace=FALSE, 
                  orderqty=1, 
                  threshold=quote(.75), 
                  orderset="ordersshort"), 
      type="chain", 
      parent="short", 
      label="takeProfitShort", 
      path.dep=TRUE) 



    #stop loss 
    add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="shortEntry", 
                  sigval=TRUE, 
                  ordertype="stoplimit", 
                  orderside="short", 
                  replace=FALSE, 
                  orderqty=1, 
                  threshold=quote(.25), 
                  orderset="ordersshort"), 
      type="chain", 
      parent="short", 
      label="stopLossShort", 
      path.dep=TRUE) 






    #apply strategy 
    t1 <- Sys.time() 
    out2 <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st) 

Это образец результата торгов.

[1] "2015-08-04 05:23:00 mySymbol 1 @ 45.51" 
[1] "2015-08-04 14:43:00 mySymbol -1 @ 45.87" 
[1] "2015-08-04 14:44:00 mySymbol 1 @ 45.96" 
[1] "2015-08-04 15:00:00 mySymbol 1 @ 46.12" 
[1] "2015-08-04 15:22:00 mySymbol -1 @ 46.15" 
[1] "2015-08-04 16:41:00 mySymbol -1 @ 45.96" 
[1] "2015-08-04 17:00:00 mySymbol 1 @ 46.03" 
[1] "2015-08-04 17:12:00 mySymbol -1 @ 45.91" 
[1] "2015-08-04 17:36:00 mySymbol -1 @ 45.86" 
[1] "2015-08-04 17:42:00 mySymbol -1 @ 45.78" 
[1] "2015-08-04 19:09:00 mySymbol 1 @ 45.79" 
[1] "2015-08-04 20:33:00 mySymbol 1 @ 45.95" 
[1] "2015-08-04 20:34:00 mySymbol 1 @ 46.04" 


> transactions <- getTxns(Portfolio=portfolio.st, symbols) 
> transactions 
        Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost Net.Txn.Realized.PL 
1980-01-01 00:00:00  0  0.00  0  0.00   0.00    0.00 
2015-08-04 05:23:00  1  45.51  0  45.51  45.51    0.00 
2015-08-04 14:43:00  -1  45.87  0 -45.87  45.87    0.36 
2015-08-04 14:44:00  1  45.96  0  45.96  45.96    0.00 
2015-08-04 15:00:00  1  46.12  0  46.12  46.12    0.00 
2015-08-04 15:22:00  -1  46.15  0 -46.15  46.15    0.11 
2015-08-04 16:41:00  -1  45.96  0 -45.96  45.96    -0.08 
2015-08-04 17:00:00  1  46.03  0  46.03  46.03    0.00 
2015-08-04 17:12:00  -1  45.91  0 -45.91  45.91    -0.12 
2015-08-04 17:36:00  -1  45.86  0 -45.86  45.86    0.00 
2015-08-04 17:42:00  -1  45.78  0 -45.78  45.78    0.00 
2015-08-04 19:09:00  1  45.79  0  45.79  45.79    0.03 
2015-08-04 20:33:00  1  45.95  0  45.95  45.95    -0.13 
2015-08-04 20:34:00  1  46.04  0  46.04  46.04    0.00 

enter image description here

Я хочу, чтобы стратегия идти долго, то либо достичь цели по прибыли или получить стопу, или для того, чтобы быть закрытым, когда короткий сигнал подается, и наоборот.

Если я прокомментирую код короткого кода, он работает как ожидалось. Ниже приведен пример транзакций, когда короткая сторона закомментирована.

[1] "2015-08-04 05:23:00 mySymbol 1 @ 45.51" 
[1] "2015-08-05 06:24:00 mySymbol -1 @ 46.26" 
[1] "2015-08-05 07:35:00 mySymbol 1 @ 46.24" 
[1] "2015-08-05 08:31:00 mySymbol -1 @ 45.99" 
[1] "2015-08-05 12:01:00 mySymbol 1 @ 46.03" 
[1] "2015-08-05 14:51:00 mySymbol -1 @ 45.78" 
[1] "2015-08-05 21:00:00 mySymbol 1 @ 45.14" 
[1] "2015-08-06 06:16:00 mySymbol -1 @ 44.89" 
[1] "2015-08-06 18:29:00 mySymbol 1 @ 44.56" 

Я вижу, что он не торгуется снова, пока не достигнет цели/остановки.

+0

Без минимального, воспроизводимого примера, это очень сложно вам помочь. Я получил ошибку из вашего использования 'mktdata $ Close', который исчез, если вместо этого я использовал' Cl (mktdata) '. Я также не мог воспроизвести это поведение, когда использовал данные SPY от Yahoo Finance. –

ответ

1

Кажется, что изменение с orderqty=-1 на orderqty="all" решило мою проблему.

Я думал, поскольку я был только длинным 1 в первую очередь, тогда -1 должно быть достаточно.

Вот что add.rule выглядит сейчас

add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="longEntry", 
                 sigval=TRUE, 
                 ordertype="stoplimit", 
                 orderside="long", 
                 replace=FALSE, 
                 orderqty="all", 
                 #order.price=55, 
                 threshold=quote(.25), 
                 orderset="orderslong"), 
     type="chain", 
     parent="long", 
     label="stopLossLong", 
     path.dep=TRUE) 

теперь только когда-либо имеет 1 место в каждом направлении.

+0

теперь я получаю эти предупреждения .. '1: В ruleOrderProc (портфолио = портфолио, символ = символ, ...: игнорирование порядка с количеством нулей –