Strategi ini menggabungkan Indeks Pergerakan Arah (ADX), Plus Indikator Arah (DI +) dan purata bergerak cepat dan perlahan untuk menentukan arah pasaran dan tempoh pegangan.
Logik teras strategi ini adalah untuk menjana isyarat beli apabila garis +DI melintasi di atas garis ADX dari bawah ke atas, dan menjana isyarat jual apabila garis +DI melintasi di bawah garis ADX dari atas ke bawah. Oleh itu, strategi ini bergantung pada persilangan antara DI dan ADX untuk menentukan trend pasaran dan titik pembalikan. Pada masa yang sama, hubungan antara purata bergerak cepat dan perlahan digunakan untuk menentukan trend pasaran secara keseluruhan. Isyarat perdagangan hanya akan dipertimbangkan apabila EMA cepat di atas EMA perlahan.
Khususnya, isyarat beli akan dicetuskan apabila syarat-syarat berikut dipenuhi:
Isyarat jual akan diaktifkan apabila syarat-syarat berikut dipenuhi:
Strategi ini juga menggabungkan logik stop loss untuk keluar dari semua kedudukan apabila harga jatuh di bawah tahap stop loss.
Strategi ini menggabungkan indikator DI, ADX dan purata bergerak untuk menentukan perubahan dalam trend pasaran dengan berkesan.
Terdapat beberapa risiko yang perlu diperhatikan dengan strategi ini:
Risiko ini boleh ditangani dengan mengoptimumkan ADX dan parameter purata bergerak, menyesuaikan tahap stop loss, menambah penapis untuk pengesahan dll.
Terdapat ruang untuk penambahbaikan lanjut:
Secara amnya, strategi trend silang ADX ini agak stabil, mampu menangkap pembalikan dengan berkesan pada peringkat awal, tetapi kawalan risiko adalah penting. Mengoptimumkan parameter lebih lanjut, mematuhi peraturan kemasukan dengan ketat dan menghentikan kerugian boleh membawa kepada pulangan yang disesuaikan dengan risiko yang baik. Strategi ini sesuai untuk akaun jangka panjang yang memegang kedudukan jangka menengah hingga pendek.
/*backtest start: 2022-12-01 00:00:00 end: 2023-12-07 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © mohanee //@version=4 //ADX strategy SmoothedTrueRange=0.00 SmoothedDirectionalMovementPlus=0.00 SmoothedDirectionalMovementMinus=0.00 strategy(title="ADX strategy", overlay=false,pyramiding=3, default_qty_type=strategy.fixed, default_qty_value=3, initial_capital=10000, currency=currency.USD) len = input(11, title="ADX Length", minval=1) threshold = input(30, title="threshold", minval=5) fastEma=input(13, title="Fast EMA",minval=1, maxval=50) slowEma=input(55, title="Slow EMA",minval=10, maxval=200) stopLoss =input(8, title="Stop Loss",minval=1) // TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0 SmoothedTrueRange:= nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus:= nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = sma(DX, len) plot(DIPlus, color=color.green, title="DI+") //plot(DIMinus, color=color.red, title="DI-") plot(ADX, color=color.black, title="ADX") hline(threshold, color=color.black, linestyle=hline.style_dashed) fastEmaVal=ema(close,fastEma) slowEmaVal=ema(close,slowEma) //long condition longCondition= ADX < threshold and crossover(DIPlus,ADX) and fastEmaVal > slowEmaVal barcolor(longCondition ? color.yellow: na) strategy.entry(id="ADXLE", long=true, when= longCondition and strategy.position_size<1) barcolor(strategy.position_size>1 ? color.blue: na) bgcolor(strategy.position_size>1 ? color.blue: na) //Add strategy.entry(id="ADXLE", comment="Add", long=true, when= strategy.position_size>1 and close<strategy.position_avg_price and crossover(DIPlus,ADX) ) //calculate stop Loss stopLossVal = strategy.position_avg_price - (strategy.position_avg_price*stopLoss*0.01) strategy.close(id="ADXLE",comment="SL Exit", when=close<stopLossVal) //close all on stop loss //exit condition exitCondition= ADX > threshold and crossunder(DIPlus,ADX) // and fastEmaVal > slowEmaVal strategy.close(id="ADXLE",comment="TPExitAll", qty=strategy.position_size , when= exitCondition) //close all