Chiến lược này kết hợp Đường trung bình di chuyển trơn tru với chỉ số Stochastic để nắm bắt nhiều cơ hội hơn trong xu hướng. Nó chủ yếu sử dụng hai đường trung bình di chuyển theo cấp số nhân với các giai đoạn khác nhau để tạo ra tín hiệu giao dịch, cùng với sự chéo chéo của đường K và đường D trong chỉ số Stochastic để lựa chọn thời gian nhập cảnh, để có được lợi nhuận cao hơn trong xu hướng.
Chiến lược này sử dụng trung bình di chuyển trơn tru 12 giai đoạn và 26 giai đoạn. Khi đường nhanh vượt qua trên đường chậm từ dưới, đi dài. Khi đường nhanh vượt qua dưới đường chậm từ trên, đi ngắn. Để lọc tín hiệu giả, nó đòi hỏi các đường nhanh và chậm phải ở cùng một hướng, với đường nhanh trên đường chậm cho dài, và đường nhanh dưới đường chậm cho ngắn.
Sự chéo chéo giữa đường K và đường D trong chỉ số Stochastic được sử dụng để lựa chọn thời gian vào. Khi đường K vượt qua đường D từ dưới đường mua quá mức, đi dài. Khi đường K vượt qua đường D từ trên đường bán quá mức, đi ngắn.
Đường trung bình di chuyển trơn tru xác định hướng xu hướng, trong khi chỉ số Stochastic lọc tiếng ồn và chọn thời gian nhập cảnh.
Do đó, chiến lược này có thể theo xu hướng chọn lọc để nắm bắt các cơ hội, đạt được lợi nhuận cao hơn.
Để giảm những rủi ro đó, chúng ta có thể thiết lập stop loss, hoặc áp dụng các thông số MA vừa phải hơn.
Chiến lược có thể được tối ưu hóa thêm từ các khía cạnh sau:
Bằng cách thử nghiệm các kết hợp tham số khác nhau, các tham số tốt hơn có thể được tìm thấy.
Chiến lược này tích hợp các điểm mạnh của Smooth Moving Average và Stochastic để theo dõi xu hướng, trong khi chọn thời gian đầu vào tốt hơn. Nó dễ dàng hoạt động, có rủi ro có thể kiểm soát và giá trị thực tế lớn. Hiệu suất của nó có thể được cải thiện hơn nữa thông qua kiểm tra và tối ưu hóa liên tục. Nó cung cấp cho các nhà giao dịch lượng một mô hình theo dõi xu hướng hiệu quả và ổn định.
/*backtest start: 2024-01-18 00:00:00 end: 2024-01-25 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // author SoftKill strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true) src = input(title="Source", type=input.source, defval=close) src_0 = src[0] src_1 = src[1] src_2 = src[2] src_3 = src[3] src_4 = src[4] len50 = input(50, minval=1, title="Length") src50 = input(close, title="Source") out50 = ema(src50, len50) len100 = input(100) src100 = input(close, title="Source") out100 = ema(src100, len100) len1 = input(1, minval=1, title="Length") src1 = input(close, title="Source") out1 = sma(src1, len1) length = input(5, minval=1) OverBought = input(80) OverSold = input(20) smoothK = 3 smoothD = 3 k = sma(stoch(close, high, low, length), smoothK) d = sma(k, smoothD) cu = crossover(k,OverSold) co = crossunder(k,OverBought) sma_down = crossunder(out1, out50) sma_up = crossover(out1,out50) //if (not na(k) and not na(d)) // if (co and k < OverSold) // strategy.entry("StochLE", strategy.long, comment="StochLE") //if (cu and k > OverBought) // strategy.entry("StochSE", strategy.short, comment="StochSE") crossCandle_4 = crossover(src[4],out50) crossCandleUnder_4= cross(src[4],out50) crossCandle_3 = crossover(src[3],out50) crossCandleUnder_3= crossunder(src[3],out50) crossCandle_2 = crossover(src[2],out50) crossCandleUnder_2= crossunder(src[2],out50) crossCandle_1 = crossover(src[1],out50) crossCandleUnder_1= crossunder(src[1],out50) crossCandle_0 = crossover(src[0],out50) crossCandleUnder_0= crossunder(src[0],out50) conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0) conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0) touch4 = (cross(low[4],out50) or cross(high[4],out50)) touch3 = (cross(low[3],out50) or cross(high[3],out50)) touch2 = (cross(low[2],out50) or cross(high[2],out50)) touch1 = (cross(low[1],out50) or cross(high[1],out50)) touch = touch1 or touch2 or touch3 or touch4 //and sma_up //and sma_down // Getting inputs fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) src_macd = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length) slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal //plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) //plot(macd, title="MACD", color=col_macd, transp=0) //plot(signal, title="Signal", color=col_signal, transp=0) // plot((conditionOver or conditionUnder or touch) and src[0] >= out50 and close >= out50 and (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime) // plot((conditionOver or conditionUnder or touch) and src[0] <= out50 and close <= out50 and (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red) long_cond = ((conditionOver or conditionUnder or touch) and src[0] >= out50 and close > out50 and (cu) and out50 > out100 and hist>=0) short_cond = ((conditionOver or conditionUnder or touch) and src[0] <= out50 and close < out50 and (co) and out50< out100 and hist<=0) tp=input(0.1) sl=input(0.1) strategy.entry("long",strategy.long, when=long_cond) strategy.entry("short",strategy.short, when=short_cond) strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick, loss=close * sl / syminfo.mintick, when=touch ) strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch ) // //tp = input(0.0003, title="tp") // tp = 0.0003 // //sl = input(1.0 , title="sl") // sl = 1.0 // strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong") // strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")