증권 거래의 이동 평균 범위가 확장된 마르틴게일 전략

저자:차오장, 날짜: 2023-11-02 17:16:08
태그:

img

전반적인 설명

이 전략 은 이동 평균 사이 의 간격 을 확장 함 으로 트렌드를 식별 한다. 상승 추세가 확인 될 때, 트렌드 에서 이윤 을 얻기 위해 점진적 으로 긴 포지션을 구축 한다. 동시에 위험 을 통제 하기 위해 스톱 로스 포인트 를 설정 한다.

전략 논리

  1. 두 개의 이동 평균, EMA1과 EMA2를 약간 다른 기간, 예를 들어 55과 89으로 설정하십시오. 이것은 MAs 사이의 더 넓은 범위를 만듭니다.

  2. 가격 이 MA 를 넘으면 상승 추세를 나타냅니다. 그러면 긴 포지션은 점차적으로 쌓일 수 있습니다.

  3. 포지션을 취한 후, 가격이 계속 상승할 때 피라미딩을 계속하십시오. 이것은 트렌드에서 더 높은 이익을 얻을 수 있습니다.

  4. 마이너스 마이너스 이하로 스톱 로스 포인트를 설정합니다. 가격이 마이너스 마이너스 이하로 떨어지면, 스톱 로스를 위해 로그를 닫습니다. 스톱 로스는 엔트리 가격과 함께 상승합니다.

  5. 이것은 피라미드 포지션이 트렌드로부터 이익을 얻을 수 있도록 하고, 동시에 위험을 통제하기 위해 스톱 로스를 설정합니다.

이점 분석

  1. 더 넓은 MA 범위는 트렌드를 명확하게 식별하는 데 도움이됩니다.

  2. 피라미딩은 트렌드로부터 더 높은 수익을 창출합니다.

  3. 동적 스톱 로스는 트렌드로부터 이익을 취하고 손실을 제한합니다.

  4. 장기적인 트렌드 거래에 적합합니다.

위험 분석

  1. 트렌드는 올바르게 파악되어야 합니다. 그렇지 않으면 손실이 가속화됩니다.

  2. 피라미딩은 마진 콜 리스크를 피하기 위해 통제되어야 합니다.

  3. 스톱 로즈는 합리적으로 설정되어야 합니다. 너무 넓으면 손실이 커질 수 있고 너무 단단하면 윙사 (whipssaws) 가 발생할 수 있습니다.

  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)

더 많은