回测测试
/*backtest start: 2022-01-01 00:00:00 end: 2022-05-09 23:59:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}] args: [["ContractType","rb2210",360008]] */ //@version=5 // # ========================================================================= # // # | STRATEGY | // # ========================================================================= # strategy(title = "NMVOB-S", shorttitle = "NMVOB-S", overlay = true , calc_on_every_tick = false , initial_capital = 0) // # ========================================================================= # // # | 全局变量 START | // # ========================================================================= # var current_trend = int(na) var open_order_type = int(na) var stop_loss_price = float(na) var stop_profit_price = float(na) var sl = float(na) var open_order_price = float(na) var open_type_flag = int(na) var stop_profit_flag = 0 var macd_signal_position = 0 var macd_signal_type = int(na) var start_price = input.float(10000, "起始资金") var volumeMultiple = input.int(10, "乘数") var gg = input.int(10, "杠杆") // # ========================================================================= # // # | 全局变量 END | // # ========================================================================= # // # ========================================================================= # // # | 自定义函数 START | // # ========================================================================= # stop_loss_pillars = input(defval = 0, title = "止损柱数量") stop_profit_proportion = input.float(1,"止盈比例") //计算止损价 calculate_stop_loss() => if current_trend == 1 stop_loss_price_buy = low if stop_loss_pillars == 0 stop_loss_price_buy else for i = 1 to stop_loss_pillars if low[i] < stop_loss_price_buy stop_loss_price_buy := low[i] else if low[i] > stop_loss_price_buy stop_loss_price_buy stop_loss_price_buy else stop_loss_price_sell = high if stop_loss_pillars == 0 stop_loss_price_sell else for i = 1 to stop_loss_pillars if high[i] < stop_loss_price_sell stop_loss_price_sell else if high[i] > stop_loss_price_sell stop_loss_price_sell := high[i] stop_loss_price_sell //计算止盈 calculate_stop_profit(cur_stop_loss_price) => value = math.abs(close - cur_stop_loss_price) * stop_profit_proportion if current_trend == 1 close + value else close - value // # ========================================================================= # // # | 自定义函数 END | // # ========================================================================= # // # ========================================================================= # // # | Normalized MACD | // # ========================================================================= # sma = input(13,title='MACD Fast MA') lma = input(21,title='MACD Slow MA') tsp = input(9,title='MACD Trigger') np = input(20,title='MACD Normalize') type = input.int(1,minval=1,maxval=3,title="(MACD) 1=Ema, 2=Wma, 3=Sma") sh = type == 1 ? ta.ema(close,sma) : type == 2 ? ta.wma(close, sma) : ta.sma(close, sma) lon=type == 1 ? ta.ema(close,lma) : type == 2 ? ta.wma(close, lma) : ta.sma(close, lma) ratio = math.min(sh,lon)/math.max(sh,lon) Mac = if sh>lon 2 - ratio - 1 else ratio - 1 //快线 MacNorm = ((Mac-ta.lowest(Mac, np)) /(ta.highest(Mac, np)-ta.lowest(Mac, np)+.000001)*2)- 1 MacNorm2 = if np < 2 Mac else MacNorm //慢线 Trigger = ta.wma(MacNorm2, tsp) if ta.crossover(source1 = MacNorm, source2 = Trigger) macd_signal_position := 0 macd_signal_type := 1 else if ta.crossunder(source1 = MacNorm, source2 = Trigger) macd_signal_position := 0 macd_signal_type := 0 else macd_signal_position += 1 // # ========================================================================= # // # | Normalized MACD | // # ========================================================================= # // # ========================================================================= # // # | Volatility Oscillator START | // # ========================================================================= # length = input(30, title="VS 周期") spike = close - open vs_up_line = ta.stdev(spike,length) vs_low_line = ta.stdev(spike,length) * -1 // # ========================================================================= # // # | Volatility Oscillator END | // # ========================================================================= # // # ========================================================================= # // # | Bollinger Bands | // # ========================================================================= # b_length = input.int(15, minval=1 , title="布林带周期") src = input(close, title="Boollinger Bands Source") mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev") basis = ta.sma(src, b_length) dev = mult * ta.stdev(src, b_length) upper = basis + dev lower = basis - dev offset = 0 plot(basis, "布林带中轨", color=color.white, offset = offset) plot(upper, "布林带上轨", color=color.red, offset = offset) plot(lower, "布林带下轨", color=color.blue, offset = offset) // # ========================================================================= # // # | Bollinger Bands | // # ========================================================================= # if true if strategy.opentrades == 0 and barstate.isnew //macd涨跌条件 long_macd_conditions = macd_signal_type == 1 and macd_signal_position <= 10 short_macd_conditions = macd_signal_type == 0 and macd_signal_position <= 10 // Volatility Oscillator 涨跌条件 long_vs_conditions = ta.crossover(source1 = spike, source2 = vs_up_line) short_vs_conditions = ta.crossunder(source1 = spike, source2 = vs_low_line) //布林带涨跌条件 long_bollinger_conditions = low < basis and close > basis and high < upper short_bollinger_conditions = high > basis and close < basis and low > lower //开多单条件 open_long_order_conditions = long_macd_conditions and long_vs_conditions and long_bollinger_conditions //开空单条件 open_short_order_conditions = short_macd_conditions and short_vs_conditions and short_bollinger_conditions if open_long_order_conditions current_trend := 1 stop_loss_price := calculate_stop_loss() stop_profit_price := calculate_stop_profit(stop_loss_price) open_order_type := 1 sl := math.floor((start_price * gg) / (close * volumeMultiple)) open_order_price := close open_type_flag := 1 if sl > 0 strategy.order(id = "long order", direction = strategy.long , qty = sl, limit = close, stop = stop_loss_price, comment = "多单", when = open_long_order_conditions) else if open_short_order_conditions current_trend := 0 stop_loss_price := calculate_stop_loss() stop_profit_price := calculate_stop_profit(stop_loss_price) open_order_type := 0 sl := math.floor((start_price * gg) / (close * volumeMultiple)) open_order_price := close open_type_flag := 0 if sl > 0 strategy.order(id = "short order", direction = strategy.short , qty = sl, limit = close, stop = stop_loss_price, comment = "空单", when = open_short_order_conditions) else if strategy.opentrades == 1 if open_order_type == 1 if close <= stop_loss_price or close >= stop_profit_price stop_loss_price := float(na) stop_profit_price := float(na) lr = (close - open_order_price) * sl start_price := start_price + lr strategy.close_all(when = true, comment = "平多") if open_order_type == 0 if close >= stop_loss_price or close <= stop_profit_price stop_loss_price := float(na) stop_profit_price := float(na) lr = (open_order_price - close) * sl start_price := start_price + lr strategy.close_all(when = true, comment = "平空") // plot(series = current_trend, title = "当前趋势", color = color.orange) // plot(series = strategy.opentrades, title = "未平单数量", color = color.orange) // plot(series = open_order_type, title = "开单类型", color = color.orange) plot(series = open_order_price, title = "开单价", color = color.orange) plot(series = stop_loss_price, title = "止损价", color = color.orange) plot(series = stop_profit_price, title = "止盈价", color = color.orange) // plot(series = sl, title = "开单数量", color = color.orange) // plot(series = start_price, title = "剩余金额", color = color.orange, style = plot.style_circles)