Chiến lược này sử dụng trung bình động đơn giản (SMA) và một số tính toán toán học để xác định điểm mua / bán. Chúng tôi giữ một đường SMA 100 ngày làm cơ sở của chúng tôi. Nếu giá đóng dưới đường này, chúng tôi xác định vị trí mở dựa trên tỷ lệ phần trăm giá dưới đường (giảm bù), có thể cấu hình. Tương tự, chúng tôi đặt tỷ lệ phần trăm bù cao trên đường SMA 100 ngày trước khi đóng các vị trí dài. Nếu chúng tôi cố gắng đóng quá sớm trong khi giá vẫn đang tăng, lệnh dừng lỗ sẽ được kích hoạt.
Chiến lược sử dụng ba đường SMA: đường nhanh (thất định 14 ngày), đường chậm (thất định 100 ngày) và đường tham chiếu (thất định 30 ngày).
Nó đi dài khi giá đóng dưới đường tham chiếu, tỷ lệ phần trăm dưới đường chậm (giải phóng thấp) lớn hơn giá trị được cấu hình, đường nhanh đang tăng và đường chậm đang giảm.
Nó đóng dài khi giá đóng trên đường tham chiếu, tỷ lệ phần trăm trên đường chậm (truyền cao) lớn hơn giá trị cấu hình, giá đóng tăng trong 3 ngọn nến liên tiếp, chúng tôi có lợi nhuận mở và đường nhanh nằm trên đường chậm.
Kích thước lệnh dựa trên tỷ lệ phần trăm của tổng vốn chủ sở hữu, điều này kiểm soát kích thước vị trí của chúng tôi.
Những cải tiến tương ứng:
Chiến lược giao dịch biến động SMA Offset xác định các điểm vào tối ưu bằng cách thiết lập sự bù đắp dựa trên các đường SMA khác nhau. Cơ chế thoát đặt một lỗ dừng lại để khóa lợi nhuận. Chiến lược này rất đơn giản để hiểu và thực hiện. Bằng cách tối ưu hóa các thông số như thời gian SMA, bù đắp, mức dừng lỗ, có thể đạt được kết quả tốt hơn. Nó phù hợp với các nhà đầu tư trung dài tìm kiếm lợi nhuận ổn định.
/*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)