이 전략은 연속적으로 상향 또는 하향 촛불의 수에 따라 황소 또는 곰 시장을 결정하고 그에 따라 거래를 수행합니다. 종료 가격이 이전 촛불이 지정된 시간 동안 닫는 것보다 연속적으로 높을 때, 그것은 긴 위치에 들어갑니다. 종료 가격이 이전 촛불이 지정된 시간 동안 닫는 것보다 연속적으로 낮을 때, 그것은 짧은 위치에 들어갑니다. 스톱 손실과 수익을 설정하고 수익을 보호하기 위해 후속 스톱 메커니즘을 도입합니다.
이 전략은 촛불의 연속성을 통해 황소와 곰 트렌드를 포착하고 있으며 위험을 제어하기 위해 스톱 로스를 설정하고 이익을 취합니다. 트레일링 스톱의 도입은 이익을 더 잘 보호 할 수 있습니다. 그러나 불안정한 시장에서 빈번한 신호를 생성 할 수 있으므로 신호 신뢰성을 더 이상 최적화해야합니다. 또한, 스톱 로스의 설정 및 이익 취득은 역동적인 시장 변화에 적응하기 위해 더 유연할 수 있습니다. 전반적으로 전략은 트렌딩 시장에 적합한 간단하고 명확한 아이디어를 가지고 있지만 여전히 최적화 할 여지가 있습니다.
/*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]))