Tài nguyên đang được tải lên... tải...

Chiến lược giao dịch định lượng dựa trên PSAR và EMA

Tác giả:ChaoZhang, Ngày: 2024-05-28 11:00:40
Tags:PSAREMAHĐQIRC

img

Tổng quan

Chiến lược giao dịch định lượng này chủ yếu sử dụng các tín hiệu chéo của các chỉ số Parabolic SAR (PSAR) và Exponential Moving Average (EMA), kết hợp với nhiều điều kiện tùy chỉnh để tạo ra tín hiệu mua và bán. Ý tưởng chính đằng sau chiến lược là: khi PSAR vượt qua EMA từ dưới và đáp ứng một số điều kiện nhất định, một tín hiệu mua được tạo ra; khi PSAR giảm xuống dưới EMA từ trên và đáp ứng một số điều kiện nhất định, một tín hiệu bán được tạo ra. Ngoài ra, chiến lược đặt mức lợi nhuận và dừng lỗ để quản lý rủi ro.

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

  1. Tính toán chỉ số PSAR và chỉ số EMA 30 kỳ
  2. Xác định mối quan hệ chéo giữa PSAR và EMA và thiết lập các biểu tượng tương ứng
  3. Định nghĩa IGC (Ideal Green Candle) và IRC (Ideal Red Candle) dựa trên vị trí tương đối của PSAR và EMA, cũng như màu của nến
  4. Tạo tín hiệu mua và bán dựa trên sự xuất hiện của IGC và IRC
  5. Đặt mức lợi nhuận 8%, 16% và 32% trên giá mua và mức dừng lỗ 16% dưới giá mua; đặt mức lợi nhuận 8%, 16% và 32% dưới giá bán và mức dừng lỗ 16% trên giá bán
  6. Thực hiện mua, bán hoặc đóng các vị trí dựa trên phiên giao dịch và tình trạng vị trí

Ưu điểm chiến lược

  1. Kết hợp nhiều chỉ số và điều kiện để cải thiện độ tin cậy tín hiệu
  2. Thiết lập nhiều mức lợi nhuận và dừng lỗ cho quản lý rủi ro và lợi nhuận linh hoạt
  3. Thiết lập các bộ lọc cho các điều kiện mua và bán dựa trên các tình huống thị trường khác nhau, tăng khả năng thích nghi của chiến lược
  4. Mã mô-đun hóa cao, giúp dễ hiểu và sửa đổi

Rủi ro chiến lược

  1. Các thiết lập tham số của chiến lược có thể không phù hợp với tất cả các môi trường thị trường và cần phải được điều chỉnh dựa trên các điều kiện thực tế
  2. Trong thị trường hỗn loạn, chiến lược có thể tạo ra các tín hiệu giao dịch thường xuyên, dẫn đến chi phí giao dịch tăng
  3. Chiến lược thiếu phán đoán về xu hướng thị trường và có thể bỏ lỡ cơ hội trong các thị trường có xu hướng mạnh
  4. Các thiết lập dừng lỗ có thể không hoàn toàn tránh được rủi ro do điều kiện thị trường cực đoan

Hướng dẫn tối ưu hóa chiến lược

  1. Đưa ra nhiều chỉ số kỹ thuật hoặc chỉ số tâm lý thị trường để cải thiện độ chính xác và độ tin cậy của tín hiệu
  2. Tối ưu hóa các thiết lập mức lợi nhuận và dừng lỗ, xem xét việc thực hiện lợi nhuận / dừng lỗ động hoặc lợi nhuận / dừng lỗ dựa trên biến động
  3. Thiết lập các tham số và quy tắc giao dịch khác nhau cho các trạng thái thị trường khác nhau để tăng khả năng thích nghi của chiến lược
  4. Kết hợp một mô-đun quản lý tiền để điều chỉnh động các vị trí và rủi ro dựa trên các yếu tố như tỷ lệ vốn chủ sở hữu tài khoản và số dư

Tóm lại

Chiến lược giao dịch định lượng này dựa trên các chỉ số PSAR và EMA, tạo ra tín hiệu mua và bán thông qua nhiều điều kiện và quy tắc tùy chỉnh. Chiến lược có một mức độ thích nghi và linh hoạt nhất định trong khi cũng thiết lập mức lợi nhuận và dừng lỗ để quản lý rủi ro. Tuy nhiên, vẫn còn chỗ để tối ưu hóa về cài đặt tham số và kiểm soát rủi ro. Nhìn chung, chiến lược này có thể phục vụ như một mẫu cơ bản, và với việc tối ưu hóa và cải tiến hơn nữa, nó có tiềm năng trở thành một chiến lược giao dịch mạnh mẽ.


