示例#1
0
def test_trigger_should_not_trigger_if_tickers_are_different():
    """
    When trigger is not for the same ticker as position, return False.
    """
    trigger = schemas.Trigger(
        0,
        0,
        ticker="TSLA",
        reference=schemas.TriggerReference.PORTFOLIO.value,
        threshold=0.05,
        direction=schemas.Direction.INCREASE.value,
    )
    position = schemas.PortfolioPosition(
        **{
            "name": "Tesla",
            "ticker": "BABA",
            "current_price": 1000,
            "candle_prices": None,
            "portfolio_price": 900,
        })
    assert trigger.is_triggered(position) is False
示例#2
0
def test_trigger_should_not_trigger_by_portfolio_price():
    """
    When price dropped but not low enough.
    """
    trigger = schemas.Trigger(
        0,
        0,
        ticker="TSLA",
        reference=schemas.TriggerReference.PORTFOLIO.value,
        threshold=15,
        direction=schemas.Direction.DECREASE.value,
    )
    position = schemas.PortfolioPosition(
        **{
            "name": "Tesla",
            "ticker": "TSLA",
            "current_price": 900,
            "candle_prices": None,
            "portfolio_price": 1000,
        })
    assert trigger.is_triggered(position) is False
示例#3
0
def test_trigger_should_trigger_by_portfolio_price():
    """
    When price spiked above desired one.
    """
    trigger = schemas.Trigger(
        0,
        0,
        ticker="TSLA",
        reference=schemas.TriggerReference.PORTFOLIO.value,
        threshold=5,
        direction=schemas.Direction.INCREASE.value,
    )
    position = schemas.PortfolioPosition(
        **{
            "name": "Tesla",
            "ticker": "TSLA",
            "current_price": 1000,
            "candle_prices": None,
            "portfolio_price": 900,
        })
    assert trigger.is_triggered(position)
示例#4
0
def test_trigger_should_trigger_for_general_ticker():
    """
    When ticker value is not set, trigger should proceed normally.
    """
    trigger = schemas.Trigger(
        0,
        0,
        ticker=None,
        reference=schemas.TriggerReference.PORTFOLIO.value,
        threshold=0.05,
        direction=schemas.Direction.INCREASE.value,
    )
    position = schemas.PortfolioPosition(
        **{
            "name": "Tesla",
            "ticker": "BABA",
            "current_price": 1000,
            "candle_prices": None,
            "portfolio_price": 900,
        })
    assert trigger.is_triggered(position)
示例#5
0
def test_trigger_should_not_trigger_by_candle_price():
    """
    When price spiked but not high enough.
    """
    trigger = schemas.Trigger(
        0,
        0,
        ticker="TSLA",
        reference=schemas.CandleRange.CANDLE_1M.value,
        threshold=15,
        direction=schemas.Direction.INCREASE.value,
    )
    candle_prices = {"CANDLE_1D": 1000, "CANDLE_1W": 980, "CANDLE_1M": 900}
    position = schemas.PortfolioPosition(
        **{
            "name": "Tesla",
            "ticker": "TSLA",
            "current_price": 1000,
            "candle_prices": candle_prices,
            "portfolio_price": None,
        })
    assert trigger.is_triggered(position) is False
示例#6
0
def test_trigger_should_trigger_by_candle_price():
    """
    When price dropped below desired one.
    """
    trigger = schemas.Trigger(
        0,
        0,
        ticker="TSLA",
        reference=schemas.CandleRange.CANDLE_1D.value,
        threshold=5,
        direction=schemas.Direction.DECREASE.value,
    )
    candle_prices = {"CANDLE_1D": 1000, "CANDLE_1W": 980, "CANDLE_1M": 900}
    position = schemas.PortfolioPosition(
        **{
            "name": "Tesla",
            "ticker": "TSLA",
            "current_price": 900,
            "candle_prices": candle_prices,
            "portfolio_price": None,
        })
    assert trigger.is_triggered(position)
示例#7
0
def get_portfolio_positions_from_response(
    response: tinvest.schemas.PortfolioResponse,
    market_values: List[schemas.MarketValue],
) -> List[schemas.PortfolioPosition]:
    portfolio_positions = []
    for position in response.payload.positions:
        # This probably corresponds to remaining USD balance on account
        if position.ticker == "USD000UTSTOM":
            continue
        market_value = next(m for m in market_values if m.ticker == position.ticker)
        portfolio_positions.append(
            schemas.PortfolioPosition(
                name=position.name,
                ticker=position.ticker,
                candle_prices={
                    "CANDLE_1D": market_value.candle_1d_price,
                    "CANDLE_1W": market_value.candle_1w_price,
                    "CANDLE_1M": market_value.candle_1m_price,
                },
                portfolio_price=float(position.average_position_price.value),
                current_price=market_value.current_price,
            )
        )
    return portfolio_positions