パーソナライズされたモメンタム・トレーディング・戦略

作者: リン・ハーンチャオチャン, 日付: 2023-11-23 15:18:27
タグ:

img

概要

これは,モメントインディケーターとキャンドルスティックエンティティフィルタリングを組み合わせたパーソナライズされた取引戦略です. 過剰購入および過剰販売条件を考慮しながら,モメントブレークスルーベースの戦略を実装するために,ストーカスティックモメントインデックス,急速RSI,キャンドルスティックエンティティフィルタリングの3つの技術指標を包括的に使用します.

取引の論理

この戦略は,以下の3つの指標を用いて取引信号を判断する.

  1. ストカスティックモメントインデックス (SMI): ストカスティックモメントインデックス (SMI) は,価格モメントの強度または弱さを判断するために,キャンドルスティックエンティティとの間の距離と閉店価格の相対的な位置を組み合わせます.SMIが境界線を超えると購入信号と,境界線を下回ると販売信号を生成します.

  2. 速度のRSI (7日線):価格の過買い・過売り状態を判断する.20未満のRSIは過買い信号を生成し,80を超えるRSIは過買い信号を生成する.

  3. ろうそくエンティティフィルター: 過去10日間の平均ろうそくエンティティサイズを計算します.当日のろうそくエンティティがその平均の3分の1を超えるとのみ,無効な信号を避けるために信号を有効にします.

この戦略は,まずSMIとRSIからの信号を判断する.いずれかの指標信号要件が満たされている場合,その信号が有効かどうかを判断するためにキャンドルスタックエンティティフィルターを組み合わせ,有効であれば取引信号を生成する.

利点分析

この戦略には以下の利点があります.

  1. 判断は複数の指標の組み合わせにより より正確で信頼性があります

  2. キャンドルスタイクエンティティフィルターを追加すると,無効な信号が避けられます.

  3. 過剰購入/過剰販売条件を組み合わせることで,傾向の逆転点での信号を捉えることが容易になります.

  4. 双方向のロング・ショート取引で利益の機会が増える

  5. 部分的なポジション取引は,過度の単一の損失を回避します.

リスク分析

この戦略にはいくつかのリスクもあります:

  1. インディケーターは誤った信号を生成し,損失を引き起こす可能性があります.パラメータ最適化は誤った信号を減らすことができます.

  2. 部分的なポジション取引は,各方向のトレンド機会を完全に利用することはできません.取引ポジションのサイズを拡大することで,より高いリターンを得ることができます.

  3. 主な指標として,SMIはパラメータ設定に敏感である.不正な設定は取引機会を逃したり,誤った信号を増やす可能性があります.

  4. 双方向の戦略で頻繁に取引すると 取引コストが上がります

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

この戦略は,次の側面においてさらに最適化することができる.

  1. SMIとRSIのパラメータを最適化して,最適なパラメータの組み合わせを見つけます.

  2. ポジションのサイズとポジション管理のメカニズムを強化し,トレンド期により高いリターンを達成する.

  3. ストップ・ロスの戦略を追加して 単一の損失リスクを減らす.

  4. 信号の信頼性を判断し,誤った信号を減らすために,より多くの指標を組み合わせます.

  5. 効率的な契約を採用し,取引コストを削減する.

結論

この戦略は,SMI,急速なRSI,キャンドルスタックエンティティフィルタリング指標を総合的に活用し,勢力をベースに,オーバーバイト/オーバーセール意識のパーソナライズド取引戦略を実装する.正確な判断,有効なシグナルの識別,オーバーバイト/オーバーセール条件と双方向取引の組み合わせなどの利点があるが,パラメータ敏感性,トレンドを完全に資本化できないこと,頻繁な取引などのリスクもあります.パラメータを継続的に最適化し,ポジションサイズとストップ損失管理を増やし,偽信号を削減することで,戦略はより良い取引パフォーマンスを達成することができます.


/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 6h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.2", shorttitle = "Stochastic str 1.2", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limit and close < open and body and usesmi
dn1 = SMI > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

もっと