
Chiến lược giao chéo tuyến tính đa luồng là một chiến lược phân tích kỹ thuật dựa trên mô hình hồi quy tuyến tính để dự đoán biến động giá tương lai của cổ phiếu. Nguyên tắc cơ bản của chiến lược là: biến động giá cổ phiếu thường tuân theo xu hướng tuyến tính nhất định, và có thể dự đoán giá tương lai bằng cách tính toán hồi quy tuyến tính của giá.
Chiến lược này đầu tiên tính toán sự hồi phục tuyến tính của giá cổ phiếu trong một khoảng thời gian. Sự hồi phục tuyến tính sử dụng phép nhân đôi nhỏ nhất để tạo ra một đường thẳng đại diện cho xu hướng thay đổi giá theo thời gian. Chiến lược sau đó vẽ đường giá dự đoán và giá hiện tại trên biểu đồ.
Chính sách này xác định hai tín hiệu:
Khi có tín hiệu nhiều, chiến lược mở thêm; khi có tín hiệu ngắn, giảm.
Các bước quan trọng của chiến lược là:
Chiến lược giao chéo đa không gian có những ưu điểm sau:
Mặc dù có nhiều ưu điểm, chiến lược giao chéo đa không tuyến cũng có một số rủi ro:
Chiến lược chéo đa luồng dựa trên sự hồi quy tuyến tính của giá, tạo ra tín hiệu giao dịch bằng cách so sánh giá dự đoán với giá hiện tại. Lập luận của chiến lược đơn giản và rõ ràng, có thể nắm bắt xu hướng tuyến tính của giá, phù hợp với mọi tình huống. Đồng thời, chiến lược dễ thực hiện và tối ưu hóa, có thể điều chỉnh các tham số một cách linh hoạt, kết hợp với các chỉ số khác, thêm mô-đun kiểm soát rủi ro, v.v., liên tục cải thiện hiệu suất của chiến lược.
/*backtest
start: 2024-02-25 00:00:00
end: 2024-03-26 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © stocktechbot
//@version=5
strategy("Linear Cross", overlay=true, margin_long=100, margin_short=0)
//Linear Regression
vol = volume
// Function to calculate linear regression
linregs(y, x, len) =>
ybar = math.sum(y, len)/len
xbar = math.sum(x, len)/len
b = math.sum((x - xbar)*(y - ybar),len)/math.sum((x - xbar)*(x - xbar),len)
a = ybar - b*xbar
[a, b]
// Historical stock price data
price = close
// Length of linear regression
len = input(defval = 21, title = 'Strategy Length')
linearlen=input(defval = 9, title = 'Linear Lookback')
[a, b] = linregs(price, vol, len)
// Calculate linear regression for stock price based on volume
//eps = request.earnings(syminfo.ticker, earnings.actual)
//MA For double confirmation
out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
outthree = ta.sma(close, 9)
// Predicted stock price based on volume
predicted_price = a + b*vol
// Check if predicted price is between open and close
is_between = open < predicted_price and predicted_price < close
//MACD
//[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)
// Plot predicted stock price
plot(predicted_price, color=color.rgb(65, 59, 150), linewidth=2, title="Predicted Price")
plot(ta.sma(predicted_price,linearlen), color=color.rgb(199, 43, 64), linewidth=2, title="MA Predicted Price")
//offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
plot(out, color=color.blue, title="MA200")
[macdLine, signalLine, histLine] = ta.macd(predicted_price, 12, 26, 9)
//BUY Signal
longCondition=false
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
twohunraise = ta.rising(out, 2)
twentyrise = ta.rising(outt, 2)
macdrise = ta.rising(macdLine,2)
macdlong = ta.crossover(predicted_price, ta.wma(predicted_price,linearlen)) and (signalLine < macdLine)
if macdlong and macdrise
longCondition := true
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
//Sell Signal
lastEntryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1)
daysSinceEntry = len
daysSinceEntry := int((time - strategy.opentrades.entry_time(strategy.opentrades - 1)) / (24 * 60 * 60 * 1000))
percentageChange = (close - lastEntryPrice) / lastEntryPrice * 100
//trailChange = (ta.highest(close,daysSinceEntry) - close) / close * 100
//label.new(bar_index, high, color=color.black, textcolor=color.white,text=str.tostring(int(trailChange)))
shortCondition=false
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
shortmafall = ta.falling(outthree, 1)
macdfall = ta.falling(macdLine,1)
macdsell = macdLine < signalLine
if macdfall and macdsell and (macdLine < signalLine) and ta.falling(low,2)
shortCondition := true
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)