Example #1
0
def test_TurtleStrategy_4():
    symbol = '123456'
    holds = {
        symbol: [
            TurtleStrategy.Hold(
                symbol,
                datetime.date(1999, 1, 1),
                10,  # 买入价
                100,  # 持仓数量
                9,  # 止损价
                11,  # 止盈价
                10.5  # 下一个仓位价格
            )
        ]
    }
    ts = TurtleStrategy('', holds=holds)

    assert 1 == len(ts.holds[symbol])
    # 虽然有持仓,但是没有任何的卖出点标记,也没有到止盈/止损/加仓点位
    assert not ts.on_check_sell(datetime.date(2000, 1, 1), symbol, 10.2, 1000,
                                0, 10)
    # 没有到达止盈点位
    assert 0 == ts.on_calc_sell_amount(datetime.date(2000, 1, 1), symbol,
                                       10.99, 1000, 0, 10)
    # 到达止盈点位
    assert 100 == ts.on_calc_sell_amount(datetime.date(2000, 1, 1), symbol, 11,
                                         1000, 0, 10)
    assert 0 == len(ts.holds[symbol])
Example #2
0
def test_TurtleStrategy_7():
    """买卖在同一天时,不更新止盈/下一个买点价格"""
    symbol = '123456'
    holds = {
        symbol: [
            TurtleStrategy.Hold(
                symbol,
                datetime.date(1999, 1, 1),
                10,  # 买入价
                100,  # 持仓数量
                9,  # 止损价
                11,  # 止盈价
                10.5  # 下一个仓位价格
            ),
            TurtleStrategy.Hold(
                symbol,
                datetime.date(1999, 2, 1),
                20,  # 买入价
                200,  # 持仓数量
                18,  # 止损价
                25,  # 止盈价
                30  # 下一个仓位价格
            )
        ]
    }
    ts = TurtleStrategy(colname='atr5',
                        update_price_onsameday=False,
                        holds=holds,
                        buy_dict={symbol: [datetime.date(2000, 1, 1)]})

    assert ts.holds[symbol][-1].stopprofit_price == 25
    assert ts.holds[symbol][-1].next_price == 30

    row = pd.Series({'atr5': 0.05})
    ts.on_buy_sell_on_same_day(datetime.date(2000, 1, 1),
                               symbol,
                               50,
                               row=row,
                               verbose=2)

    new_stoploss, new_stopprofit, new_next = ts.calc_price(50, row=row)

    assert ts.holds[symbol][-1].stopprofit_price == 25
    assert ts.holds[symbol][-1].next_price == 30

    assert not ts.holds[symbol][-1].stopprofit_price == new_stopprofit
    assert not ts.holds[symbol][-1].next_price == new_next
Example #3
0
def test_TurtleStrategy_1():
    symbol = '123456'
    holds = {
        symbol: [
            TurtleStrategy.Hold(
                symbol,
                datetime.date(1999, 1, 1),
                10,  #买入价
                100,  #持仓数量
                9,  #止损价
                11,  #止盈价
                10.5  #下一个仓位价格
            )
        ]
    }
    ts = TurtleStrategy('', holds=holds)
    # 当前时间不包含在卖出点字典中-开始
    assert 1 == len(ts.holds[symbol])
    assert 0 == ts.on_calc_sell_amount(datetime.date(2000, 1, 1), symbol, 10.2,
                                       1000, 0, 10)
    assert not ts.on_check_sell(datetime.date(2000, 1, 1), symbol, 10.2, 1000,
                                0, 10)
    assert 1 == len(ts.holds[symbol])
Example #4
0
def test_TurtleStrategy_5():
    symbol = '123456'
    holds = {
        symbol: [
            TurtleStrategy.Hold(
                symbol,
                datetime.date(1999, 1, 1),
                10,  # 买入价
                100,  # 持仓数量
                9,  # 止损价
                11,  # 止盈价
                10.5  # 下一个仓位价格
            )
        ]
    }

    ts = TurtleStrategy('',
                        holds=holds,
                        buy_dict={symbol: [datetime.date(2000, 1, 1)]},
                        sell_dict={symbol: [datetime.date(2000, 1, 2)]})

    assert 100 == ts.on_calc_buy_amount(datetime.date(2000, 1, 1), symbol, 20,
                                        10000)
    assert 2 == len(ts.holds[symbol])
    assert 100 == ts.holds[symbol][0].amount
    assert 10 == ts.holds[symbol][0].price
    assert 100 == ts.holds[symbol][-1].amount
    assert 20 == ts.holds[symbol][-1].price

    assert ts.on_check_sell(datetime.date(2000, 1, 2), symbol, 15, 9999, 300,
                            -1)
    assert ts.on_check_sell(datetime.date(2000, 1, 2), symbol, 15, 9999, -1,
                            -1)

    assert 200 == ts.on_calc_sell_amount(datetime.date(2000, 1, 2), symbol, 15,
                                         9999, -1, -1)
    assert 0 == len(ts.holds[symbol])
