Strategi ini menggabungkan beberapa indikator untuk mengidentifikasi arah tren dan menggunakan pendekatan pelacakan tren untuk menangkap peluang tren dalam jangka menengah hingga pendek.
Menggunakan WVAP untuk menilai tingkat harga;
RSI untuk menilai momentum;
QQE untuk mengidentifikasi terobosan harga;
ADX untuk menentukan kekuatan tren;
Coral Trend Indicator untuk menilai tren fundamental;
LSMA untuk membantu penilaian tren;
Menghasilkan sinyal berdasarkan beberapa sinyal indikator.
Strategi ini terutama bergantung pada RSI, QQE, ADX dan indikator lain untuk menentukan arah dan kekuatan tren, menggunakan kurva Coral Trend Indicator sebagai patokan untuk tren fundamental.
Kombinasi dari beberapa indikator meningkatkan akurasi;
Menekankan pelacakan tren untuk meningkatkan profitabilitas;
Mengadopsi konsep breakout untuk menyaring berbagai pasar;
Menggabungkan indikator fundamental untuk menghindari perdagangan yang bertentangan dengan tren;
Waktu perdagangan yang wajar dan ukuran posisi mengendalikan risiko;
Logika strategi yang jelas, mudah dipahami dan dioptimalkan.
Keuntungan terbesar dari strategi ini adalah sinyal gabungan dari beberapa indikator, yang mengurangi probabilitas penilaian yang salah dari indikator tunggal dan meningkatkan akurasi. Penekanan pada pelacakan tren dan konsep breakout juga membantu menyaring peluang jangka menengah yang dapat diandalkan. Selain itu, menggabungkan indikator fundamental mencegah perdagangan terhadap tren utama. Pilihan desain ini meningkatkan stabilitas dan profitabilitas strategi.
Penundaan penilaian karena beberapa indikator, kehilangan harga masuk terbaik;
Kontrol pengambilan yang tidak memadai, risiko pengambilan yang besar;
Potensi sinyal yang dilewatkan ketika tren fundamental berbalik;
Risiko penurunan keuntungan ketika biaya perdagangan dipertimbangkan.
Risiko terbesar adalah penundaan penilaian karena beberapa indikator, menyebabkan kehilangan harga masuk terbaik dan potensi keuntungan. Juga, kontrol penarikan jauh dari ideal, dengan risiko penarikan yang cukup besar. Ketika tren fundamental berbalik sementara indikator belum mencerminkannya, kerugian dapat terjadi. Biaya perdagangan dalam penyebaran aktual juga dapat merusak keuntungan.
Memasukkan stop loss untuk kontrol penarikan yang lebih baik;
Mengoptimalkan parameter untuk mengurangi keterlambatan indikator;
Menambahkan indikator dasar untuk meningkatkan akurasi;
Gunakan pembelajaran mesin untuk optimasi parameter dinamis.
Prioritas untuk optimasi termasuk kontrol penarikan yang lebih baik melalui stop loss untuk mengunci keuntungan dan mengurangi penarikan. Penyesuaian parameter untuk mengurangi keterlambatan indikator dan meningkatkan responsif juga penting. Indikator yang lebih mendasar juga dapat membantu meningkatkan akurasi. Menggunakan pembelajaran mesin untuk optimasi parameter dinamis akan secara signifikan meningkatkan stabilitas strategi.
Strategi ini menggabungkan beberapa indikator untuk menentukan arah tren dan menggunakan pendekatan pelacakan tren dalam desainnya untuk meningkatkan akurasi dan profitabilitas. Kekuatannya termasuk kombinasi indikator, penekanan pada pelacakan tren, dan penggabungan faktor fundamental. Tetapi masalah seperti penundaan penilaian, kontrol penarikan yang tidak memadai tetap ada. Peningkatan di masa depan bisa datang dari optimasi parameter, integrasi stop loss, indikator yang lebih mendasar, dan pembelajaran mesin untuk optimasi dinamis, untuk membuat strategi lebih efektif dalam praktek.
/*backtest start: 2023-11-08 00:00:00 end: 2023-11-15 00:00:00 period: 1m basePeriod: 1m 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/ // © RolandoSantos //@version=4 strategy(title = "VWAP Candles Strategy", overlay=true, shorttitle = "VWAP Cndl", default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000) //Make inputs that set the take profit % longProfitPerc = input(title="Take Long Profit % ", minval=0.0, step=0.1, defval=0.3) / 100 shortProfitPerc = input(title="Take Short Profit % ", minval=0.0, step=0.1, defval=0.95) / 100 tp = input(100, "Take Profit % QTY (How much profit you want to take after take profit target is triggered)") // Figure out take profit price longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc) //Use NYSE for Copp Curve entries and exits// security = input("", title="Change this if you want to see Copp Curve calculated for current ticker. All Copp Curve calculations are base on NYSE Composite") ticker = security(security,"", close) ///Copp Curve//// period_ = input(21, title="Length", minval=1) isCentered = input(false, title="Centered") barsback = period_/2 + 1 ma = sma(close, period_) dpo = isCentered ? close[barsback] - ma : close - ma[barsback] instructions =input(title="Standard Copp settings are (10, 14, 11) however, DOUBLE these lengths as alternate settings to (20,28,22) and you will find it may produce better results, but less trades", defval="-") wmaLength = input(title="WMA Length (Experiment changing this to longer lengths for less trades, but higher win %)", type=input.integer, defval=20) longRoCLength = input(title="Long RoC Length", type=input.integer, defval=28) shortRoCLength = input(title="Short RoC Length", type=input.integer, defval=22) source = ticker curve = wma(roc(source, longRoCLength) + roc(source, shortRoCLength), wmaLength) //////////// QQE////////////QQE///////////////////QQE//////////////////////// // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © KivancOzbilgic //@version=4 src=input(close) length = input(25,"RSI Length", minval=1) SSF=input(9, "SF RSI SMoothing Factor", minval=1) showsignals = input(title="Show Crossing Signals?", type=input.bool, defval=true) highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true) RSII=ema(rsi(src,length),SSF) TR=abs(RSII-RSII[1]) wwalpha = 1/ length WWMA = 0.0 WWMA := wwalpha*TR + (1-wwalpha)*nz(WWMA[1]) ATRRSI=0.0 ATRRSI := wwalpha*WWMA + (1-wwalpha)*nz(ATRRSI[1]) QQEF=ema(rsi(src,length),SSF) QUP=QQEF+ATRRSI*4.236 QDN=QQEF-ATRRSI*4.236 QQES=0.0 QQES:=QUP<nz(QQES[1]) ? QUP : QQEF>nz(QQES[1]) and QQEF[1]<nz(QQES[1]) ? QDN : QDN>nz(QQES[1]) ? QDN : QQEF<nz(QQES[1]) and QQEF[1]>nz(QQES[1]) ? QUP : nz(QQES[1]) //QQF=plot(QQEF,"FAST",color.maroon,2) //QQS=plot(QQES,"SLOW",color=color.blue, linewidth=1) buySignalr = crossover(QQEF, QQES) sellSignalr = crossunder(QQEF, QQES) buyr = QQEF > QQES ////QQE////////////////QQE/////////////////QQE///////////////// //////////////LSMA////////////////////////// // LSMA 1 Settings & Plot lsma1Length = input(100, minval=1, title="LSMA 1") lsma1Offset = input(title="LSMA 1 Offset", type=input.integer, defval=0) lsma1Source = input(close, title="LSMA 1 Source") lsma1 = linreg(lsma1Source, lsma1Length, lsma1Offset) lsma1_std_dev = stdev(abs(lsma1[1] - lsma1), lsma1Length) //plot(lsma1, color=(lsma1 > lsma1[1] ? color.yellow : color.blue), title="LSMA 1", linewidth=2, transp=0) ////////////LSMA/////////////////// //////////////////ADX//////////////////// len = input(14) th = input(20) 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 = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 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) ///////////////////ADX///////////////////// /////////////sqz momentum///////////////////////// // // @author LazyBear & ChrisMoody complied by GIS_ABC // lengthBB = input(20, title="BB Length") mult = input(2.0,title="BB MultFactor") lengthKC=input(20, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)") // Calculate BB sourceBB = close basis = sma(sourceBB, lengthBB) dev = multKC * stdev(source, lengthBB) upperBB = basis + dev lowerBB = basis - dev // Calculate KC maKC = sma(sourceBB, lengthKC) rangeKC = useTrueRange ? tr : (high - low) rangema = sma(rangeKC, lengthKC) upperKC = maKC + rangema * multKC lowerKC = maKC - rangema * multKC sqzOn = (lowerBB > lowerKC) and (upperBB < upperKC) sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC) noSqz = (sqzOn == false) and (sqzOff == false) val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)),lengthKC,0) //////////////////////////// /////// RSI on EMA///////////////// lenrsi = input(13, minval=1, title="Length") srcrsi = linreg(hlc3,100,0) up = rma(max(change(srcrsi), 0), lenrsi) down = rma(-min(change(srcrsi), 0), lenrsi) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) rsicolor = rsi > rsi[1] ? color.green : color.red //plot(rsi,color = rsicolor) //hline(20,color=color.green) //hline(80,color=color.red) vwaprsi = rsi(vwap(hlc3),13) vwaprsicolor = vwaprsi > vwaprsi[1] ? color.blue : color.yellow emarsi = ema(rsi,13) emarsicolor = emarsi > emarsi[1] ? color.green : color.red //plot(emarsi,color=emarsicolor) //plot(vwaprsi,color=vwaprsicolor) /////// RSI on VWMA///////////////// lenrsiv = input(23, minval=1, title="Length RSI VWMA") srcrsiv = vwma(linreg(close,23,0),23) upv = rma(max(change(srcrsiv), 0), lenrsiv) downv = rma(-min(change(srcrsiv), 0), lenrsiv) rsiv = downv == 0 ? 100 : upv == 0 ? 0 : 100 - (100 / (1 + upv / downv)) rsicolorv = rsiv > rsiv[1] ? color.green : color.red ///////////////////////////////////// ///////////////////////////////////// ////////////////coral trend//////////////////// // // @author LazyBear // List of all my indicators: // https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing // //study(title="Coral Trend Indicator [LazyBear]", shorttitle="CTI_LB", overlay=true) srcCT=close i1 = 1.0 i2 = 1.0 i3 = 1.0 i4 = 1.0 i5 = 1.0 i6 = 1.0 sm =input(21, title="Smoothing Period") cd = input(0.4, title="Constant D") ebc=input(false, title="Color Bars") ribm=input(false, title="Ribbon Mode") di = (sm - 1.0) / 2.0 + 1.0 c1 = 2 / (di + 1.0) c2 = 1 - c1 c3 = 3.0 * (cd * cd + cd * cd * cd) c4 = -3.0 * (2.0 * cd * cd + cd + cd * cd * cd) c5 = 3.0 * cd + 1.0 + cd * cd * cd + 3.0 * cd * cd i1 := c1*srcCT + c2*nz(i1[1]) i2 := c1*i1 + c2*nz(i2[1]) i3 := c1*i2 + c2*nz(i3[1]) i4 := c1*i3 + c2*nz(i4[1]) i5 := c1*i4 + c2*nz(i5[1]) i6 := c1*i5 + c2*nz(i6[1]) bfr = -cd*cd*cd*i6 + c3*(i5) + c4*(i4) + c5*(i3) // -------------------------------------------------------------------------- // For the Pinescript coders: Determining trend based on the mintick step. // -------------------------------------------------------------------------- //bfrC = bfr - nz(bfr[1]) > syminfo.mintick ? green : bfr - nz(bfr[1]) < syminfo.mintick ? red : blue //bfrC = bfr > nz(bfr[1]) ? green : bfr < nz(bfr[1]) ? red : blue //tc=ebc?gray:bfrC //plot(ribm?na:bfr, title="Trend", linewidth=3) //bgcolor(ribm?bfrC:na, transp=50) //barcolor(ebc?bfrC:na) //////////////////////////////////////////////////////////////// ///////////////////VWAP/////////////////// //------------------------------------------------ //------------------------------------------------ NormalVwap=vwap(hlc3) H = vwap(high) L = vwap(low) O = vwap(open) C = vwap(close) left = 30 left_low = lowest(left) left_high = highest(left) newlow = low <= left_low newhigh = high >= left_high q = barssince(newlow) w = barssince(newhigh) col2 = q < w ? #8B3A3A : #9CBA7F col2b=O > C?color.red:color.lime AVGHL=avg(H,L) AVGOC=avg(O,C) col=AVGHL>AVGOC?color.lime:color.red col3=open > AVGOC?color.lime:color.red //plotcandle(O,H,L,C,color=col2b) //plot(H, title="VWAP", color=red) //plot(L, title="VWAP", color=lime) //plot(O, title="VWAP", color=blue) //plot(C, title="VWAP", color=black) //plot(NormalVwap, color=col2b) ///////////////////////////////////////////////////////////////////////////// ///Trade Conditions/// t = time(timeframe.period, "0930-1500") long = vwaprsi > vwaprsi[1] and rsi>rsi[1] and vwaprsi < 20 //vwaprsi > 98 and rsi > 50 and rsi[1] < rsi and rsi[1] < rsi[2] //crossover(rsi,20)//O<C and O > linreg(hlc3,100,0) and linreg(hlc3,100,0) > linreg(hlc3,100,0)[1] and AVGHL>AVGOC and t //O < C and close > vwap(hlc3) and ADX > ADX[1] //and val > nz(val[1]) and close > vwap(hlc3) and open > sma(close,23) and close > vwap(hlc3) and t //and rsi > rsi[1] and open > ema(close,13) and open > bfr and bfr > bfr[1] close_long = crossover(vwaprsi,99.8) //C < O // linreg(hlc3,100,0) and linreg(hlc3,100,0) < linreg(hlc3,100,0)[1] //O > C and val < nz(val[1]) // and close < vwap(hlc3) close_short = rsiv > rsiv[1] and rsiv[2] > rsiv[1]//vwaprsi > vwaprsi[1] or rsi > rsi[1] // vwaprsi > 99 and rsi > 99 and rsi > rsi[1] and vwaprsi > vwaprsi[1]//vwaprsi > vwaprsi[1] and rsi>rsi[1] and vwaprsi < 20 //vwaprsi > 98 and rsi > 50 and rsi[1] < rsi and rsi[1] < rsi[2] //crossover(rsi,20)//O<C and O > linreg(hlc3,100,0) and linreg(hlc3,100,0) > linreg(hlc3,100,0)[1] and AVGHL>AVGOC and t //O < C and close > vwap(hlc3) and ADX > ADX[1] //and val > nz(val[1]) and close > vwap(hlc3) and open > sma(close,23) and close > vwap(hlc3) and t //and rsi > rsi[1] and open > ema(close,13) and open > bfr and bfr > bfr[1] short = rsiv > 95 and rsiv < rsiv[1] and rsiv[2] < rsiv[1] //vwaprsi < 1 and rsi < 1 and rsi < rsi[1] and vwaprsi < vwaprsi[1] and t //crossover(vwaprsi,99.8) //C < O // linreg(hlc3,100,0) and linreg(hlc3,100,0) < linreg(hlc3,100,0)[1] //O > C and val < nz(val[1]) // and close < vwap(hlc3) //long = vwaprsi > vwaprsi[1] and emarsi > emarsi[1] and emarsi[2] > emarsi[1] and ADX > 25//O<C and O > linreg(hlc3,100,0) and linreg(hlc3,100,0) > linreg(hlc3,100,0)[1] and AVGHL>AVGOC and t //O < C and close > vwap(hlc3) and ADX > ADX[1] //and val > nz(val[1]) and close > vwap(hlc3) and open > sma(close,23) and close > vwap(hlc3) and t //and rsi > rsi[1] and open > ema(close,13) and open > bfr and bfr > bfr[1] //close_long = vwaprsi < vwaprsi[1] or emarsi < emarsi[1]//C < O // linreg(hlc3,100,0) and linreg(hlc3,100,0) < linreg(hlc3,100,0)[1] //O > C and val < nz(val[1]) // and close < vwap(hlc3) //close_long = O>C or lsma1 < H // or O > linreg(hlc3,100,0) //and linreg(hlc3,100,0) > linreg(hlc3,100,0)[1] and AVGHL>AVGOC and t //O < C and close > vwap(hlc3) and ADX > ADX[1] //and val > nz(val[1]) and close > vwap(hlc3) and open > sma(close,23) and close > vwap(hlc3) and t //and rsi > rsi[1] and open > ema(close,13) and open > bfr and bfr > bfr[1] //long = rsi > rsi[1] and rsi[1] >rsi[2] and lsma1 > lsma1[1] and bfr > bfr[1] and O<C and lsma1 > L and close > close[1] and ADX > ADX[1] and ADX[1] > ADX[2] and ADX > 20 and rsi > rsi[1] and t // linreg(hlc3,100,0) and linreg(hlc3,100,0) < linreg(hlc3,100,0)[1] //O > C and val < nz(val[1]) // and close < vwap(hlc3) //close_short = O<C or lsma1 > H // or O > linreg(hlc3,100,0) //and linreg(hlc3,100,0) > linreg(hlc3,100,0)[1] and AVGHL>AVGOC and t //O < C and close > vwap(hlc3) and ADX > ADX[1] //and val > nz(val[1]) and close > vwap(hlc3) and open > sma(close,23) and close > vwap(hlc3) and t //and rsi > rsi[1] and open > ema(close,13) and open > bfr and bfr > bfr[1] //short = rsi < rsi[1] and rsi[1] <rsi[2] and lsma1 < lsma1[1] and bfr < bfr[1] and O>C and lsma1 < L and close < close[1] and ADX > ADX[1] and ADX[1] > ADX[2] and ADX > 20 and rsi < rsi[1] and t // linreg(hlc3,100,0) and linreg(hlc3,100,0) < linreg(hlc3,100,0)[1] //O > C and val < nz(val[1]) // and close < vwap(hlc3) /// Start date startDate = input(title="Start Date", defval=1, minval=1, maxval=31) startMonth = input(title="Start Month", defval=1, minval=1, maxval=12) startYear = input(title="Start Year", defval=2021, minval=1800, maxval=2100) // See if this bar's time happened on/after start date afterStartDate = true ///Entries and Exits// if (long and afterStartDate) strategy.entry("Long", strategy.long, comment = "Open Long") // strategy.close("Short", strategy.short,qty_percent=100, comment = "close Short") if (short and afterStartDate) strategy.entry("Short", strategy.short, comment = "Open Short") if (close_long and afterStartDate ) strategy.close("Long", strategy.long, qty_percent=100, comment="close Long") // strategy.entry("Short", strategy.short, comment="Open Short") if (close_short and afterStartDate ) strategy.close("Short", strategy.short, qty_percent=100, comment="close Long") if ( hour(time) == 15 and minute(time) > 15 ) strategy.close_all() //Submit exit orders based on take profit price if (strategy.position_size > 0 and afterStartDate) strategy.exit(id="Long", qty_percent=tp, limit=longExitPrice) if (strategy.position_size < 0 and afterStartDate) strategy.exit(id="Short", qty_percent=tp, limit=shortExitPrice)