随机游走策略是一种基于随机数生成的自动交易策略。该策略使用线性同余生成器根据设置的种子随机生成数字,数字大于阈值时做多,小于阈值时做空,实现随机进入做多做空仓位。
该策略主要通过以下几个部分实现随机交易:
设置随机数生成的参数a、c和模数m,以及初始种子seed。
定义随机数生成函数GetRandom,采用线性同余算法生成0-m之间的随机数。
在每根K线时,如果当前无仓位,则比较生成的随机数大小,大于m/2时做多,否则做空。
设置止损止盈条件,以百分比形式设置止损和止盈幅度。
通过时间段设置回测周期。
通过上述步骤,该策略实现了完全随机的做多做空操作。当随机数大于m/2时开多单,否则开空单,然后设置止损止盈退出仓位。回测周期可自定义设置。
策略逻辑简单清晰,容易理解实现。
随机交易可有效避免人为情绪影响,减少主观误操作。
可自定义随机数生成算法参数,调整随机性。
可灵活设置止损止盈条件,控制单笔损益。
支持回测参数优化,方便测试不同参数对总体收益的影响。
随机交易可能长期无明确走势,收益存在不确定性。
无法据市场状况调整仓位,可能错过趋势机会。
单笔收益有限,回撤风险较大。
需要合理设置止损止盈比例,避免过大损失。
随机性可能导致频繁开平仓,增加交易费用。
需要充分回测验证参数设置合理性,不能盲目使用。
可通过加入趋势判断等功能,减少随机开仓次数,优化止损机制,严格控制单笔损益来降低风险。
增加趋势判断,避免逆势开仓。
加入仓位管理,根据资金变化调整仓位大小。
优化随机数生成算法,提高随机性。
动态调整止损止盈幅度。
加入开仓频率限制。
多参数组合回测寻找最优参数。
随机游走策略通过随机数控制做多做空实现机械交易。该策略随机性强,不受个人情绪影响,回避主观误操作的风险。但随机开仓也可能错过趋势机会,单笔收益有限,需优化风险控制机制。整体来说,该策略适合用来验证交易理念,了解参数设置对收益的影响,但实际应用需谨慎评估。
/*backtest start: 2022-10-02 00:00:00 end: 2023-10-08 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //@author=Tr0sT strategy(title = "Random strategy", shorttitle = "Random", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100) a = 16 c = 10 m = 1000 GetRandom(prev) => GetRandom = (a * prev + c) % m seed = input(200, minval = 2, maxval = m) stopLoss = input(30, title = "Stop loss percentage(0.1%)") takeProfit = input(30, title = "Take profit percentage(0.1%)") curRandom = na curRandom := nz(curRandom[1]) == 0 ? seed : GetRandom(curRandom[1]) if (strategy.position_size == 0) if (curRandom >= m / 2) strategy.entry("Enter", strategy.long) else strategy.entry("Enter", strategy.short) strategy.exit("Exit", "Enter", loss = close * stopLoss / 1000 / syminfo.mintick, profit = close * takeProfit / 1000 / syminfo.mintick) // === Backtesting Dates === testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(3, "Backtest Start Month") testStartDay = input(6, "Backtest Start Day") testStartHour = input(08, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(14, "Backtest Stop Day") testStopHour = input(14, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()