この戦略は,自動的なロングとショートポジションを達成するために,ダブル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年から採用されており,複数の牛と熊の変換サイクルをカバーしています.この戦略は,依然として期間を通して良好なパフォーマンスを発揮しています.これは,戦略が市場の線形性および非線形性の両方に適応することを証明します.
この戦略には次のリスクがあります
解決策:
戦略は,次の側面でも最適化できます.
この戦略は,移動平均値のトレンド判断と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')