ジョーカーを追う 利益戦略

作者: リン・ハーンチャオチャン開催日:2023年9月23日 15:04:20
タグ:

概要

ジョーカー・トレイル・テイク・プロフィート戦略 (Joker Trailing Take Profit strategy) は,移動平均値に基づいたトレンドフォロー戦略である.トレンドが有利な方向に動いているときに利益を最大化し,トレンドが逆転するときに損失を削減するために,トレイルストップ・ロスの特徴とトレイル・テイク・プロフィートを組み合わせる.

戦略の論理

この戦略は,全体的なトレンドを特定するために,高速移動平均値と遅い移動平均値を使用する.高速MAが遅いMAを超えると長行し,高速MAが遅いMAを下回ると短行する.

この戦略は,最初にポジションを開設した後の設定されたパーセントに基づいて初期取利益価格を計算します.もしトレーリング・テイリング・プロフィートが有効であれば,シンボルの最小のティックサイズと設定されたトレーリング・パーセントに基づいてトレーリング・ステップを計算します.

ポジション方向がシグナルと一致すると,トレイルが無効である場合,利息を取るために制限オーダーが使用されます.トレイルが有効である場合,ステップサイズに基づいて利息取りの価格がトレイルされます.

利点分析

  • 移動平均値は市場の騒音をフィルターで 誤った信号を回避します

  • トレイリング・テイク・プロフィートは,価格の動きに基づいて,ダイナミックにテイク・プロフィートレベルを調整します.これは固定テイク・プロフィート価格よりも柔軟です.

  • 利益を引き継ぐのは,より多くの利益をロックし,利益を取り戻す機会を減らす.また,固定的な利益を引き継ぐレベルで,早すぎる退場を避ける.

  • ストップロスの機能は,トレンドが逆転すると,戦略を早期に終了させる.

リスク分析

  • 移動平均値は,巨大な価格変動中に誤った信号または遅れを生む可能性があります.これは間違った取引による損失を引き起こす可能性があります.MAパラメータの最適化とフィルターを追加することが役立ちます.

  • 利回り比が高すぎると,保有期間と実際の利回り価格と予想利回り価格の差が増加します.比率を下げると,このリスクは減少します.

  • 遅いステップセットが小さすぎるとオーダー更新が過剰になり,手数料とスライプが増加する.遅いオフセットの最適化が必要である.

  • トレイリングTPは上昇のみであり,引き下げは考慮されません.これは実際の価格と予想される取利益価格の差を起こす可能性があります.双方向のトレーリングメカニズムは役立ちます.

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

  • 波動性に基づくMAパラメータの動的調整を考慮する.波動性が上昇するより長い期間,波動性が低下するより短い期間.

  • 偏差リスクを最小限にするために,異なる製品や市場における利益率を最適に調査します.

  • 両方向のトレイルメカニズムを探索して 上下両方向にトレイルする.これは利益を価格に近づけるようにします.

  • 傾向強度指標を組み込む 弱気傾向における取利益比を減らす 強い気勢における取利益比を増加させる

  • 機械学習モデルを組み合わせて 予測された価格範囲に基づいて 動的に利益率を設定します

結論

ジョーカー・トレーリング・テイク・プロフィート戦略は,明確な構造を持ち,トレンド方向を定義するために移動平均を用い,利益をロックする.リスクを制御しながらトレンドをスムーズにフォローするために,トレーリング・ストップとトレーリング・テイク・プロフィートの利点を組み合わせます.パラメータ最適化や,より複雑な市場環境に適応するために,テイク・プロフィートメカニズムを強化することで,さらなる改善が可能です.全体的に,これはさらなる研究と適用に値する戦略です.


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

//@version=5
strategy(title='Joker Trailing TP Bot', shorttitle='Joker TTP Bot', overlay=true, pyramiding=0, process_orders_on_close=false, close_entries_rule='ANY', calc_on_every_tick=false, calc_on_order_fills=false, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD) //, max_labels_count=500)

fromDate = input(timestamp('01 Jan 2021 00:00 UTC'), 'From Date')
toDate = input(timestamp('31 Dec 2121 23:59 UTC'), 'To Date')
fastMALen = input.int(23, 'Fast SMA Length')
slowMALen = input.int(50, 'Slow SMA Length')
longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01
shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01
enableTrailing = input.bool(true, 'Enable Trailing')
trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01

float fastMA = ta.sma(close, fastMALen)
float slowMA = ta.sma(close, slowMALen)
bool isWithinPeriod = true
bool openLongPosition = isWithinPeriod and ta.crossover(fastMA, slowMA)
bool openShortPosition = isWithinPeriod and ta.crossunder(fastMA, slowMA)
bool longIsActive = openLongPosition or strategy.position_size > 0
bool shortIsActive = openShortPosition or strategy.position_size < 0

float longTakeProfitPrice = na
longTakeProfitPrice := if longIsActive
    if openLongPosition and not (strategy.position_size > 0)
        close * (1 + longTakeProfitPerc)
    else
        nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc))
else
    na

float shortTakeProfitPrice = na
shortTakeProfitPrice := if shortIsActive
    if openShortPosition and not (strategy.position_size < 0)
        close * (1 - shortTakeProfitPerc)
    else
        nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPrice))
else
    na

float longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
float shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick

strategy.entry(id = 'Long Entry', direction = strategy.long, when = openLongPosition, alert_message = 'Long(' + syminfo.ticker + '): Started')
strategy.entry(id = 'Short Entry', direction = strategy.short, when = openShortPosition, alert_message = 'Short(' + syminfo.ticker + '): Started')
strategy.exit(id = 'Long Take Profit', from_entry = 'Long Entry', limit = enableTrailing ? na : longTakeProfitPrice, trail_price = enableTrailing ? longTakeProfitPrice : na, trail_offset = enableTrailing ? longTrailingTakeProfitStepTicks : na, when = longIsActive, alert_message = 'Long(' + syminfo.ticker + '): Take Profit activated')
strategy.exit(id = 'Short Take Profit', from_entry = 'Short Entry', limit = enableTrailing ? na : shortTakeProfitPrice, trail_price = enableTrailing ? shortTakeProfitPrice : na, trail_offset = enableTrailing ? shortTrailingTakeProfitStepTicks : na, when = shortIsActive, alert_message = 'Short(' + syminfo.ticker + '): Take Profit activated')

plot(series = fastMA, title='Fast SMA', color = color.blue, linewidth = 1, style = plot.style_line)
plot(series = slowMA, title='Slow SMA', color = color.orange, linewidth = 1, style = plot.style_line)
plot(series = longTakeProfitPrice, title='Long Take Profit', color = color.green, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = shortTakeProfitPrice, title='Short Take Profit', color = color.red, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = strategy.position_avg_price, title='Position', color = color.white, linewidth = 1, style = plot.style_linebr)


もっと