全暗号スウィング ALMA クロス MACD 定量戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-05 10:24:34
タグ:

img

概要

この戦略は,自動的なロングとショートポジションを達成するために,ダブルALMA移動平均線のゴールデンクロスとデッドクロス信号を組み合わせ,MACD指標のロングとショート信号をベースにしています.この戦略は4時間以上のタイムフレームに適しており,テストデータはBNB/USDTで,2017年から現在までで,佣金率は0.03%と設定されています.

戦略原則

この戦略は,ALMAから構築された高速線と遅い線を使用して,ダブル移動平均を構成する.高速線長が20で,遅い線は40で,どちらも0.9のオフセットと5の標準偏差を採用する.高速線が遅い線を横切ると,長い信号が生成される.高速線が遅い線を下に横切ると,短い信号が生成される.

同時,戦略はMACD指標のヒストグラム信号を組み込みます.MACDヒストグラムが正である (上昇) のときのみ,長い信号は有効です.MACDヒストグラムが負である (低下) のときのみ,ショート信号は有効です.

ストラテジーはまた,利益とストップ・ロスの条件を設定する.ロング・テイク・プロフィートは2倍,ストップ・ロスは0.2倍,ショート・テイク・プロフィートは0.05倍,ストップ・ロスは1倍である.

利点分析

この戦略は,二重移動平均値のトレンド判断とMACD指標のエネルギー判断を組み合わせ,誤った信号を効果的にフィルターし,エントリー精度を向上させることができます. 利益の最大化と巨額の損失を回避するために,利益とストップロスの設定は合理的です.

バックテストデータは,2017年から採用されており,複数の牛と熊の変換サイクルをカバーしています.この戦略は,依然として期間を通して良好なパフォーマンスを発揮しています.これは,戦略が市場の線形性および非線形性の両方に適応することを証明します.

リスク分析

この戦略には次のリスクがあります

  1. 二重移動平均自体は遅延効果があり,短期間の機会を逃す可能性があります
  2. MACD ヒストグラムが0である場合,戦略は信号を生成しません.
  3. 利益とストップ・ロスの比は,前もって設定されている,実際の市場から逸脱する可能性があります

解決策:

  1. 適正に移動平均周期を短縮して短期への感受性を向上させる
  2. ヒストグラムの変動をより頻繁にするためにMACDパラメータを最適化
  3. ダイナミックに取利益とストップ損失の設定を調整する

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

戦略は,次の側面でも最適化できます.

  1. より良いスムージング効果を見つけるために移動平均の異なるタイプを試してみましょう
  2. 移動平均値とMACDのパラメータを最適化し,異なる製品とサイクルに適合させる
  3. フィルター信号に取引量の変化などの追加条件を追加する
  4. 利回り・ストップ・ロスの比率をリアルタイムで調整し,より適応性を高めます

結論

この戦略は,移動平均値のトレンド判断とMACDの補助判断を成功裏に組み合わせ,さまざまな市場条件で安定した収益を得ることができる合理的な取利益とストップ損失を設定する. 戦略の安定性と収益性は,パラメータ設定の継続的な最適化,追加のフィルタリング条件の追加などによってさらに強化することができます.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © exlux99

//@version=4
strategy(title = "Full Crypto Swing Strategy ALMA Cross", overlay = true,  pyramiding=1,initial_capital = 1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.03)

//time condition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2010, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//alma fast and slow
src = haClose
windowsize = input(title="Length Size Fast", type=input.integer, defval=20)
windowsize2 = input(title="Length Size Slow", type=input.integer, defval=40)
offset = input(title="Offset", type=input.float, defval=0.9, step=0.05)
sigma = input(title="Sigma", type=input.float, defval=5)
outfast=alma(src, windowsize, offset, sigma)
outslow=alma(src, windowsize2, offset, sigma)

//macd
fast_length = input(title="Fast Length", type=input.integer, defval=6)
slow_length = input(title="Slow Length", type=input.integer, defval=25)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)

// Calculating
fast_ma = ema(src, fast_length)
slow_ma =  ema(src, slow_length)
macd = fast_ma - slow_ma
signal = ema(macd, signal_length)
hist = macd - signal

long=crossover(outfast,outslow) and hist > hist[1] and time_cond
short=crossunder(outfast,outslow) and hist < hist[1] and time_cond

takeProfit_long=input(2.0, step=0.005)
stopLoss_long=input(0.2, step=0.005)
takeProfit_short=input(0.05, step=0.005)
stopLoss_short=input(1.0, step=0.005)

strategy.entry("long",1,when=long)
strategy.entry("short",0,when=short)

strategy.exit("short_tp/sl", "long", profit=close * takeProfit_long / syminfo.mintick, loss=close * stopLoss_long / syminfo.mintick, comment='LONG EXIT',  alert_message = 'closeshort')
strategy.exit("short_tp/sl", "short", profit=close * takeProfit_short / syminfo.mintick, loss=close * stopLoss_short / syminfo.mintick, comment='SHORT EXIT',  alert_message = 'closeshort')

もっと