Kライン連続数値強気・弱気判断戦略

EMA ATR
作成日: 2024-05-17 13:54:06 最終変更日: 2024-05-17 13:54:06
コピー: 1 クリック数: 682
1
フォロー
1617
フォロワー

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]))