Example #5
0
def test_TurtleStrategy_MaxDays():
    symbol = '123456'
    holds = {
        symbol: [
            TurtleStrategy.Hold(
                symbol,
                datetime.date(1999, 1, 1),
                10,  # 买入价
                100,  # 持仓数量
                9,  # 止损价
                11,  # 止盈价
                10.5  # 下一个仓位价格
            ),
            TurtleStrategy.Hold(
                symbol,
                datetime.date(1999, 1, 2),
                20,  # 买入价
                100,  # 持仓数量
                9,  # 止损价
                11,  # 止盈价
                10.5  # 下一个仓位价格
            ),
        ]
    }
    ts = TurtleStrategy(
        colname='',
        holds=holds,
    )
    assert ts._get_overdue(symbol, datetime.date(2222, 1, 1)) is None

    ts = TurtleStrategy(
        colname='',
        holds=holds,
        max_days=10,
    )
    assert not ts._get_overdue(symbol, datetime.date(1999, 1, 9))
    assert not ts._get_overdue(symbol, datetime.date(1999, 1, 10))
    assert len(ts._get_overdue(symbol, datetime.date(1999, 1, 11))) > 0

    assert ts.on_calc_sell_amount(datetime.date(1999, 1, 9),
                                  symbol,
                                  10,
                                  0,
                                  0,
                                  0,
                                  verbose=2) == 0
    assert sum([h.amount for h in ts.holds[symbol]]) == 200
    assert ts.on_calc_sell_amount(datetime.date(1999, 1, 10),
                                  symbol,
                                  10,
                                  0,
                                  0,
                                  0,
                                  verbose=2) == 0
    assert sum([h.amount for h in ts.holds[symbol]]) == 200
    assert ts.on_calc_sell_amount(datetime.date(1999, 1, 11),
                                  symbol,
                                  10,
                                  0,
                                  0,
                                  0,
                                  verbose=2) == 100
    assert sum([h.amount for h in ts.holds[symbol]]) == 100
    assert ts.holds[symbol][0].price == 20
Example #6
0
def test_TurtleStrategy_4():
    symbol = '123456'
    holds = {
        symbol: [
            TurtleStrategy.Hold(
                symbol,
                datetime.date(1999, 1, 1),
                10,  # 买入价
                100,  # 持仓数量
                9,  # 止损价
                11,  # 止盈价
                10.5  # 下一个仓位价格
            )
        ]
    }
    ts = TurtleStrategy('',
                        holds=holds,
                        buy_dict={symbol: [datetime.date(2000, 1, 1)]})

    assert 1 == len(ts.holds[symbol])
    # 没有到达加仓点位
    assert not ts.on_check_buy(
        datetime.date(2000, 1, 1), symbol, 10.49, 1000, verbose=2)
    # 到达加仓点位
    assert ts.on_check_buy(datetime.date(2000, 1, 1),
                           symbol,
                           10.50,
                           1000,
                           verbose=2)
    # 没有加仓点位
    assert 0 == ts.on_calc_buy_amount(datetime.date(2000, 1, 1),
                                      symbol,
                                      10.49,
                                      1000,
                                      verbose=2)
    # 到达购买点,但是资金不足
    assert 0 == ts.on_calc_buy_amount(datetime.date(2000, 1, 1),
                                      symbol,
                                      10.50,
                                      1000,
                                      verbose=2)
    # 到达购买点,资金充足
    assert 100 == ts.on_calc_buy_amount(datetime.date(2000, 1, 1),
                                        symbol,
                                        10.50,
                                        1200,
                                        verbose=2)
    assert 2 == len(ts.holds[symbol])
    assert ts.holds[symbol][-1].amount == 100
    assert ts.holds[symbol][-1].stoploss_price == -1
    assert ts.holds[symbol][-1].stopprofit_price == -1
    assert ts.holds[symbol][-1].next_price == -1
    # 到达加仓点位
    assert ts.on_check_buy(datetime.date(2000, 1, 1), symbol, 10.50, 1000)
    assert 100 == ts.on_calc_buy_amount(datetime.date(2000, 1, 1),
                                        symbol,
                                        10.50,
                                        1200,
                                        verbose=2)
    # 到达加仓点位
    assert ts.on_check_buy(datetime.date(2000, 1, 1), symbol, 10.50, 1000)
    assert 100 == ts.on_calc_buy_amount(datetime.date(2000, 1, 1),
                                        symbol,
                                        10.50,
                                        1200,
                                        verbose=2)
    # 到达加仓点位。但是到达持仓限制
    assert not ts.on_check_buy(
        datetime.date(2000, 1, 1), symbol, 10.50, 1000, verbose=2)