def TradeIfProfitable(ctx): ctx.volumeStep = 30 slow_alpha = 0.015 fast_alpha = 0.15 linear_signal = math.RandomWalk(initialValue=200, deltaDistr=constant(-1), name="200-t") demo = ctx.addGraph('demo') myVolume = lambda: [(trader.Position(), demo)] myAverage = lambda alpha: [(orderbook.OfTrader().MidPrice.EW_Avg(alpha). OnEveryDt(1), demo)] def cross(alpha1, alpha2): return strategy.CrossingAverages( event.Every(constant(1.)), order.side.Market(volume=constant(1.)), alpha1, alpha2) avg_plus_virt = strategy.TradeIfProfitable( cross(slow_alpha, fast_alpha), strategy.account.virtualMarket()) avg_minus_virt = strategy.TradeIfProfitable( cross(fast_alpha, slow_alpha), strategy.account.virtualMarket()) avg_plus_real = strategy.TradeIfProfitable(cross(slow_alpha, fast_alpha), strategy.account.real()) avg_minus_real = strategy.TradeIfProfitable(cross(fast_alpha, slow_alpha), strategy.account.real()) return [ ctx.makeTrader_A( strategy.LiquidityProvider(orderFactory=order.side_price.Limit( volume=constant(45))), "liquidity"), ctx.makeTrader_A( strategy.Signal(event.Every(constant(1.)), order.side.Market(volume=constant(20)), linear_signal), "signal", [(linear_signal, ctx.amount_graph)]), ctx.makeTrader_A( cross(slow_alpha, fast_alpha), 'avg+', myAverage(slow_alpha) + myAverage(fast_alpha) + myVolume()), ctx.makeTrader_A(cross(fast_alpha, slow_alpha), 'avg-', myVolume()), ctx.makeTrader_A(avg_plus_virt, 'avg+ virt', myVolume()), ctx.makeTrader_A(avg_minus_virt, 'avg- virt', myVolume()), ctx.makeTrader_A(avg_plus_real, 'avg+ real', myVolume()), ctx.makeTrader_A(avg_minus_real, 'avg- real', myVolume()), ]
def s_fv(fv): return strategy.TradeIfProfitable( strategy.side.FundamentalValue(const(fv)).Strategy(orderFactory=order.side.Market(volume=const(1))))
def Complete(ctx): ctx.volumeStep = 100 c_200 = const(200.) fv_200_12 = strategy.side.FundamentalValue(c_200).Strategy(orderFactory=order.side.Market(volume=const(12))) fv_200 = strategy.side.FundamentalValue(c_200).Strategy(orderFactory=order.side.Market(volume=const(1))) def s_fv(fv): return strategy.TradeIfProfitable( strategy.side.FundamentalValue(const(fv)).Strategy(orderFactory=order.side.Market(volume=const(1)))) def fv_virtual(fv): return ctx.makeTrader_A(s_fv(fv), "v" + str(fv)) return [ ctx.makeTrader_A( strategy.price.LiquidityProvider() .Strategy(orderFactory = order.side_price.Limit(volume=constant(170)) .sideprice_WithExpiry(constant(10))), "liquidity"), ctx.makeTrader_A(fv_200_12, "t200"), ctx.makeTrader_A(fv_200, "t200_1"), ctx.makeTrader_A(strategy.side.FundamentalValue(const(150.)) .Strategy(event.Every(constant(1.)), order.side.Market(const(1.))), "t150"), ctx.makeTrader_A(strategy.side.MeanReversion().Strategy(event.Every(constant(1.)), order.side.Market(const(1.))), "mr_0_15"), ctx.makeTrader_A(strategy.side.CrossingAverages(alpha_1=0.15, alpha_2=0.015) .Strategy(event.Every(constant(1.)), order.side.Market(const(1.))), label="avg+"), ctx.makeTrader_A(strategy.side.CrossingAverages(alpha_1=0.015, alpha_2=0.15) .Strategy(event.Every(constant(1.)), order.side.Market(const(1.))), label="avg-"), ctx.makeTrader_A(strategy.TradeIfProfitable(fv_200), "v_fv200"), fv_virtual(160.), fv_virtual(170.), fv_virtual(180.), fv_virtual(190.), ctx.makeTrader_A(strategy.ChooseTheBest([ s_fv(160.), s_fv(170.), s_fv(180.), s_fv(190.), ]), "best") ]