株式取引の移動平均範囲を拡大したマルティンゲール戦略

作者: リン・ハーンチャオチャン,日付: 2023年11月2日 17:16:08
タグ:

img

概要

この戦略は,移動平均間の間隔を拡大することによってトレンドを特定する. 上向きのトレンドが特定されると,トレンドから利益を得るために徐々にロングポジションを構築する.同時に,リスクを制御するためにストップ・ロスト・ポイントが設定される.

戦略の論理

  1. 2つの移動平均値,EMA1とEMA2を設定し,少し異なる期間,例えば55と89を設定します. これにより,MAs間の範囲がより広くなります.

  2. 価格がMAsを超えると上昇傾向を示す.その後,ロングポジションは徐々に構築することができます.

  3. ポジションを取った後,価格が上昇し続けるとピラミッドを継続します.これはトレンドからより高い利益をもたらすことができます.

  4. ストップロスのポイントをMA以下に設定します.価格がMA以下に下がると,ストップロスをストップロストに閉じます.ストップロスはエントリー価格とともに浮上します.

  5. これは,リスクを制御するためにストップロスを設定しながら,トレンドから利益を得るためにピラミッドポジションを可能にします.

利点分析

  1. より広いMA範囲は,傾向を明確に識別するのに役立ちます.

  2. ピラミッド構造は トレンドから高い収益を生み出します

  3. ダイナミックストップロスは,損失を制限しながらトレンドから利益を得ます.

  4. 長期トレンド取引に適しています

リスク分析

  1. トレンドを正しく識別しなければ 損失は加速します

  2. ピラミッド化がコントロールされれば,保証金請求リスクは回避できる.

  3. ストップ・ロスは合理的に設定する必要があります 幅が大きすぎると損失が広がり 幅が狭すぎるとストップ・ロスは大きくなります

  4. 流動性を考慮しなければならない 低流動性資産は不適切です

最適化 の 提案

  1. RSI,KDなどの指標を追加して 傾向を確認し 誤ったブレイクを回避します

  2. 最適な組み合わせを見つけるために,資産の特徴に基づいて MA 期間を最適化します.

  3. ポジションサイズのリスクを制御するための最適なピラミッドモデルを研究します

  4. 部分的な利益を引き取り,利益を固定し,引き下げを減らすことを考慮してください.

  5. 資産の変動をベースにストップロスを設定して 保護をバランスさせ ストップロスを回避します

概要

この戦略は,より広いMA範囲のトレンドを特定し,トレンドから利益を得るためにピラミッドポジションを設定し,リスクを制御するために浮遊ストップロスを設定する.トレンドで良いリターンを達成できるが,異なる資産でより堅固になるためにエントリー信号,ピラミディング,ストップロスのさらなる最適化が必要です.


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

//@version=2
// strategy(title='Super Simple Martingale Buying', shorttitle="Martingale v5",overlay=true, pyramiding = 10, initial_capital=1, calc_on_order_fills = true)


// Revision:        1
// Author:          @ToS_MavericK

// === INPUT SMA ===
EMA1  = input(55)
EMA2  = input(89)

Amount  = input(defval = 6, type = float, title = "Max open Orders", minval = 1, step = 1)
Multiplier  = input(defval = 2  , type = float, title = "Multiplier", minval = 1, step = 0.1)
BuyLvl  = input(defval = 1, type = float, title = "BuyLvl", minval = 0, step = 0.1)
Profit  = input(3)
DoubleUpLimit    = input(2)

// === INPUT BACKTEST RANGE ===
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 = 2019, title = "From Year", minval = 2012)
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 = 2020, title = "To Year", minval = 2012)

RSIFilter = input(false)
minRSI  = input(defval = 35,  title = "RSI", minval = 1, step = 1)
lengthRSI = input(14, minval=1)
src = input(close, title="RSI Source")

StochRSIFilter = input(false)
lengthStoch = input(14, minval=1)
smoothK = input(3, minval=1)
smoothD = input(3, minval=1)

rsi = rsi(src, lengthRSI)
k = sma(stoch(rsi, rsi, rsi, lengthStoch), smoothK)
d = sma(k, smoothD)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

// === SERIES SETUP ===
vEMA1 = ema(close, EMA1)
vEMA2 = ema(close, EMA2)

buy  =  (rsi < minRSI or RSIFilter == false) and ((crossover(k,d) and k < 20) or StochRSIFilter == false) and ((close < vEMA1 * (1 - BuyLvl/100) and vEMA1 < vEMA2) or (close < vEMA2 * (1 - BuyLvl/100) and vEMA2 < vEMA1))

BuyPrice = strategy.position_avg_price * (1 - DoubleUpLimit/50)
SellPrice = strategy.position_avg_price * (1 + Profit/(100*strategy.opentrades))

// Exit first, due to the limit orders, which can be hit on the same bar
strategy.exit("EMA1", limit = SellPrice, when = window() and strategy.opentrades > 0)
strategy.close("EMA1",when = time > finish) // close positions at the end of the specified time period

// Normal entry
strategy.entry("EMA1", strategy.long,qty = strategy.equity/ (close * pow(2,Amount - 1)), when = window() and strategy.opentrades == 0 and buy)
// Martingale
strategy.entry("EMA1", strategy.long,qty = strategy.position_size, limit = strategy.position_avg_price * (1 - DoubleUpLimit/100), when = window() and strategy.opentrades == 1)
strategy.entry("EMA1", strategy.long,qty = strategy.position_size, limit = BuyPrice, when = window() and strategy.opentrades > 1 and strategy.opentrades < Amount)

plot(vEMA1, title = 'EMA1', color = orange, linewidth = 2, style = line)
plot(vEMA2, title = 'EMA2', color = yellow, linewidth = 2, style = line)
plot(BuyPrice[1], title = 'BuyPrice', color = red, linewidth = 2, style = line)
plot(SellPrice[1], title = 'SellPrice', color = green, linewidth = 2, style = line)

もっと