Chiến lược này là một chiến lược xu hướng đa đầu tự động đơn giản dựa trên các chỉ số kỹ thuật, áp dụng cho các loại tiền điện tử như Bitcoin và Ethereum, nhằm mục đích nắm bắt xu hướng tăng trưởng chính và giảm tổn thất phí xử lý do giao dịch thường xuyên.
Sử dụng MACD để đánh giá xu hướng, MACD nhìn nhiều hơn khi giao nhau lên;
Tính toán 20 chu kỳ EMA, 100 chu kỳ SMA và 200 chu kỳ SMA, EMA và SMA cùng nhìn nhiều khi nâng lên;
EMA mua nhiều hơn SMA mua nhiều hơn đường SMA;
Thiết lập đường dừng lỗ, dừng lỗ khi giá giảm xuống đường dừng lỗ.
Khi giá giảm, EMA sẽ phá vỡ SMA và rút khỏi vị trí yên.
Chiến lược này kết hợp nhiều chỉ số để đánh giá xu hướng và thời gian nhập cảnh, và thu lợi nhuận bằng cách theo dõi xu hướng tăng trưởng chính.
Các nhà nghiên cứu cho rằng, việc sử dụng các công cụ này có thể giúp các nhà quản lý quản lý quản lý có thể kiểm soát được các thông tin liên quan đến các vấn đề khác nhau.
Chỉ tham gia khi có xu hướng rõ ràng có thể giảm giao dịch không cần thiết và giảm tần suất giao dịch;
Chiến lược dừng lỗ có thể kiểm soát hiệu quả tổn thất tối đa của một giao dịch;
Dữ liệu phản hồi cho thấy có thể thu được lợi nhuận tốt hơn trong Bitcoin và Ethereum;
Chiến lược logic đơn giản, rõ ràng, dễ hiểu và thích hợp cho người mới bắt đầu.
Nó có thể mở rộng, có thể giới thiệu thêm các chỉ số để tối ưu hóa.
Các nhà đầu tư cũng có xu hướng tăng giá và tăng giá trong những năm tới.
Một cách duy nhất để giữ một vị trí không thể tránh được rủi ro hệ thống;
Đặt điểm dừng không đúng có thể dẫn đến dừng quá mức;
Dữ liệu phản hồi không đại diện cho hiệu suất thực tế, hiệu quả thực tế đang được xác minh;
Không tính đến chi phí giao dịch, hiệu quả của đĩa có thể khác nhau.
Không tính đến các đặc điểm của các giống khác nhau, cần điều chỉnh tối ưu hóa.
Kiểm tra các kết hợp tham số khác nhau, tối ưu hóa các tham số chỉ số;
Thêm các chỉ số lọc tín hiệu nhập cảnh như KDJ;
Tối ưu hóa chiến lược dừng lỗ, giới thiệu dừng lỗ động;
Cân nhắc quản lý tài khoản và điều chỉnh kích thước vị thế;
Xác định đặc điểm giống, điều chỉnh tham số;
Kết hợp nhiều hơn các chỉ số thời gian;
Kiểm tra hiệu quả của các loại khác nhau để tìm ra loại tốt nhất.
Chiến lược này có ý tưởng tổng thể rõ ràng và dễ hiểu, sử dụng phán đoán đa chỉ số có thể lọc hiệu quả các tín hiệu sai. Tuy nhiên, vẫn cần tối ưu hóa thêm các tham số, kiểm soát rủi ro, v.v., sau đó kết hợp với xác minh thực tế, có thể áp dụng thực tế. Nếu mở rộng tối ưu hóa hơn nữa, nó có thể trở thành một chiến lược theo dõi xu hướng tiền điện tử rất thực tế.
/*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