堅牢で安定したSMAポジション保持戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-18 17:44:16
タグ:

img

概要

この戦略は,SMAラインに基づいた単純なポジション保有戦略である.短期間のSMAラインが長期間のSMAラインを横切ったとき,長期間のSMAラインが長期間のSMAラインを横切ったとき,ポジションを閉じる.

戦略原則

この戦略は2つのSMAライン,短期の20日線と長期間の50日線を使用する.短期線は価格トレンドの変化をより早く捉えることができ,長期線は短期間のノイズをフィルターする.短期線が長期線の上に急速に上昇すると,トレンドが長期の上昇を開始した可能性があることを示唆する.短期線が長期線を下回ると,上昇トレンドが終了した可能性があることを示唆する.

要するに,この戦略は,SMA線の曲線特性を利用して2つの時間次元で価格動きの傾向を決定し,比較的安定したポジション保持で安定した利益を得ています.

利点分析

この戦略の利点は以下の通りです.

  1. 操作が簡単,理解が容易,使用に障壁が少ない
  2. SMAラインの強みを活用することで比較的安定している
  3. 長期保持期間,短期市場騒音の影響が少ない
  4. 設定可能なパラメータは少ないが,最適なパラメータ組み合わせを見つけるのは簡単だ

リスク分析

この戦略のリスクは以下のとおりです.

  1. 長期間の範囲制限市場では,より多くのストップ損失が可能です.
  2. SMA線は遅延効果があり,即時の価格変動を把握できない.
  3. 短期的な急上昇後退パターンから利益を得られない
  4. 単一の取引損失の大きさを制御できない

オプティマイゼーションの方向性

この戦略は,次の側面でさらに最適化できます.

  1. マックド指標を追加して,範囲限定市場での減少損失の底部リバウンドタイミングを特定します.
  2. 最適な値を見つけるために異なるSMA線パラメータの組み合わせをテストする
  3. 進捗傾向の差異を特定するための国内指標を組み込み,入力精度を向上させる
  4. 取引ごとに利益/損失を制御するメカニズムに利益とストップ損失のメカニズムを追加

概要

概要すると,このSMAポジション保有戦略は安定し,操作が簡単で,初心者向けライブ取引に適しています.アルゴ取引が進化し続けるにつれて,この戦略はより良いパフォーマンスのためにより多くの指標と技術を組み込むことができます.


/*backtest
start: 2022-12-11 00:00:00
end: 2023-12-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Zlema Strateg Long 5m', overlay=true )

// FUNCTIONS

Atr(p) =>
    atr = 0.
    Tr = math.max(high - low, math.max(math.abs(high - close[1]), math.abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1]) / p, Tr)
    atr

// ZLEMA
length = input(title='Length', defval=14)
highlightMovements = input(title='Highlight Movements ?', defval=true)
src = input(title='Source', defval=close)

lag = math.floor((length - 1) / 2)

zlema = ta.ema(src + src - src[lag], length)

zlemaColor = highlightMovements ? zlema > zlema[1] ? color.green : color.red : #6d1e7f
plot(zlema, title='ZLEMA', linewidth=2, color=zlemaColor, transp=0)


// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input.float(1, title='Long Take Profit 1 %', step=0.1) / 100
long_tp1_qty = input.int(10, title='Long Take Profit 1 Qty', step=1)

long_tp2_inp = input.float(5, title='Long Take Profit 2%', step=0.1) / 100
long_tp2_qty = input.int(50, title='Long Take Profit 2 Qty', step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input.float(2.2, 'SL Mutiplier', minval=1, step=0.1)
ATR_period = input.int(17, 'ATR period', minval=1, step=1)

// Strategy
entry_long = zlema > zlema[1]
entry_price_long = ta.valuewhen(entry_long, close, 0)
SL_floating_long = entry_price_long - multiplier * Atr(ATR_period)
exit_long = zlema < zlema[1]

///// BACKTEST PERIOD ///////
testStartYear = input(2022, 'Backtest Start Year')
testStartMonth = input(1, 'Backtest Start Month')
testStartDay = input(1, 'Backtest Start Day')
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, 'Backtest Stop Year')
testStopMonth = input(12, 'Backtest Stop Month')
testStopDay = input(31, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

if testPeriod()
    strategy.entry('long', strategy.long, comment='Long', when=entry_long)
    strategy.exit('TP1', 'long', qty_percent=long_tp1_qty, limit=long_take_level_1)  //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit('TP2', qty_percent=long_tp2_qty, limit=long_take_level_2)  //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close('long', when=exit_long, comment='exit long')


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='1st Long Take Profit')
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit')
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')


if testPeriod()
    strategy.entry('long', strategy.long, comment='Long', when=entry_long)


// LONG POSITIONplot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')



もっと