堅実なVIP定量戦略


作成日: 2023-12-19 13:54:05 最終変更日: 2023-12-19 13:54:05
コピー: 1 クリック数: 665
1
フォロー
1621
フォロワー

堅実なVIP定量戦略

概要

この策略は”岩のように堅固なVIP量化策略”と呼ばれ,改良されたウィリアムSMA指標 ((Modified WMA) とSSLチャネル指標 ((SSL Channel)) を融合し,安定した信頼性の高い量化取引の枠組みを構築した.

原則

この戦略は,2つの指標を組み合わせ,一つは改良されたウィリアムSMA指標で,各K線平均値を計算し,次に指数移動平均法を適用してトレンドの方向を決定する.もう一つはSSLチャネル指標で,価格チャネルを決定するために最高価格と最低価格の移動平均を使用して,現在のトレンドの状態を判断する.

改良されたウィリアムSMA指標が買入信号を発信するとき,すなわち金叉のとき,我々はSSL通道指標と組み合わせて,通道内の価格が適切かどうかを判断し,K線実体が通道の下限から完全に下回っているとき,我々はその点で買入して開口する.

利点

  1. この2つの指標を組み合わせることで,購入シグナルをより信頼でき,偽の突破を防ぐことができます.
  2. 改良されたウィリアムSMA指標により,トレンド転換点をより正確に判断できます.
  3. SSLチャネル指標は,価格チャネルを明確に判断し,高値購入を回避します.
  4. 指数移動平均の手法により,長期のトレンドを判断することがより有利である.

リスクと解決

  1. 激烈な状況で,止損ポイントは容易に触発されることがあります. 止損範囲を適切に緩めることができます.
  2. 移動平均システムは,短期市場のノイズに敏感であり,誤った信号を生じることがあります.平均線パラメータを適切に拡大して,フィルタリング効果を高めることができます.
  3. パラメータの設定が不適切であることも,戦略のパフォーマンスに影響を与える.パラメータをフィードバックして最適化することで,最適なパラメータの組み合わせを見つけることができる.

最適化の方向

  1. EMA,VWMAなど,さまざまな種類の移動平均をテストして,最もマッチする平均線指標を探せます.
  2. 交通量指標を足して,低量のエリアで信号を出すのを避ける.
  3. ドンキアン通路など,通路の境界をより確実にするために,異なる通路の描画方法を試すことができます.
  4. MACD,RSIなどの他の補助指標は,購入のタイミングをさらに確認するために追加することができます.

要約する

この戦略は,改良されたウィリアムSMA指標とSSL通道指標の巧妙な組み合わせによって,安定した,信頼性の高い定量取引の枠組みを構築している.市場騒音をフィルターする能力が強く,同時に,高位買いのリスクも回避している.パラメータを適切に設定し,一定の最適化を加えた場合,非常にOutperformingの戦略である.

ストラテジーソースコード
/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
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/
// © Darshana_Alwis

//@version=5
strategy("VIP", overlay=true, initial_capital=1000,currency=currency.USD,default_qty_type=strategy.percent_of_equity,default_qty_value=100,pyramiding=0)
//SSS = Sultan+Saud Strategy

//The original idea of the code belonges to saudALThaidy
//The strategy code is basically made out of two other indicators, edited and combined by me.
// 1- NSDT HAMA Candles => https://www.tradingview.com/script/k7nrF2oI-NSDT-HAMA-Candles/
// 2- SSL Channel => https://www.tradingview.com/script/6y9SkpnV-SSL-Channel/


//MA INFO
WickColor = input.color(color.rgb(80, 80, 80, 100), title='Wick Color', tooltip='Suggest Full Transparency.')
LengthMA = input.int(100, minval=1, title='MA Line Length', inline='MA Info')
TakeProfit = input.float(1, minval=0, title='Take Profit Percentage', step=1)
UseStopLose = input.bool(false, title='Use Stop Percentage')
StopLose = input.float(1, minval=0, title='StopLose Percentage', step=1)

MASource = close

ma(source, length, type) =>
    type == "SMA" ? ta.sma(source, length) :
     type == "EMA" ? ta.ema(source, length) :
     type == "SMMA (RMA)" ? ta.rma(source, length) :
     type == "WMA" ? ta.wma(source, length) :
     type == "VWMA" ? ta.vwma(source, length) :
     na

ma1_color  = color.rgb(230, 172, 0)
ma1 = ma(high, 200, "SMA")

ma2_color  = color.red
ma2 = ma(low, 200, "SMA")

Hlv1 = float(na)
Hlv1 := close > ma1 ? 1 : close < ma2 ? -1 : Hlv1[1]
sslUp1   = Hlv1 < 0 ? ma2 : ma1
sslDown1 = Hlv1 < 0 ? ma1 : ma2

Color1 = Hlv1 == 1 ? ma1_color : ma2_color
fillColor1 = color.new(Color1, 90)

highLine1 = plot(sslUp1, title="UP", linewidth=2, color = Color1)
lowLine1 = plot(sslDown1, title="DOWN", linewidth=2, color = Color1)

OpenLength = 25
HighLength = 20
LowLength = 20
CloseLength = 20


     
SourceOpen = (open[1] + close[1]) / 2
SourceHigh = math.max(high, close)
SourceLow = math.min(low, close)
SourceClose = (open + high + low + close) / 4

funcCalcMA1(src1, len1) => ta.ema(src1, len1)
funcCalcOpen(SourceOpen, OpenLength) => ta.ema(SourceOpen, OpenLength)
funcCalcHigh(SourceHigh, HighLength) => ta.ema(SourceHigh, HighLength)
funcCalcLow(SourceLow, LowLength) => ta.ema(SourceLow, LowLength)
funcCalcClose(SourceClose, CloseLength) => ta.ema(SourceClose, CloseLength)

MA_1 = funcCalcMA1(MASource, LengthMA)

CandleOpen = funcCalcOpen(SourceOpen, OpenLength)
CandleHigh = funcCalcHigh(SourceHigh, HighLength)
CandleLow = funcCalcLow(SourceLow, LowLength)
CandleClose = funcCalcClose(SourceClose, CloseLength)

//PLOT CANDLES
//-------------------------------NSDT HAMA Candels
BodyColor = CandleOpen > CandleOpen[1] ? color.rgb(230, 172, 0) : color.red
barcolor(BodyColor)
plotcandle(CandleOpen, CandleHigh, CandleLow, CandleClose, color=BodyColor, title='HAMA Candles', wickcolor=WickColor, bordercolor=na)
plot(MA_1, title='MA Line', color=BodyColor, style=plot.style_line, linewidth=2)

//------------------------------SSL Channel


plot_buy = false
avg = ((high-low)/2)+low
LongCondition = (Hlv1 == 1 and Hlv1[1] == -1) and (BodyColor == color.rgb(230, 172, 0)) and (MA_1 < avg) and (CandleHigh < avg) and (strategy.opentrades == 0)
if LongCondition
    strategy.entry("BUY with VIP", strategy.long)
    plot_buy := true

base = strategy.opentrades.entry_price(0)
baseProfit = (base+((base/100)*TakeProfit))
baseLose = (base-((base/100)*StopLose))

strategy.exit("SELL with VIP","BUY with VIP",limit = baseProfit)
if UseStopLose and (close < MA_1)
    strategy.exit("SELL with VIP","BUY with VIP",stop = baseLose)
if not UseStopLose and (close < MA_1)
    strategy.exit("SELL with VIP","BUY with VIP", stop = close)
    
plotshape(plot_buy, title="Buy Label", text="Buy", location=location.belowbar, style=shape.labelup, size=size.tiny, color=Color1, textcolor=color.white)

fill(highLine1, lowLine1, color = fillColor1)