意図的な反転エンベロープ平均戦略


作成日: 2023-12-04 16:12:39 最終変更日: 2023-12-04 16:12:39
コピー: 0 クリック数: 759
1
フォロー
1619
フォロワー

意図的な反転エンベロープ平均戦略

概要

意向逆転取引網平均策略は,移動平均線に基づく意向逆転取引策である.この策略は,二指数移動平均線を基礎として計算し,その上下各に複数の取引網帯を追加する.価格が取引網帯に触れたとき,方向に応じてポジションを多めに開くか空にする.価格が平均線に戻ると,平仓を退出する.

戦略原則

この戦略は,二指数移動平均線 ((DEMA) を基本指標として使用する.二指数移動平均線は,価格変化に高い感度を持つ移動平均線である.その基礎に,戦略は,それぞれ上下の両側に複数の価格帯を追加し,均線包網区を形成する.包網区の範囲は,各価格帯間の一定パーセントの間隔に従って,ユーザーが設定する.

価格が上昇して上方包帯帯に近づくとき,この戦略は空調を打開する.価格が下がって下方包帯に触れたとき,この戦略は空調を打開する.新しい価格帯に触れたたびに,ポジションをアップする.価格が移動平均線の近くに戻るとき,戦略はすべてのポジションをクリアする.

この戦略は,包囲区間を通して価格の過度な変動を捕捉し,反転が来るときに利益を得て退場し,低買い高売りの取引目標を達成する.これは,平均値が明らかに戻る特徴を持つ市場周期に適用されます.

戦略的優位性

  • 双指数移動平均線を使用し,短期的な価格変化に敏感であり,トレンドの転換を素早く捉えることができる.
  • 平均線付近に包囲区を設置することで,価格の逆転をより正確に捉えることができる.
  • 倉庫を積み重ね,資金効率を最大限に活用する.
  • 収益を上げるとすぐに方向転換し,市場の変化に柔軟に対応します.
  • パラメータの調整により自由に最適化できます.

戦略リスク

  • ビジネスが利益を得られず 方向転換が困難である.
  • パラメータを正しく設定しない場合,取引が頻発する可能性があります.
  • 比較的安定した状況が必要で,大きな波動のある市場には適さない.
  • 包囲区域の範囲が小さすぎて,開設できない場合もある.

包帯域の範囲を適切に放宽し,価格変化を誘発する感度を増やすことでリスクを軽減することができる.また,移動平均線の長さのパラメータを異なる周期的状況に適応させることができる.

戦略最適化の方向性

この戦略は以下の点で最適化できます.

  1. 移動平均線アルゴリズムを最適化する.異なるタイプの移動平均線指標の効果をテストすることができる.

  2. 平均線長パラメータを調整する.周期を短縮することで,短期的な価格変化の捉え方が改善されるが,騒音取引も増加する可能性がある.

  3. 包帯域パラメータを最適化する. 異なるパーセント設定をテストして最適なパラメータの組み合わせを見つける.

  4. 追加ストップ戦略. 移動ストップまたは撤回ストップを設定することで,単一の損失を効果的に制御できます.

  5. フィルタリング条件を追加する.他の指標信号と組み合わせて,不合理な状況下で無効開設を避ける.

要約する

意向反転取引ネットワーク均等価値戦略は均等線価格チャネルを構築することによって,価格反転の機会を効果的に捕捉する. それはパラメータを柔軟に調整し,異なる市場環境に適用することができる. この戦略は,トランザクションコストが低く,リターン率が高く,推奨される量化取引戦略である.

ストラテジーソースコード
/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)