/*backtest
start: 2024-04-01 00:00:00
end: 2024-04-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SwapnilRaykar

//@version=5
strategy("aj sir second project", overlay=true, margin_long=100, margin_short=100)

start=input("0915-1515","session time")
st11=time(timeframe.period,start)
st=st11>0
et= not st 

psar=ta.sar(0.02,0.02,0.2)
emared=ta.ema(close,30)
//plot(psar,"psar",color.yellow,style = plot.style_cross)
//plot(emared,"emared",color.red)
var crodownflag=0
var croupflag=0

var igcflag=0

var ircflag=0

cdown1=ta.crossunder(psar,emared)  and not (psar<close and psar[1]>close[1])
cup1=ta.crossover(psar,emared) and not (psar>close and psar[1]<close[1])

cdown=ta.crossunder(psar,emared) 
cup=ta.crossover(psar,emared)


green_candle=close>open
red_candle=close<open

if ta.crossunder(psar,emared) and crodownflag==0  and not (psar<close and psar[1]>close[1])
    crodownflag:=1
else if cdown and crodownflag==1
    crodownflag:=0



if crodownflag==1 and green_candle and igcflag==0
    igcflag:=1
else if cdown and igcflag==1
    igcflag:=0

//plot(igcflag,"igcflag",color.lime)

if ta.crossover(psar,emared) and croupflag==0 and not (psar>close and psar[1]<close[1])
    croupflag:=1
else if cdown and croupflag==1
    croupflag:=0

//plot(crodownflag,"crodownflag",color.white)
irc_cond=croupflag==1 or cup

if (croupflag==1 and red_candle and ircflag==0)
    ircflag:=1
else if cup and croupflag==1
    ircflag:=0

igc_candle1=(igcflag==1 and igcflag[1]==0) or (cdown1 and green_candle)
irc_candle1=(ircflag==1 and ircflag[1]==0) or (cup1 and red_candle)
///////////////////////////
dm=dayofmonth(time)
newday=dm!=dm[1]
dmc=dm==ta.valuewhen(bar_index==last_bar_index,dm,0)

///////////////////////////////////////////
var irc_there=0

if irc_candle1[1] and irc_there==0
    irc_there:=1
else if cdown and irc_there==1
    irc_there:=0

irc_candle=irc_candle1 and irc_there==0// and dmc

var igc_there=0

if igc_candle1[1] and igc_there==0
    igc_there:=1
else if cup and igc_there ==1
    igc_there:=0

igc_candle=igc_candle1 and igc_there==0// and dmc
/////////// to get rid of irc being valid even after crossdown
var valid_igc_low=0
var valid_irc_high=0

if irc_candle[1] and valid_irc_high==0
    valid_irc_high:=1
else if igc_candle and valid_irc_high==1
    valid_irc_high:=0

if igc_candle and valid_igc_low==0
    valid_igc_low:=1
else if irc_candle and valid_igc_low==1
    valid_igc_low:=0


igc_low=ta.valuewhen(igc_candle,low,0)
irc_high=ta.valuewhen(irc_candle,high,0)
//////////////////////////////
//plot(irc_high,"irc_high",color.red)

//plot(valid_irc_high,"valid_irc_high",color.purple)

buy12=ta.crossunder(close,igc_low) and valid_igc_low==1
buy1=buy12[1]

short12=ta.crossover(close,irc_high) and valid_irc_high==1
short1=short12[1]
//plotshape(short12,"short12",shape.arrowdown,color=color.purple)

// plotshape(igc_candle,"igc_candle",shape.arrowdown,color=color.green)
// plotshape(irc_candle,"irc_candle",shape.arrowdown,color=color.red)
//plotshape((psar<close and psar[1]>close[1]) ,"croup",shape.arrowdown,color=color.red)
//plotshape(cup ,"croup",shape.arrowdown,color=color.orange)

buyprice=ta.valuewhen(buy1 and strategy.position_size[1]==0,open,0)
shortprice=ta.valuewhen(short1 and strategy.position_size[1]==0,open,0)

btarget1=buyprice+(buyprice*0.08)
btarget2=buyprice+(buyprice*0.16)
btarget3=buyprice+(buyprice*0.32)
bstoploss=buyprice-(buyprice*0.16)

starget1=shortprice-(shortprice*0.08)
starget2=shortprice-(shortprice*0.16)
starget3=shortprice-(shortprice*0.32)
sstoploss=shortprice+(shortprice*0.16)

if buy12 and strategy.position_size==0 and st11
    strategy.entry("buy",strategy.long)

if strategy.position_size >0
    strategy.exit("sell",from_entry = "buy",stop=bstoploss,limit=btarget3)

if short12 and strategy.position_size==0 and st11
    strategy.entry("short",strategy.short)

if strategy.position_size<0
    strategy.exit("cover",from_entry = "short",stop = sstoploss,limit = starget3)

if et
    strategy.close_all(comment = "timeover")

plot(strategy.position_size>0?buyprice:na,"buyprice",color.white, style=plot.style_circles )
plot(strategy.position_size>0?bstoploss:na,"bstoploss",color.red, style=plot.style_circles )
plot(strategy.position_size>0?btarget1:na,"btarget1",color.green, style=plot.style_circles )
plot(strategy.position_size>0?btarget2:na,"btarget2",color.green, style=plot.style_circles )
plot(strategy.position_size>0?btarget3:na,"btarget3",color.green, style=plot.style_circles )

plot(strategy.position_size<0?shortprice:na,"shortprice",color.white, style=plot.style_circles )
plot(strategy.position_size<0?sstoploss:na,"sstoploss",color.red, style=plot.style_circles )
plot(strategy.position_size<0?starget1:na,"starget1",color.green, style=plot.style_circles )
plot(strategy.position_size<0?starget2:na,"starget2",color.green, style=plot.style_circles )
plot(strategy.position_size<0?starget3:na,"starget3",color.green, style=plot.style_circles )


Có liên quan

Thêm nữa