该策略基于止损和止盈价格点经常设置在整数价格或关键价格水平的思想,这些价格点往往作为支持和阻力位。策略通过识别这些关键价格水平,在价格接近时进行买入或卖出操作。
该策略主要包含以下规则:
当收盘价高于关键价格水平时,并且在过去10根K线中没有触及该价格,进行买入操作。
随后使用爬坡追踪,以跟踪价格突破关键价格的运动。爬坡步长为20点。
卖出操作与买入相反,当收盘价低于关键价格水平时,并且在过去10根K线中没有触及该价格,进行卖出操作。
识别关键价格水平的方法是:
该策略基于价格 pyschology 的理念,认为整数价格或关键级别往往是多空双方争夺的重要位置,从而作为交易信号产生效果。同时,爬坡追踪可以跟踪价格突破后的趋势。
该策略具有以下优势:
该策略也存在以下风险:
对应解决方法:
该策略可以从以下方面进行优化:
增加更多条件判断关键价格点的重要程度,避免假突破的风险。例如结合交易量等指标。
优化参数,特别是判断关键价格区域的步长、K线周期等参数。使之更符合不同品种的特点。
优化追踪止损机制,例如使用动态跟踪止损代替固定爬坡止损。
增加机器学习算法,利用历史数据判断关键价格区域的强弱,以提高信号质量。
扩展成跨时间周期的策略,同时在更高时间周期判断趋势,在更低时间周期进行追踪。
本策略基于价格关键点的思路简单直观,利用普遍存在的交易习惯形成交易信号。策略机会充足,但需进一步优化以处理假突破情况。参数优化和机器学习等手段可提高策略稳定性。本策略可为日内短线交易提供思路,也可扩展为跨周期的趋势追踪策略。
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//Strategy based on the idea that stop loss and take profit are often placed at full price levels or round numbers, whcih acts as resistance and supports levels
//Buy Rules:
//Actual price (close) is above round number.
//Round number level was not touched in previous ten bars (arbitrary value).
//Place a buy and follow the order with a trail step because price can bounce at round number (support) or can go through it.
//Sell Rules are the same of buy rules but inverted.
//
//Need improvement on conditions' logic and round numbers definitions
strategy("dP magnet", overlay=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD)
//Round Levels credit to RKchartest
roundLevel50 = input(500, 'Round Level 1, pips')
//roundLevel100 = input(1000, 'Round Level 2, pips')
deviation = input(1000, 'Max distance, pips', minval=0)
rDelimeter = 1/syminfo.mintick
intRoundLevel = close[1] * rDelimeter
intRemainder = intRoundLevel % roundLevel50
toRound = (intRemainder >= roundLevel50/2) ? roundLevel50 : 0
roundLevel = (intRoundLevel - intRemainder + toRound) / rDelimeter
plot(roundLevel, title='Round Level 1', color=black, style=line, transp=0, linewidth=1, trackprice=false)
//intRemainder2 = intRoundLevel % roundLevel100
//toRound2 = (intRemainder2 >= roundLevel100/2) ? roundLevel100 : 0
//roundLevel2 = (intRoundLevel - intRemainder2 + toRound2) / rDelimeter
//plot((abs(roundLevel2 - close) * rDelimeter < deviation) ? roundLevel2 : na, title='Round Level 2', color=black, style=circles, transp=0, linewidth=1, trackprice=true)
// end
//Start of strategy
distToFullNumber=(close-roundLevel) //can be positive or negative number
distPips=input(100,'Distance in pips to full level',minval=10) //user defined: this distance defines when to open an order at market price
TrailS=input(20,'Trail Step points',minval=10) //trail step that follows the order
longCondition = iff(distToFullNumber>0 and abs(distToFullNumber)<=distPips and lowest(low,10)>roundLevel,true,false)
if (longCondition)
strategy.entry("LongMagnet", strategy.long)
strategy.exit("ExitMagnet","LongMagnet",trail_points=TrailS)
shortCondition = iff(distToFullNumber<0 and abs(distToFullNumber)<=distPips and highest(high,10)<roundLevel,true,false)
if (shortCondition)
strategy.entry("ShortMagnet", strategy.short)
strategy.exit("Exit_Magnet","ShortMagnet",trail_points=TrailS)