Chiến lược giao dịch trong ngày đột phá đóng cửa


Ngày tạo: 2023-10-09 16:56:21 sửa đổi lần cuối: 2023-10-09 16:56:21
sao chép: 0 Số nhấp chuột: 641
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này là một chiến lược giao dịch trong ngày đơn giản dựa trên đường trung bình di chuyển, áp dụng cho biểu đồ chu kỳ 1 giờ của GBPUSD. Nó chỉ nhập vào khi mở cửa ở Luân Đôn và thoát ra khi đóng cửa ở Luân Đôn, rất phù hợp cho giao dịch phá vỡ xu hướng trong thời gian ở Luân Đôn.

Nguyên tắc chiến lược

Chiến lược này sử dụng hai đường trung bình di chuyển, một đường trung bình cực nhanh và một đường trung bình cực chậm.

  1. Chỉ khi mở cửa tại London (khoảng 8 giờ) thì phá vỡ vào sân. Cách đánh giá là giá đóng cửa hoặc giá cao nhất phá vỡ đường trung bình nhanh có thể làm nhiều hơn, giá đóng cửa hoặc giá thấp nhất phá vỡ đường trung bình nhanh có thể làm trống.

  2. Đồng thời, yêu cầu giá đóng cửa của đường K trước cao hơn đường trung bình chậm để làm nhiều hơn, thấp hơn đường trung bình chậm để làm trống, để lọc các trường hợp không có xu hướng.

  3. Cài đặt Stop Loss là tối thiểu, chỉ 50-100 điểm.

  4. Không đặt trạm dừng, không có điều kiện rời khỏi sân khi London kết thúc (15 giờ).

Phân tích lợi thế

Đây là một chiến lược đột phá rất đơn giản, nhưng có những lợi thế sau:

  1. Chỉ tham gia vào khi xu hướng rõ ràng, tránh rủi ro của thị trường rung chuyển.

  2. Các nhà đầu tư của Nhật Bản đã có những đợt giao dịch đột phá chỉ trong giờ London, tận dụng tối đa tính năng biến động của thời gian này.

  3. Các nhà nghiên cứu cho rằng, các hệ thống này có thể chịu được một số phản xạ.

  4. Không có điều kiện rời khỏi sân, tránh nguy cơ qua đêm.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Có thể không có giao dịch trong một thời gian dài nếu không có xu hướng rõ ràng về thời gian ở Luân Đôn.

  2. Rủi ro bị dừng do lỗ hổng nhỏ. Có thể có một mức độ phản hồi sau khi phá vỡ gây ra thiệt hại.

  3. Rủi ro thoát sớm do thời gian thoát cố định. Có thể cần kéo dài thời gian giữ vị trí khi có xu hướng mạnh.

Các biện pháp đối phó có thể là nới lỏng thích hợp các quy tắc nhập cảnh, sử dụng dừng di chuyển để khóa lợi nhuận và điều chỉnh thời gian xuất cảnh phù hợp với tình hình thị trường.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Thêm các bộ lọc cho các chỉ số khác như RSI, BRI, v.v. để tránh thị trường chấn động hơn nữa.

  2. Tối ưu hóa kết hợp đường trung bình di động, kiểm tra hiệu quả đường trung bình của các tham số khác nhau

  3. Kiểm tra các điểm dừng khác nhau để tìm ra phạm vi dừng tối ưu.

  4. Thời gian khởi hành được điều chỉnh theo thời gian thực, thay vì cố định khi kết thúc trận đấu.

  5. Kiểm tra hiệu quả của các cặp tiền tệ khác và các chu kỳ thời gian khác.

  6. Thêm các mô-đun kiểm soát rủi ro, chẳng hạn như quản lý tiền, tính toán kích thước giao dịch.

Tóm tắt

Chiến lược này nói chung là một chiến lược phá vỡ thời gian London rất đơn giản và thực tế. Điều tốt là các quy tắc đơn giản và rõ ràng, một số rủi ro giao dịch có thể được tránh bằng cách sử dụng các đặc điểm thời gian một cách hợp lý. Ngoài ra, có một số không gian tối ưu hóa, nếu tiếp tục tối ưu hóa thử nghiệm, có thể làm tăng thêm sự ổn định và lợi nhuận của chiến lược.

Mã nguồn chiến lược
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// strategy(title="2 ma breakout",shorttitle="2 ma breakout", initial_capital=10000,overlay=true, commission_type = strategy.commission.cash_per_contract, commission_value = 0.00008 )
timeinrange(res, sess) => time(res, sess) != 0

//Change false to false = You have to turn on, won't show up by default
//****Always use lowercase letters

doNYOpen = input(defval=false, type = input.bool, title="NY Open On")
doNYSession = input(defval=false, type = input.bool, title="NY Session On")
doNYClose = input(defval=false, type = input.bool, title="NY Close On")

doAussieOpen = input(defval=false, type = input.bool, title="Aussie Open On")
doAussieSession = input(defval=false, type = input.bool, title="Aussie Session On")
doAussieClose = input(defval=false, type = input.bool, title="Aussie Close On")

