低买高卖策略是一个非常简单但有效的长期交易策略。本策略自动在加密货币大幅下跌后买入,并在涨幅达到设定目标后卖出,从而在市场大幅波动时获得收益。
本策略的核心在于通过计算给定回溯期内加密货币的涨跌幅,判断市场是否出现大幅下跌。当最近一段时间内加密货币价格大幅下跌超过设定阈值时,表示市场可能处于极度恐慌,这时策略会自动买入。此外,本策略还设置了止损点和止盈点,当价格触及这两个点时,会自动止损或止盈。
具体来说,本策略使用 trailing_change 函数计算给定回溯期内加密货币的总体涨跌幅。当最近 inp_lkb 根K线内,加密货币的涨跌幅小于设定参数 dip 的负值时,就是符合买入条件的大幅下跌。此时在回测时间窗口内,会触发策略的买入開仓操作。
在买入开仓后,本策略会实时跟踪价格变化,设定两个出場条件:(1)当价格跌破开仓价格的 (1 - 停损比例)% 时,会触发止损平仓;(2)当价格涨破开仓价格的 (1 + 止盈比例)% 时,会触发止盈平仓。
本低买高卖策略最大的优势在于非常简单易执行。它不需要复杂的技术指标,只依靠最近一段时间的涨跌幅判断市场行情,非常适合交易初学者。同时,低买高卖也是一个长期有效的策略,特别是在加密货币这种高波动市场中,这样的反转交易策略能获得可观的长期收益。
另外,本策略支持止损和止盈设置,可以有效控制个别交易的损失,并锁定部分收益。这也使得该策略适合实盘交易,即便市场出现较大的不利波动也可以将损失控制在可承受的范围内。
本策略的主要风险在于无法确定市场反转的时间点。如果行情继续下跌并不反弹,那么开仓买入的头寸可能会出现较大的浮亏。因此,停损点的设置至关重要。如果停损点设置过宽,单笔损失可能会非常惨重。
另一个需要注意的风险是,如果行情出现剧烈的震荡,价格可能在短期内触发止损或止盈条件。这可能会带来额外的交易成本。特别是在行情剧烈波动时,价格短期内连续触发多笔止盈止损的情况并不少见。
针对上述风险,我们可以设置更宽的回溯期,确保买入信号更加稳定可靠,能过滤部分震荡中的假信号。此外,加入一定的交易冷静期,在平仓后一段时间内不开新仓,也可以有效降低价格震荡带来的交易频率过高问题。
本策略还有进一步优化的空间,主要集中在以下几个方面:
动态调整止损止盈参数。可以根据市场波动率动态调整止损幅度和止盈幅度,在市场恐慌时宽松设置止损幅度,在行情向好时适当收紧止盈幅度。
结合多个因子判断买入时机。除了近期涨跌幅外,还可以引入交易量变化等其他因素来确定更可靠的反转信号。
加入重新入场机制。在止损或止盈后,可以设置一定的重新入场策略,在新的反转机会再次买入。
本低买高卖策略整体来说非常适合加密货币这种高波动市场,它Capture了市场反转的机会,并设置止损止盈控制风险。本策略非常简单,容易理解和实施,非常适合交易初学者。通过进一步优化,可以获得更稳定的策略表现。总的来说,低买高卖是一个值得推荐的长期交易策略。
/*backtest
start: 2023-11-25 00:00:00
end: 2023-12-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Coinrule
//@version=3
strategy(shorttitle='Buy the Dips',title='Buy the Dips (by Coinrule)', overlay=true, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 30, commission_type=strategy.commission.percent, commission_value=0.1)
//Backtest dates
fromMonth = input(defval = 1, title = "From Month")
fromDay = input(defval = 10, title = "From Day")
fromYear = input(defval = 2020, title = "From Year")
thruMonth = input(defval = 1, title = "Thru Month")
thruDay = input(defval = 1, title = "Thru Day")
thruYear = input(defval = 2112, title = "Thru Year")
showDate = input(defval = true, title = "Show Date Range")
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
inp_lkb = input(1, title='Lookback Period')
perc_change(lkb) =>
overall_change = ((close[0] - close[lkb]) / close[lkb]) * 100
// Call the function
overall = perc_change(inp_lkb)
//Entry
dip= -(input(2))
strategy.entry(id="long", long = true, when = overall< dip and window())
//Exit
Stop_loss= ((input (2))/100)
Take_profit= ((input (2))/100)
longStopPrice = strategy.position_avg_price * (1 - Stop_loss)
longTakeProfit = strategy.position_avg_price * (1 + Take_profit)
strategy.close("long", when = close < longStopPrice or close > longTakeProfit and window())