Strategi ini adalah strategi tren multihead otomatis sederhana berdasarkan indikator teknis yang berlaku untuk cryptocurrency seperti Bitcoin dan Ethereum, yang bertujuan untuk menangkap tren kenaikan utama dan mengurangi kerugian biaya yang disebabkan oleh transaksi yang sering terjadi.
Menggunakan MACD untuk menentukan arah tren, MACD terlihat lebih tinggi saat berpotongan ke atas;
Menghitung 20 siklus EMA, 100 siklus SMA dan 200 siklus SMA, EMA dan SMA sama naik;
EMA lebih tinggi dari SMA, dan SMA lebih tinggi dari SMA.
Setting a stop loss line, stop loss exit when price breaks the stop loss line.
Ketika harga turun, keluar dari posisi kosong saat EMA melewati SMA.
Strategi ini mengintegrasikan beberapa indikator untuk menilai tren dan waktu masuk, dan menghasilkan keuntungan dengan melacak tren kenaikan utama.
Pengukuran kombinasi multi-indikator dapat memfilter sinyal-sinyal yang salah, seperti penembusan palsu;
Berinvestasi hanya ketika tren jelas dapat mengurangi transaksi yang tidak perlu dan mengurangi frekuensi transaksi;
Strategi stop loss dapat secara efektif mengontrol kerugian maksimum dalam satu transaksi;
Data survei menunjukkan bahwa bitcoin dan ethereum dapat menghasilkan keuntungan yang lebih baik;
Strategi logisnya sederhana, jelas, mudah dipahami, dan cocok untuk pemula.
Skalabilitas yang kuat, Anda dapat memasukkan lebih banyak indikator untuk dioptimalkan.
“Saya tidak tahu apa-apa tentang itu, tapi saya pikir itu adalah salah satu yang paling penting.
Tidak ada cara tunggal untuk menghindari risiko sistemik.
Stop loss yang tidak tepat dapat menyebabkan stop loss yang berlebihan;
Data pengamatan tidak mewakili kinerja real-time, efek real-time harus diverifikasi;
Efek disk dapat bervariasi tanpa mempertimbangkan biaya transaksi.
Tidak mempertimbangkan karakteristik varietas yang berbeda, perlu disesuaikan dan dioptimalkan
Uji kombinasi parameter yang berbeda untuk mengoptimalkan parameter indikator;
Menambahkan sinyal masuk dengan penyaringan indikator seperti KDJ;
Mengoptimalkan strategi stop loss, memperkenalkan stop loss dinamis;
Mempertimbangkan pengelolaan dana akun dan menyesuaikan ukuran posisi;
Perbedaan karakteristik varietas, penyesuaian parameter;
Ini adalah salah satu dari beberapa hal yang dapat Anda lakukan untuk meningkatkan kualitas hidup Anda.
Uji coba varietas yang berbeda untuk menemukan varietas terbaik.
Strategi ini memiliki konsep yang jelas dan mudah dimengerti, menggunakan penilaian multi-indikator dapat memfilter sinyal yang salah secara efektif. Namun, masih perlu untuk mengoptimalkan parameter, kontrol risiko, dan sebagainya, kemudian digabungkan dengan verifikasi langsung, dan dapat diterapkan secara praktis. Jika optimasi diperluas lebih lanjut, dapat menjadi strategi pelacakan tren cryptocurrency yang sangat praktis.
/*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