doAsiaOpen = input(defval=false, type = input.bool, title="Asia Open On")
doAsiaSession = input(defval=false, type = input.bool, title="Asia Session On")
doAsiaClose = input(defval=false, type = input.bool, title="Asia Close On")

doEurOpen = input(defval=true, type = input.bool, title="Euro Open On")
doEurSession = input(defval=true, type = input.bool, title="Euro Session On")
doEurClose = input(defval=true, type = input.bool, title="Euro Close On")

//You can copy and paste these colors. white - silver - gray - maroon - red - purple - fuchsia - green - lime
//   olive - yellow - navy - blue - teal - aqua - orange 

nySessionStart = color.olive
nySession = color.olive
nySessionEnd = color.olive
asiaSessionStart = color.blue
asiaSession = color.blue
asiaSessionEnd = color.blue
europeSessionStart = color.red
europeSession = color.red
europeSessionEnd = color.red
colorwhite = color.white

//****Note ---- Use Military Times --- So 3:00PM = 1500


bgcolor(doAsiaSession and timeinrange(timeframe.period, "1800-0400") ? asiaSession : na, transp=75)
//bgcolor(timeinrange(timeframe.period, "0000-0300") ? color.white  : na, transp=75)
bgcolor(doEurSession and timeinrange(timeframe.period, "0300-1100") ? europeSession : na, transp=75)
bgcolor(doNYSession and timeinrange(timeframe.period, "0800-1600") ? nySession : na, transp=75)

active = input(true, title="Show On Chart")
pricehigh = security(syminfo.tickerid, '60', high[0])
pricelow = security(syminfo.tickerid, '60', low[0])
//Daily Plots
offs_daily = 0 
hiHighs = 0
loLows = 0
//plot(timeinrange(timeframe.period, "0000-0300") and pricehigh ? pricehigh  : na, title="Previous Daily High", style=plot.style_line, linewidth=2, color=color.gray)
//plot(timeinrange(timeframe.period, "0000-0300") and pricelow ? pricelow : na, title="Previous Daily Low", style=plot.style_linebr, linewidth=2, color=color.gray)

if(timeinrange(timeframe.period, "0000-0300"))
    hiHighs = highest(high, 3)
    loLows = lowest(low, 3)
    

// From Date Inputs
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 = 2020, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true


len = input(2)
src = input(close, title="Source")
out = sma(src, len)

lena = input(200, minval=1, title="Length slow")
srca = input(close, title="Source")
outa = ema(srca, lena)

//tp = input(100, title="tp")
sl = input(66, title="sl")
// if(smabool)
//     out := sma(src, len)
// else if(emabool)
//     out := ema(src, len)
// else if(hmabool)
//     out := hma(src, len)
// else if(vmabool)
//     out := wma(src, len)  
// else if(vwmabool)
//     out := vwma(src, len)   
// else if(smmabool)
//     out := sma(src, len)  
 
plot(out, color=color.white, title="MA")
plot(outa, color=color.white, title="MA")

longC = timeinrange(timeframe.period, "0300-0400") and (crossover(close,out) or crossover(high,out)) and close[1] > outa and time_cond
shortC = timeinrange(timeframe.period, "0300-0400") and (crossunder(close,out) or crossunder(low,out)) and close[1] < outa and time_cond



//inputlondon = input(false, title="london session")
//inputny = input(false, title="new york session")

//if(inputlondon==true)

strategy.initial_capital = 50000

//MONEY MANAGEMENT--------------------------------------------------------------
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit          //floating profit/loss
risk = input(1,type=input.float,title="Risk % of equity ")/100           //risk % per trade

temp01 = balance * risk     //Risk in USD
temp02 = temp01/sl        //Risk in lots
temp03 = temp02*100      //Convert to contracts
size = temp03 - temp03%1 //Normalize to 1000s (Trade size)
if(size < 1)
    size := 1         //Set min. lot size


strategy.entry("long",1,when=longC)
//strategy.close("long", when = crossunder(close,out) or not (timeinrange(timeframe.period, "0300-1000")))
strategy.close("long", when =  not (timeinrange(timeframe.period, "0300-0945")))
strategy.exit("x_long","long", loss = sl)
     
    
strategy.entry("short",0,when=shortC)
//strategy.close("short",when = crossover(close,out) or not (timeinrange(timeframe.period, "0300-1000")))
strategy.close("short",when = not (timeinrange(timeframe.period, "0300-0945")))

strategy.exit("x_short","short", loss = sl)

//strategy.exit("closelong", "RSI_BB_LONG" , profit = close * 0.01 / syminfo.mintick, loss = close * 0.01 / syminfo.mintick, alert_message = "closelong")
//strategy.exit("closeshort", "RSI_BB_SHORT" , profit = close * 0.01 / syminfo.mintick, loss = close * 0.01 / syminfo.mintick, alert_message = "closeshort")