Ini adalah strategi trend panjang automatik berasaskan penunjuk teknikal yang mudah untuk mata wang kripto seperti Bitcoin dan Ethereum, yang bertujuan untuk menangkap trend kenaikan utama dan mengurangkan kerugian yuran dagangan dari perdagangan yang kerap.
Menggunakan MACD untuk menentukan arah trend, lama apabila MACD melintasi;
Mengira EMA 20 tempoh, SMA 100 tempoh dan SMA 200 tempoh, pergi lama apabila EMA dan SMA menunjuk ke atas bersama-sama;
Beli apabila EMA lebih tinggi daripada SMA, dan SMA lebih tinggi daripada SMA perlahan;
Tetapkan garis stop loss, berhenti keluar apabila harga pecah stop loss.
Posisi ditutup apabila harga jatuh dan EMA melintasi di bawah SMA.
Strategi ini menggabungkan beberapa penunjuk untuk menentukan trend dan masa kemasukan untuk mendapat keuntungan daripada trend menaik utama.
Kombinasi beberapa petunjuk boleh membantu menapis keluar pecah palsu dan isyarat yang salah.
Hanya memasuki trend yang jelas boleh mengurangkan perdagangan yang tidak perlu dan kekerapan perdagangan yang lebih rendah.
Stop loss boleh dengan berkesan mengehadkan kerugian maksimum setiap perdagangan.
Ujian belakang menunjukkan keuntungan yang baik dalam BTC dan ETH.
Logik yang mudah dan jelas, mudah difahami dan dilaksanakan, baik untuk pemula.
Kebolehluasan yang tinggi untuk memasukkan lebih banyak penunjuk untuk pengoptimuman.
Kecuaian pasaran yang tinggi, risiko penilaian yang salah.
Pendekatan kedudukan tunggal tidak dapat melindungi risiko sistematik.
Tetapan stop loss yang tidak betul boleh menyebabkan overstop loss.
Ujian belakang tidak mewakili hasil hidup, prestasi sebenar masih belum disahkan.
Kesan kos dagangan tidak dipertimbangkan, mungkin berbeza dari prestasi langsung.
Tidak mengambil kira ciri produk, penyusunan parameter diperlukan.
Uji kombinasi parameter yang berbeza untuk mengoptimumkan parameter penunjuk.
Tambah penapis seperti KDJ untuk menapis isyarat masuk.
Mengoptimumkan strategi stop loss, seperti menambah stop loss dinamik.
Pertimbangkan saiz kedudukan berdasarkan saiz akaun.
Membezakan ciri produk, menyesuaikan parameter dengan sewajarnya.
Sertakan lebih banyak jangka masa untuk analisis.
Uji produk yang berbeza dan cari yang paling sesuai.
Logik strategi adalah mudah dan jelas. Menggunakan beberapa penunjuk boleh membantu menapis isyarat yang salah dengan berkesan. Tetapi pengoptimuman lanjut pada parameter, kawalan risiko dan lain-lain diperlukan, digabungkan dengan pengesahan perdagangan langsung, sebelum aplikasi sebenar. Dengan sambungan yang betul, ia boleh menjadi trend crypto yang sangat praktikal mengikuti strategi.
/*backtest start: 2023-09-06 00:00:00 end: 2023-10-06 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075) //////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! ///////////////////// [macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7) //_rsi_len = input(14, title="RSI length") _rsi_len = 14 NewValue = 0 PreviousValue = 0 leverage = 1 smaPercentageIncrease = 0.0 SMA_PERCENT_INCREASE = 0.0 float atrValue = 0 bool bPositionOpened = false float stockPositionSize = 0 float volatilityPercentage = 0.0 bool bDisplayArrow = false bool bEMAIsRising = false bool bSMAIsRising = false bool bSMASlowIsRising = false bool bMACDIsRising = false bool bMACDHistIsRising = false bool bMACDSignalIsRising = false float stopLoss = input (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order //positionSize = input (1000, "in $") float positionSize = 1000 float currentPrice = close float stopLossPrice = 0 float entryPrice = 0 //----------------------------------------------------------- // === INPUT BACKTEST RANGE ONE YEAR //FromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31) //FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12) //FromYear = input(defval = 2020, title = "From Year", minval = 2017) FromDay = 01 FromMonth = 01 FromYear = 2019 //ToDay = input(defval = 01, title = "To Day", minval = 1, maxval = 31) //ToMonth = input(defval = 01, title = "To Month", minval = 1, maxval = 12) //ToYear = input(defval = 2023, title = "To Year", minval = 2017) ToDay = 31 ToMonth = 12 ToYear = 2099 // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" //emaLength = input(20, "EMA Length") //smaLength = input(100, "SMA Length") //smaSlowLength = input(200, "SMA Length") emaLength = 20 smaLength = 100 smaSlowLength = 200 ema = ema(close, emaLength) sma = sma(close, smaLength) smaSlow = sma(close, smaSlowLength) plot(sma, color=color.green) plot(smaSlow, color=color.orange) plot(ema, color=color.yellow) //reload previous values stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1] entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1] bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1] positionSize := na(positionSize[1]) ? 50000 : positionSize[1] stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1] //leverage := na(leverage[1]) ? 1 : leverage[1] //ReEvaluate the direction of indicators bEMAIsRising := rising(ema, 2) bSMAIsRising := rising(sma, 3) bMACDIsRising := rising(macdLine, 3) bMACDHistIsRising := rising(macdHist, 1) bSMASlowIsRising := rising(smaSlow, 10) bMACDSignalIsRising := rising(macdSignalLine, 3) atrValue := atr(14) volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price //There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase //THIS DOES NOT WORK AT ALL!!!!! //if bSMASlowIsRising == true // //calculate the percentegage difference over the last 10 bars // smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100 // if smaPercentageIncrease < SMA_PERCENT_INCREASE // //Not enough increase we reset the flag // bSMASlowIsRising := false if (window()) //Check if we can open a LONG //sma > smaSlow and if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice) // add comparaison between macd and macd signal line //if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < currentPrice) //Enter in short position stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured. //calculate exit values stopLossPrice := currentPrice*(1-stopLoss/100) strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice)) entryPrice := currentPrice //store the entry price bPositionOpened := true bDisplayArrow := true //if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1]) or currentPrice < sma[1])) if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1]))) strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop //uncomment the below line to make the bot investing the full portfolio amount to test compounding effect. //positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage)) //reset some flags bPositionOpened := false bDisplayArrow := true entryPrice := 0.0