この戦略は,高波動性のある証券のために設計された引き戻しシステムであり,ビットコインは非常に理想的な取引品である.この戦略は日線図またはより低い時間枠で使用できる (私は3時間の時間枠で良い結果を見つけましたが,1時間未満ではテストしていません).
この戦略は,前2つのK線の収束価格の変化を比較して波動性を計算し,この価格変化から移動平均を生成する.移動平均線に標準差の1つの帯を包み,内部は1つの標準差,外部は2つの標準差である.価格が既定の移動平均線フィルターよりも高い場合,我々は上昇傾向にあることを確認する.したがって,上昇傾向では,内部標準差の波が突破される引き戻しがあれば,買い信号を発信する.
ユーザーは,テストしたい日付の範囲を変更し,波動率の移動平均周期と内外波動帯の標準差を計算できます.ビットコインについては,内部と外部標準差の波動帯を標準設定で保持しましたが,3サイクルの波動率の追跡は1日間のチャート取引に適しており,5サイクルの波動率の追跡は3時間間のチャート取引に適しています.これは買って持てる戦略ではないため,取引する際には,最も流動的なコインに固執して,任意の取引所で迅速に入って出ることができます.この戦略を低波動の市場でテストする場合は,内部差の標準波動帯を約0.75に変更します.
リスク対策:
適切な波動標を選択し,単一ポジションをコントロールする.
取引の有効性を改善するパラメータ
ストップ・ロスを採用し,厳格な資金管理を行います.
取引実行の効率を重視し,流動性の良い指標を選択する.
異なる標識の特性に合わせてパラメータを調整する.
この戦略は以下の点で最適化できます.
移動平均の周期を最適化して,異なる指標の変動率をよりよく追跡する.
波動率帯のパラメータを特定の標識の波動範囲に近似して調整する.
取引量の増幅などの他のフィルタリング条件を追加し,取引信号をさらに検証します.
マシン・ラーニング技術を利用して,動的に最適化するパラメータを使用して,戦略をより適応的にします.
取引機会を捉えるため,より高い時間枠でテストする.
ストップ・ストップ・ロスのモバイル・トラッキングが追加され,利益が口座に閉じ込められるようになりました.
他の指標やモデルと組み合わせた量化組合せ戦略を確立する.
この戦略は,全体的に単純で直観的で,波動率指標を活用して逆転状況を把握し,市場の転換点を捉える.戦略の最適化には大きな余地があり,パラメータを調整し,他の技術指標と組み合わせることで,戦略の安定性と収益性を向上させ続けることができます.しかし,トレーダーは過度の最適化と曲線適合の問題に注意する必要があります.この戦略は,短期間の取引に適しており,リスクを制御するために厳格な資金管理を必要とします.
/*backtest
start: 2023-09-11 00:00:00
end: 2023-10-11 00:00:00
period: 4h
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/
// © gary_trades
//This script is designed to be used on volatile securities/tickers so is best suited for day charts on Crypto (particularly good for BTC).
//It takes both long and short trades and the main indicator settings can be changed by the use so they can test for ideal settings for ticker of interest.
//@version=4
strategy("BTC Volatility Band Strategy", shorttitle="Vol Band Strategy", overlay=false, margin_long=100, margin_short=100)
//VOLATILTY
CandleChange = ((close - close[1])/close)*100 //OR CandleChange = ((close[2] - close[1])/close)*100
plot(CandleChange, color=color.red, linewidth = 1)
//VOLATILITY BANDS
MAlen = input(7, minval=3, maxval=30, title=" MA Length")
MAout = sma(CandleChange, MAlen)
plot(MAout, color=color.black, display=display.none)
InnerBand = input(1.0, minval=0.5, maxval=5, title="Inner Band")
OuterBand = input(2.00, minval=0.5, maxval=10, title="Outer Band")
devInner = InnerBand * stdev(CandleChange, MAlen)
devOuter = OuterBand * stdev(CandleChange, MAlen)
upper1 = MAout + devInner
lower1 = MAout - devInner
b1 = plot(upper1, "Upper Inner", color=color.gray)
b2 = plot(lower1, "Lower Inner", color=color.gray)
upper2 = MAout + devOuter
lower2 = MAout - devOuter
b3 = plot(upper2, "Upper Outer", color=color.gray)
b4 = plot(lower2, "Lower Outer", color=color.gray)
fill(b1, b3, color.rgb(250,145,175,70), title="Background")
fill(b2, b4, color.rgb(250,145,175,70), title="Background")
band1 = hline(25, "Upper Band", color=color.gray, linestyle=hline.style_dotted, linewidth=2)
band0 = hline(-25, "Lower Band", color=color.gray, linestyle=hline.style_dotted, linewidth=2)
//LONG FILTER
VolFilterL = CandleChange <= lower1 and CandleChange > lower2
SMAFilterL = close[1] > sma(close[1], 50)
PriceFilterL = close > lowest(close,7)
LongFilter = VolFilterL and SMAFilterL and PriceFilterL
bgcolor(LongFilter ? color.new(color.green, 80) : na)
//SHORT FILTER
VolFilterS = CandleChange >= upper1 and CandleChange < upper2
SMAFilterS = close[1] < sma(close[1], 50)
PriceFilterS = close < highest(close,7)
ShortFilter = VolFilterS and SMAFilterS and PriceFilterS
bgcolor(ShortFilter ? color.new(color.red, 80) : na)
//SETTING BACK TEST INPUTS
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 = 2000, title = "From Year", minval = 1970)
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2100, title = "To Year", minval = 1970)
startDate = timestamp("America/New_York", fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp("America/New_York", toYear, toMonth, toDay, 00, 00)
time_condition = time >= startDate and time <= finishDate
//ORDER DETAILS
Risk = (high[7] - low[7])/ 7
Profit = Risk*1.15
Loss = Risk*0.65
AlertMSG = "New stategy position" + tostring(strategy.position_size)
if (time_condition)
strategy.entry("Long", strategy.long, when = LongFilter, alert_message=AlertMSG)
if (LongFilter)
LongStop = strategy.position_avg_price - Loss
LongProfit = strategy.position_avg_price + Profit
strategy.exit("TP/SL", "Long", stop=LongStop, limit=LongProfit)
if (time_condition)
strategy.entry("Short", strategy.short, when = ShortFilter, alert_message=AlertMSG)
if (ShortFilter)
ShortStop = strategy.position_avg_price + Loss
ShortProfit = strategy.position_avg_price - Profit
strategy.exit("TP/SL", "Short", stop=ShortStop, limit=ShortProfit)