资源加载中... loading...

K线连续数目牛熊判断策略

Author: ChaoZhang, Date: 2024-05-17 13:54:06
Tags: EMAATR

K线连续数目牛熊判断策略

概述

该策略基于K线的连续上涨或下跌数目来判断牛市或熊市,并据此进行交易。当收盘价连续高于前一根K线的收盘价达到指定数目时,开多头仓位;当收盘价连续低于前一根K线的收盘价达到指定数目时,开空头仓位。同时设置了止损和止盈,并引入了移动止盈的机制以保护利润。

策略原理

  1. 记录连续多头和空头条件成立的次数。如果收盘价高于前一根K线,多头计数加1,空头计数重置为0;如果收盘价低于前一根K线,空头计数加1,多头计数重置为0;否则两个计数都重置为0。
  2. 当多头计数达到指定数目k时,开多头仓位,设置止损和止盈。
  3. 对于多头仓位,记录开仓后最高价,当最高价超过开仓价iTGT个最小变动单位,且收盘价回撤至最高价下方iPcnt%时,平仓。
  4. 当空头计数达到指定数目k2时,开空头仓位,设置止损和止盈。
  5. 对于空头仓位,记录开仓后最低价,当最低价低于开仓价iTGT个最小变动单位,且收盘价反弹至最低价上方iPcnt%时,平仓。

策略优势

  1. 简单易懂,基于K线的连续性进行交易决策,逻辑清晰。
  2. 引入了移动止盈的机制,在价格朝有利方向运行一段距离后主动保护利润。
  3. 止损和止盈的设置可以有效控制风险和锁定利润。
  4. 参数可调,适用于不同的市场和交易风格。

策略风险

  1. 在震荡行情中,频繁的开平仓可能导致较大的滑点成本。
  2. 连续K线数目的判断受到市场噪音的影响,可能出现频繁的信号。
  3. 固定的止损和止盈点位可能无法适应市场的波动性变化。

策略优化方向

  1. 引入更多的技术指标,如均线、波动率等,辅助判断趋势的强度和方向。
  2. 优化移动止盈的触发条件,如根据ATR自适应调整回撤百分比。
  3. 采用更加动态的止损和止盈方式,如跟踪止损、阶梯式止盈等。
  4. 对参数进行优化,找到适合不同市场和品种的最优参数组合。

总结

该策略通过K线的连续性来捕捉牛熊趋势,同时设置了止损止盈以控制风险。移动止盈的引入可以更好地保护利润。但在震荡市中可能出现频繁信号,需要进一步优化信号的可靠性。此外,止损止盈的设置也可以更加灵活,以适应市场的动态变化。综合来看,该策略思路简单清晰,适合趋势性市场,但仍有优化的空间。


/*backtest
start: 2024-04-16 00:00:00
end: 2024-05-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("K Consecutive Candles 數來寶V2", max_bars_back=300, overlay=true)

// 定義用戶輸入
k = input.int(3, title="Number of Consecutive Candles for Long", minval=1)
k2 = input.int(3, title="Number of Consecutive Candles for Short", minval=1)
stopLossTicks = input.int(500, title="Stop Loss (Ticks)")
takeProfitTicks = input.int(500, title="Take Profit (Ticks)")
iTGT = input.int(200,"iTGT")  // 移動停利點
iPcnt = input.int(50,"iPcnt")  // 移動停利%

var float TrailValue = 0
var float TrailExit = 0
var float  vMP = 0

BarsSinceEntry = ta.barssince(strategy.position_size == 0)

vMP := strategy.position_size

// 创建一个包含键值对的字典
addArrayData(type, value) =>
    alert_array = array.new_string()
    array.push(alert_array, '"timenow": ' + str.tostring(timenow))
    array.push(alert_array, '"seqNum": ' + str.tostring(value))
    array.push(alert_array, '"type": "' + type + '"')
    alertstring = '{' + array.join(alert_array,', ') + '}'


// 定義條件變量
var int countLong = 0  // 記錄連續多頭條件成立的次數
var int countShort = 0 // 記錄連續空頭條件成立的次數

// 計算連續大於或小於前一根的收盤價格的次數
if close > close[1]
    countLong += 1
    countShort := 0 // 重置空頭計數
else if close < close[1]
    countShort += 1
    countLong := 0 // 重置多頭計數
else
    countLong := 0
    countShort := 0

// 開設多頭倉位條件
if countLong >= k
    strategy.entry("Long Entry", strategy.long)
    strategy.exit("Exit Long", "Long Entry", loss=stopLossTicks, profit=takeProfitTicks)
    

if vMP>0
    TrailValue := ta.highest(high,BarsSinceEntry)
    TrailExit := TrailValue - iPcnt*0.01*(TrailValue - strategy.position_avg_price)
    if TrailValue > strategy.position_avg_price + iTGT * syminfo.minmove/syminfo.pricescale and close < TrailExit
        
        strategy.close("Long Entry", comment = "Trl_LX"+ str.tostring(close[0]))
// 開設空頭倉位條件
if countShort >= k2
    strategy.entry("Short Entry", strategy.short)
    strategy.exit("Exit Short", "Short Entry", loss=stopLossTicks, profit=takeProfitTicks)

if vMP<0    
    TrailValue := ta.lowest(low,BarsSinceEntry)
    TrailExit := TrailValue - iPcnt*0.01*(TrailValue - strategy.position_avg_price)
    if TrailValue < strategy.position_avg_price - iTGT * syminfo.minmove/syminfo.pricescale and close > TrailExit
        
        strategy.close("short60", comment = "Trl_SX"+ str.tostring(close[0]))






相关内容

更多内容