이 전략은 간단한 이동 평균 (SMA) 과 몇 가지 수학 계산을 사용하여 구매/판매 포인트를 결정합니다. 우리는 100일 SMA 라인을 기본으로 유지합니다. 닫기 가격이 이 라인 아래에 있다면, 우리는 가격이 라인 아래에 있는 비율 (낮은 오프셋) 을 기반으로 개막 포지션을 결정합니다. 마찬가지로, 우리는 긴 포지션을 닫기 전에 100일 SMA 위에 높은 오프셋 퍼센트를 설정합니다. 가격이 여전히 상승하는 동안 너무 일찍 닫으려고 하면, 후속 스톱 손실이 유발됩니다.
이 전략은 세 개의 SMA 라인을 사용합니다: 빠른 라인 (저수 14 일), 느린 라인 (저수 100 일), 참조 라인 (저수 30 일).
닫기 가격이 기준선 아래, 느린 선 아래의 비율 (낮은 오프셋) 이 구성된 값보다 높을 때 길어집니다. 빠른 선이 상승하고 느린 선이 떨어집니다. 이 조건이 충족되면 빠른 선과 느린 선이 곧 교차 할 가능성이 높으므로 좋은 입구 지점입니다.
닫기 가격이 참조 라인 이상, 느린 라인 위의 비율 (높은 오프셋) 이 구성 된 값보다 크면 닫기 가격이 3 개의 촛불을 연속으로 올랐을 때 긴 것을 닫습니다. 우리는 오픈 이윤을 가지고 있으며 빠른 라인이 느린 라인 위에 있습니다. 가격이 긴 폐쇄 후 계속 상승하면 후속 스톱 손실이 유발됩니다.
오더 크기는 전체 자금의 비율에 기반합니다. 이것은 우리의 포지션 크기를 제어합니다.
그에 따른 개선:
SMA 오프셋 변동 거래 전략은 다른 SMA 라인을 기반으로 오프셋을 설정하여 최적의 입구 지점을 식별합니다. 출구 메커니즘은 이익을 잠금하기 위해 후속 스톱 손실을 설정합니다. 이 전략은 이해하기 쉽고 구현하기 쉽습니다. SMA 기간, 오프셋, 스톱 손실 수준과 같은 매개 변수를 최적화함으로써 더 나은 결과를 얻을 수 있습니다. 안정적인 이익을 추구하는 중장기 투자자에게 적합합니다.
/*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"}] */ // @version=4 // Author: Sonny Parlin (highschool dropout) strategy(shorttitle="SMA+Strategy", title="SMA Offset Strategy", overlay=true, currency=currency.USD, initial_capital=10000) // Inputs and variables ss = input(14, minval=10, maxval=50, title="SMA Fast (days)") ff = input(100, minval=55, maxval=200, title="SMA Slow (days)") ref = input(30, minval=20, maxval=50, title="SMA Reference (days)") lowOffset = input(0.001, "Low Offset (%)", minval=0, step=0.001) highOffset = input(0.0164, "High Offset (%)", minval=0, step=0.0001) orderStake = input(0.96, "Order Stake (%)", minval=0, step=0.01) // SMA smaFast = sma(close, ss) smaSlow = sma(close, ff) smaRef = sma(close, ref) distanceLow = (close - smaSlow) / close distanceHigh = (close - smaSlow) / close // Set up SMA plot but don't show by default plot(smaFast, "smaFast", color=#00ff00, display = 0) plot(smaSlow, "smaSlow", color=#ff0000, display = 0) plot(smaRef, "smaRef", color=#ffffff, display = 0) // The buy stratey: // guard that the low is under our sma low reference line by our lowOffset %, // default is 0.001. (low < smaRef) and (distanceLow > lowOffset) // SMA fast is on the rise and SMA slow is falling and they are very likely // to cross. (rising(smaFast,1)) and (falling(smaSlow, 1)) enterLong = (low < smaRef) and (distanceLow > lowOffset) and (rising(smaFast,1)) and (falling(smaSlow, 1)) // The sell Strategy: // Guard that close is higher than our sma high reference line by our // highOffset %, default is 0.0164. (close > smaRef) and (distanceHigh > highOffset) // Guard that close has risen by 3 candles in a row (rising(close,3)) // Guard that we currently have profit (strategy.openprofit > 0) // Guard that SMA fast is higher than smaSlow (smaFast > smaSlow) // If it keeps going up past our close position the trailing stoploss will kick in! enterShort = (close > smaRef) and (distanceHigh > highOffset) and (rising(close,3)) and (strategy.openprofit > 0) and (smaFast > smaSlow) // Order size is based on total equity // Example 1: // startingEquity = 2000 // close = 47434.93 // orderStake = 0.45 // (2,000 × orderStake) / close = orderSize = 0.0189733599 = approx $900 // Example 2: // startingEquity = 2000 // close = 1.272 // orderStake = 0.45 // (startingEquity × orderStake) / close = orderSize = 707.5471698113 = approx $900 orderSize = (strategy.equity * orderStake) / close // Trailing Stoploss // I'm using 1.35 as my default value, play with this for different results. longTrailPerc = input(title="Trailing Stoploss (%)", type=input.float, minval=0.0, step=0.1, defval=1.35) * 0.01 longStopPrice = 0.0 longStopPrice := if (strategy.position_size > 0) stopValue = close * (1 - longTrailPerc) max(stopValue, longStopPrice[1]) else 0 if (enterLong) strategy.entry("Open Long Position", strategy.long, orderSize, when=strategy.position_size <= 0) if (enterShort) strategy.exit(id="Close Long Position", stop=longStopPrice) //plot(strategy.equity)