Skip to content

Inconsistencies in asset visualisation  #244

@hom-bahrani

Description

@hom-bahrani

Description

I am running the basic RSI example from your documentation and observed some strange behaviour

def price_event(price, symbol, state: blankly.StrategyState):
    """This function will give an updated price every 15 seconds from our definition below"""
    state.variables["history"].append(price)
    rsi = blankly.indicators.rsi(state.variables["history"])
    if rsi[-1] < 30 and not state.variables["owns_position"]:
        # Dollar cost average buy
        buy = int(state.interface.cash / price)
        state.interface.market_order(symbol, side="buy", size=buy)
        state.variables["owns_position"] = True
    elif rsi[-1] > 70 and state.variables["owns_position"]:
        # Dollar cost average sell
        curr_value = state.interface.account[state.base_asset].available
        state.interface.market_order(symbol, side="sell", size=int(curr_value))
        state.variables["owns_position"] = False

def init(symbol, state: blankly.StrategyState):
    # Download price data to give context to the algo
    state.variables["history"] = state.interface.history(
        symbol, to=150, return_as="deque", resolution=state.resolution
    )["close"]
    state.variables["owns_position"] = False

if __name__ == "__main__":
    exchange = blankly.Oanda()

    # Use our strategy helper on coinbase pro
    strategy = blankly.Strategy(exchange)

    # Run the price event function every time we check for a new price - by default that is 15 seconds
    # strategy.add_price_event(price_event, symbol="XAU-USD", resolution="15m", init=init)
    strategy.add_price_event(price_event, symbol="BCO-USD", resolution="15m", init=init)

    # Start the strategy. This will begin each of the price event ticks
    # strategy.start()
    # Or backtest using this
    results = strategy.backtest(to="1y")
    print(results)

I get a nice html plot at the end of backtesting, I noticed that the code above is using all the cash in my account [state.interface.cash](http://state.interface.cash) and that number is being used to determine buy size. But say I want a stake of e.g. $1000 rather than use all the cash in my account, when I change the code to calculate the buy size using the stake it has a bizarre effect on the BCO (crude oil) plot - the y axis is completely different? (I’ve attached the plots)

stake = 1000  # 1000 USD
buy = int(stake / price)
state.interface.market_order(symbol, side="buy", size=buy)

Any idea why this might be case? everything else is the same in both cases so I would expect the BCO plot to remain the same. The same thing happens if I manually set the size e.g. to 1 state.interface.market_order(symbol, side="buy", size=1) In this case I see the BCO plot bars are all set to 1?

Screenshot 2023-09-07 at 16 16 49 Screenshot 2023-09-07 at 16 16 21 Screenshot 2023-09-07 at 16 16 14

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions