
Chiến lược này là một chiến lược theo dõi xu hướng trung bình di chuyển đơn giản dành cho Bitcoin và Ethereum. Nó kết hợp nhiều chỉ số như đường trung bình, MACD và RSI để xác định hướng xu hướng và theo dõi xu hướng bằng cách giữ các vị trí cố định.
Lý luận cốt lõi của chiến lược là khi đường EMA ngày 20 vượt qua đường SMA ngày 100 và đường SMA ngày 100 vượt qua đường SMA ngày 200; khi đường EMA ngày 20 vượt qua đường SMA ngày 100 dưới đường EMA. Đó là sử dụng đường trung bình di chuyển của ba kỳ hạn khác nhau để xác định hướng xu hướng.
Cụ thể, chiến lược đánh giá xu hướng bằng cách tính các giá trị của đường EMA 20, đường SMA 100 và đường SMA 200 và so sánh mối quan hệ kích thước của chúng. Khi đường EMA 20 đi qua đường SMA 100 ngày, tức là đường EMA 20 ngày lớn hơn đường SMA 100 ngày, thì giá bắt đầu tăng; và nếu đường SMA 100 ngày cũng lớn hơn đường SMA 200 ngày, thì xu hướng trung và dài hạn cũng đang tăng, đó là một tín hiệu đa mạnh hơn.
Sau khi tham gia vào nhiều vị trí, chiến lược sẽ giữ vị trí và theo xu hướng. Khi đường EMA ngày 20 đi xuống đường SMA ngày 100, cho thấy tín hiệu đảo ngược xu hướng ngắn hạn, chiến lược sẽ chọn dừng lỗ.
Ngoài ra, chiến lược cũng kết hợp các chỉ số như MACD và RSI để xác nhận xu hướng. Chỉ khi đường DIF, đường DEMA và đường HIST của MACD đều tăng lên, và đường RSI cao hơn 50, bạn sẽ chọn đặt nhiều hơn.
Ưu điểm lớn nhất của chiến lược này là tạo ra các quy tắc giao dịch xu hướng rõ ràng, có thể theo dõi hiệu quả xu hướng đường dài. Các ưu điểm cụ thể như sau:
Chiến lược này cũng có một số rủi ro, vấn đề chính là không thể dừng lại kịp thời khi xu hướng đảo ngược. Các rủi ro cụ thể và giải pháp sau đây:
Không thể theo dõi đúng thời gian đến điểm đảo ngược xu hướng: có thể rút ngắn chu kỳ trung bình, hoặc thêm nhiều chỉ số để đánh giá tổng hợp.
Giữ vị trí quá lâu có thể gây ra tổn thất lớn: có thể rút ngắn đường xuất phát một cách thích hợp và dừng lỗ kịp thời.
Chỉ số đường trung bình dễ bị trì trệ: có thể thêm đường dừng với tỷ lệ rút ra nhất định, dừng chủ động.
Chiến lược này cũng có thể được tối ưu hóa theo các khía cạnh sau:
Kiểm tra các kết hợp của các vòng tròn trung bình để tìm các tham số tối ưu.
Thử các chỉ số hoặc mô hình khác để đánh giá xu hướng và thời gian nhập cảnh.
Sử dụng các tham số tối ưu hóa động theo cách học máy. Ví dụ: điều chỉnh độ dừng bằng cách học tăng cường.
Kết hợp với chỉ số khối lượng giao dịch để tránh phá vỡ giả. Ví dụ: chỉ số dòng năng lượng, khối lượng giao dịch, v.v.
Phát triển hệ thống dừng tự động và theo dõi dừng, có thể điều chỉnh vị trí dừng tùy theo tình hình thị trường.
Chiến lược tổng thể là một chiến lược theo dõi xu hướng đơn giản và trực tiếp. Nó sử dụng đường trung bình di chuyển để xác định hướng xu hướng, MACD và RSI để lọc tín hiệu. Sử dụng thời gian giữ dài để theo dõi xu hướng.
/*backtest
start: 2024-01-16 00:00:00
end: 2024-01-17 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="BTC_Long_Only_TV01_200507", overlay=true)
//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////
//280820 - After long esting this is the best script for ETHUSD in 4 hours. From 01/01/2020 til 28/08/2020
[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 (5, "StopLoss in %", type=input.float) //StopLoss associated with the order
//Best for alt versus BTC float stopLoss = input (3, "StopLoss in %", type=input.float) //StopLoss associated with the order
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 = 2020
//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 = 14
ToMonth = 05
ToYear = 2029
// === 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"
//FUNCTION DEFINITIONS
//----------------------
IsRising(data, loopBack) =>
bIsRising = true
for n = 1 to loopBack
if data[n] > data[n-1]
bIsRising := false
continue
bIsRising
IsFalling(data, loopBack) =>
bIsFalling = true
for n = 1 to loopBack
if data[n] < data[n-1]
bIsFalling := false
continue
bIsFalling
// END OF FUNCTION DEFINITIONS //
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]) ? 1000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
bEMAIsRising := IsRising(ema, 2)
bSMAIsRising := IsRising(sma, 3)
bMACDIsRising := IsRising(macdLine, 3)
bMACDHistIsRising := IsRising(macdHist, 1)
bSMASlowIsRising := IsRising(smaSlow, 10)
bMACDSignalIsRising := IsRising(macdSignalLine, 3)
atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price
if (window())
//Check if we can open a LONG
if (bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < 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])))
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