
Đây là một chiến lược giao dịch trong ngày dựa trên VWMA, thực hiện hoạt động hai chiều đa luồng thông qua danh mục đầu tư hợp chất. Cốt lõi của chiến lược là chỉ số VWMA được tính lại mỗi ngày giao dịch, tạo ra tín hiệu giao dịch dựa trên vị trí tương đối của giá với VWMA và tự động thanh toán trước khi đóng cửa. Chiến lược có cơ chế kiểm soát rủi ro tốt, bao gồm quản lý vị trí và giới hạn tần suất giao dịch.
Logic cốt lõi của chiến lược này dựa trên những điểm sau:
Đây là một chiến lược giao dịch trong ngày có cấu trúc, logic nghiêm ngặt. Nó nắm bắt xu hướng ngắn hạn thông qua chỉ số VWMA, giao dịch kết hợp với danh mục quyền chọn tổng hợp, có cơ chế kiểm soát rủi ro tốt.
/*backtest
start: 2025-02-16 00:00:00
end: 2025-02-23 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy("Session VWMA Synthetic Options Strategy", overlay=true, initial_capital=100000,
default_qty_type=strategy.percent_of_equity, default_qty_value=10, pyramiding=10, calc_on_every_tick=true)
//──────────────────────────────
// Session VWMA Inputs
//──────────────────────────────
vwmaLen = input.int(55, title="VWMA Length", inline="VWMA", group="Session VWMA")
vwmaColor = input.color(color.orange, title="VWMA Color", inline="VWMA", group="Session VWMA", tooltip="VWMA resets at the start of each session (at the opening of the day).")
//──────────────────────────────
// Session VWMA Calculation Function
//──────────────────────────────
day_vwma(_start, s, l) =>
bs_nd = ta.barssince(_start)
v_len = math.max(1, bs_nd < l ? bs_nd : l)
ta.vwma(s, v_len)
//──────────────────────────────
// Determine Session Start
//──────────────────────────────
// newSession becomes true on the first bar of a new day.
newSession = ta.change(time("D")) != 0
//──────────────────────────────
// Compute Session VWMA
//──────────────────────────────
vwmaValue = day_vwma(newSession, close, vwmaLen)
plot(vwmaValue, color=vwmaColor, title="Session VWMA")
//──────────────────────────────
// Define Signal Conditions (only on transition)
//──────────────────────────────
bullCond = low > vwmaValue // Bullish: candle low above VWMA
bearCond = high < vwmaValue // Bearish: candle high below VWMA
// Trigger signal only on the bar where the condition first becomes true
bullSignal = bullCond and not bullCond[1]
bearSignal = bearCond and not bearCond[1]
//──────────────────────────────
// **Exit Condition at 15:29 IST**
//──────────────────────────────
sessionEnd = hour == 15 and minute == 29
// Exit all positions at 15:29 IST
if sessionEnd
strategy.close_all(comment="Closing all positions at session end")
//──────────────────────────────
// **Trade Control Logic**
//──────────────────────────────
var bool hasExited = true // Track if an exit has occurred since last entry
// Reset exit flag when a position is exited
if strategy.position_size == 0
hasExited := true
//──────────────────────────────
// **Position Management: Entry & Exit**
//──────────────────────────────
if newSession
hasExited := true // Allow first trade of the day
// On a bullish signal:
// • If currently short, close the short position and then enter long
// • Otherwise, add to any existing long position **only if an exit happened before**
if bullSignal and (hasExited or newSession)
if strategy.position_size < 0
strategy.close("Short", comment="Exit Short on Bull Signal")
strategy.entry("Long", strategy.long, comment="Enter Long: Buy Call & Sell Put at ATM")
else
strategy.entry("Long", strategy.long, comment="Add Long: Buy Call & Sell Put at ATM")
hasExited := false // Reset exit flag
// On a bearish signal:
// • If currently long, close the long position and then enter short
// • Otherwise, add to any existing short position **only if an exit happened before**
if bearSignal and (hasExited or newSession)
if strategy.position_size > 0
strategy.close("Long", comment="Exit Long on Bear Signal")
strategy.entry("Short", strategy.short, comment="Enter Short: Buy Put & Sell Call at ATM")
else
strategy.entry("Short", strategy.short, comment="Add Short: Buy Put & Sell Call at ATM")
hasExited := false // Reset exit flag
//──────────────────────────────
// **Updated Alert Conditions**
//──────────────────────────────
// Alerts for valid trade entries
alertcondition(bullSignal and (hasExited or newSession),
title="Long Entry Alert",
message="Bullish signal: BUY CALL & SELL PUT at ATM. Entry allowed.")
alertcondition(bearSignal and (hasExited or newSession),
title="Short Entry Alert",
message="Bearish signal: BUY PUT & SELL CALL at ATM. Entry allowed.")