def RSI(ctx): const = ops.constant linear_signal = signal.RandomWalk(initialValue=20, deltaDistr=const(-.1), label="20-0.1t") one = const(1) rsi = observable.OnEveryDt(one.value, observable.Fold( observable.MidPrice( orderbook.OfTrader()), mathutils.rsi())) threshold = 30 demo = ctx.addGraph('demo') myVolume = lambda: [(observable.VolumeTraded(), demo)] myRsi = lambda: [(rsi, demo)] alpha = 1./14 myRsiBis = lambda: [(observable.OnEveryDt(1, observable.RSI(orderbook.OfTrader(), 1, alpha)), demo)] return [ ctx.makeTrader_A( strategy.LiquidityProvider( event.Every(ops.constant(1.)), order.factory.sideprice.Limit(volume=const(4))), "liquidity"), ctx.makeTrader_A(strategy.Signal(event.Every(ops.constant(1.)), order.factory.side.Market(), linear_signal), "signal", [(linear_signal, ctx.amount_graph)]), ctx.makeTrader_A(strategy.RSIbis(event.Every(ops.constant(1.)), order.factory.side.Market(one), alpha = alpha, timeframe = 1, threshold=threshold), "rsi_bis", myVolume() + myRsiBis()), ctx.makeTrader_A(strategy.v0.RSIEx(alpha = alpha, threshold=threshold, volumeDistr=one, creationIntervalDistr=one), "rsi_ex", (myVolume() + myRsi() + Constant(threshold, demo) + Constant(100-threshold, demo))) ]
def RSIEx ( alpha = 1./14, threshold = 30, orderFactory = order.MarketFactory, volumeDistr = mathutils.rnd.expovariate(1.), creationIntervalDistr = mathutils.rnd.expovariate(1.)): orderBook = orderbook.OfTrader() rsi = observable.Fold(observable.Price(orderBook), mathutils.rsi(alpha)) r = Generic(orderFactory= orderFactory, volumeFunc = volumeDistr, eventGen = scheduler.Timer(creationIntervalDistr), sideFunc = RelativeStrengthIndexSide(orderBook, rsi, threshold)) return r
def __init__(self, orderBook=None, rsi=None, threshold=30): self.orderBook = orderBook if orderBook is not None else orderbook.OfTrader() self.rsi = rsi if rsi is not None else observable.Fold(observable.Price(self.orderBook), mathutils.rsi(1./14)) self.threshold = threshold
def getDefinitions(self): return { 'rsi' : observable.Fold(observable.MidPrice(orderbook.OfTrader()), mathutils.rsi(self.alpha)) }