Chiến lược Martingale với phạm vi trung bình động mở rộng cho giao dịch chứng khoán

Tác giả:ChaoZhang, Ngày: 2023-11-02 17:16:08
Tags:

img

Tổng quan

Chiến lược này xác định xu hướng bằng cách mở rộng khoảng cách giữa các đường trung bình động. Khi một xu hướng tăng được xác định, nó dần dần xây dựng các vị trí dài để kiếm lợi nhuận từ xu hướng. Đồng thời, các điểm dừng lỗ được thiết lập để kiểm soát rủi ro.

Chiến lược logic

  1. Đặt hai đường trung bình động, EMA1 và EMA2, với các khoảng thời gian hơi khác nhau, ví dụ 55 và 89.

  2. Khi giá vượt trên MAs, nó báo hiệu xu hướng tăng.

  3. Sau khi có một vị trí, tiếp tục kim tự tháp khi giá tiếp tục tăng.

  4. Thiết lập điểm dừng lỗ dưới mức MA. Khi giá giảm xuống dưới mức MA, đóng giao dịch dài để dừng lỗ.

  5. Điều này cho phép các vị trí kim tự tháp kiếm lợi nhuận từ xu hướng, trong khi đặt mức dừng lỗ để kiểm soát rủi ro.

Phân tích lợi thế

  1. Phạm vi MA rộng hơn giúp xác định rõ xu hướng.

  2. Định hình kim tự tháp tạo ra lợi nhuận cao hơn từ xu hướng.

  3. Stop loss động lấy lợi nhuận từ xu hướng trong khi hạn chế lỗ.

  4. Thích hợp cho giao dịch xu hướng dài hạn.

Phân tích rủi ro

  1. Xu hướng phải được xác định chính xác, nếu không thua lỗ sẽ tăng nhanh hơn.

  2. Đánh kim tự tháp phải được kiểm soát để tránh rủi ro gọi ký quỹ.

  3. Stop loss phải được thiết lập hợp lý, quá rộng có thể mở rộng tổn thất, quá chặt có thể gây ra whipsaws.

  4. Liquidity phải được xem xét, tài sản thanh khoản thấp là không phù hợp.

Các đề xuất tối ưu hóa

  1. Thêm thêm các chỉ số như RSI, KD để xác nhận xu hướng và tránh đột phá sai.

  2. Tối ưu hóa thời gian MA dựa trên đặc điểm tài sản để tìm kết hợp tốt nhất.

  3. Nghiên cứu các mô hình kim tự tháp tối ưu để kiểm soát rủi ro kích thước vị trí.

  4. Hãy xem xét lợi nhuận một phần để khóa lợi nhuận và giảm rút tiền.

  5. Thiết lập stop loss dựa trên biến động tài sản để cân bằng bảo vệ và tránh whipsaws.

Tóm lại

Chiến lược này xác định các xu hướng với phạm vi MA rộng hơn, các vị trí kim tự tháp để kiếm lợi nhuận từ xu hướng và thiết lập một lệnh dừng lỗ nổi để kiểm soát rủi ro. Nó có thể đạt được lợi nhuận tốt trong xu hướng, nhưng cần tối ưu hóa thêm các tín hiệu nhập cảnh, kim tự tháp, lệnh dừng lỗ v.v. để trở nên mạnh mẽ hơn trên các tài sản khác nhau.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy(title='Super Simple Martingale Buying', shorttitle="Martingale v5",overlay=true, pyramiding = 10, initial_capital=1, calc_on_order_fills = true)


// Revision:        1
// Author:          @ToS_MavericK

// === INPUT SMA ===
EMA1  = input(55)
EMA2  = input(89)

Amount  = input(defval = 6, type = float, title = "Max open Orders", minval = 1, step = 1)
Multiplier  = input(defval = 2  , type = float, title = "Multiplier", minval = 1, step = 0.1)
BuyLvl  = input(defval = 1, type = float, title = "BuyLvl", minval = 0, step = 0.1)
Profit  = input(3)
DoubleUpLimit    = input(2)

// === INPUT BACKTEST RANGE ===
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth   = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear    = input(defval = 2019, title = "From Year", minval = 2012)
ToDay   = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear  = input(defval = 2020, title = "To Year", minval = 2012)

RSIFilter = input(false)
minRSI  = input(defval = 35,  title = "RSI", minval = 1, step = 1)
lengthRSI = input(14, minval=1)
src = input(close, title="RSI Source")

StochRSIFilter = input(false)
lengthStoch = input(14, minval=1)
smoothK = input(3, minval=1)
smoothD = input(3, minval=1)

rsi = rsi(src, lengthRSI)
k = sma(stoch(rsi, rsi, rsi, lengthStoch), smoothK)
d = sma(k, smoothD)

// === 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"

// === SERIES SETUP ===
vEMA1 = ema(close, EMA1)
vEMA2 = ema(close, EMA2)

buy  =  (rsi < minRSI or RSIFilter == false) and ((crossover(k,d) and k < 20) or StochRSIFilter == false) and ((close < vEMA1 * (1 - BuyLvl/100) and vEMA1 < vEMA2) or (close < vEMA2 * (1 - BuyLvl/100) and vEMA2 < vEMA1))

BuyPrice = strategy.position_avg_price * (1 - DoubleUpLimit/50)
SellPrice = strategy.position_avg_price * (1 + Profit/(100*strategy.opentrades))

// Exit first, due to the limit orders, which can be hit on the same bar
strategy.exit("EMA1", limit = SellPrice, when = window() and strategy.opentrades > 0)
strategy.close("EMA1",when = time > finish) // close positions at the end of the specified time period

// Normal entry
strategy.entry("EMA1", strategy.long,qty = strategy.equity/ (close * pow(2,Amount - 1)), when = window() and strategy.opentrades == 0 and buy)
// Martingale
strategy.entry("EMA1", strategy.long,qty = strategy.position_size, limit = strategy.position_avg_price * (1 - DoubleUpLimit/100), when = window() and strategy.opentrades == 1)
strategy.entry("EMA1", strategy.long,qty = strategy.position_size, limit = BuyPrice, when = window() and strategy.opentrades > 1 and strategy.opentrades < Amount)

plot(vEMA1, title = 'EMA1', color = orange, linewidth = 2, style = line)
plot(vEMA2, title = 'EMA2', color = yellow, linewidth = 2, style = line)
plot(BuyPrice[1], title = 'BuyPrice', color = red, linewidth = 2, style = line)
plot(SellPrice[1], title = 'SellPrice', color = green, linewidth = 2, style = line)

Thêm nữa