Strategi ini adalah strategi tren multi-head automatik yang mudah berdasarkan petunjuk teknikal yang digunakan untuk mata wang kripto seperti Bitcoin dan Ethereum, yang bertujuan untuk menangkap trend kenaikan utama dan mengurangkan kerugian yuran yang disebabkan oleh perdagangan yang kerap.
Menggunakan MACD untuk menentukan arah trend, MACD melihat lebih banyak ketika bersilang ke atas
Hitung 20 kitaran EMA, 100 kitaran SMA dan 200 kitaran SMA, EMA dan SMA sama-sama lebih tinggi apabila naik ke atas;
EMA lebih tinggi daripada SMA, dan SMA lebih tinggi daripada SMA;
Tetapkan garis stop loss, dan berhenti apabila harga jatuh di bawah garis stop loss.
Apabila harga turun, keluar dari kedudukan rata ketika EMA menembusi SMA.
Strategi ini menggabungkan beberapa indikator untuk menilai trend dan masa masuk, dan memperoleh keuntungan dengan mengesan trend kenaikan utama.
Penghakiman gabungan pelbagai indikator dapat menyaring isyarat yang salah seperti penembusan palsu;
Memasuki pasaran hanya apabila terdapat trend yang jelas, ia dapat mengurangkan perdagangan yang tidak perlu dan mengurangkan kekerapan perdagangan;
Strategi Hentikan Kerosakan dapat mengawal kerugian maksimum dalam satu urus niaga dengan berkesan;
Data yang dikumpulkan menunjukkan bahawa terdapat keuntungan yang lebih baik dalam Bitcoin dan Ethereum.
Strategi logiknya mudah difahami, mudah diimplementasikan, sesuai untuk pelajar pemula.
Ia boleh diperluaskan dengan memasukkan lebih banyak parameter untuk pengoptimuman.
Ia juga boleh menyebabkan masalah yang lebih besar, seperti masalah yang disebabkan oleh pergerakan pasaran yang tidak menentu.
Tidak ada cara untuk mengelakkan risiko sistemik dengan hanya memegang satu pegangan.
Penetapan titik henti yang tidak betul boleh menyebabkan hentian yang berlebihan;
Data pengesanan tidak mewakili prestasi dalam talian, dan masih menunggu untuk disahkan;
Tidak mengambil kira kos urus niaga, kesannya mungkin berbeza-beza.
Tidak mengambil kira ciri-ciri pelbagai jenis, perlu menyesuaikan dan mengoptimumkan.
Uji kombinasi parameter yang berbeza untuk mengoptimumkan parameter penunjuk;
Menambah penapisan kepada isyarat masuk seperti KDJ;
Mengoptimumkan strategi henti rugi, memperkenalkan henti rugi dinamik;
Mengambil kira pengurusan dana akaun dan menyesuaikan saiz kedudukan;
Perbezaan ciri-ciri varieti, penyesuaian parameter;
Ia juga boleh digunakan untuk mengkaji dan mengkaji keadaan semasa.
Uji varieti yang berbeza untuk mencari varieti yang terbaik.
Strategi ini secara keseluruhannya mudah difahami, menggunakan penilaian pelbagai indikator dapat menyaring isyarat yang salah secara berkesan. Tetapi masih perlu mengoptimumkan parameter, kawalan risiko, dan sebagainya, kemudian digabungkan dengan pengesahan dalam talian, dapat digunakan secara praktikal. Jika pengoptimuman diperluaskan, ia boleh menjadi strategi pengesanan trend cryptocurrency yang sangat praktikal.
/*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