Chiến lược EMV biến động đơn giản

Tác giả:Tốt, Tạo: 2020-07-01 10:39:17, Cập nhật: 2023-10-28 15:26:49

img

Tóm lại

Không giống như các chỉ số kỹ thuật khác, Ease of Movement Value phản ánh sự thay đổi về giá, khối lượng và phổ biến. Đây là một công nghệ kết hợp giá và thay đổi về khối lượng. Nó đo sự thay đổi về giá của khối lượng đơn vị, tạo thành một chỉ số biến động giá. Khi thị trường thu thập được sự phổ biến và giao dịch hoạt động, nó nhắc một tín hiệu mua; khi khối lượng giao dịch thấp, và năng lượng thị trường sắp hết, nó nhắc một tín hiệu bán.

Đơn giản biến động EMV được thiết kế theo nguyên tắc biểu đồ khối lượng bằng nhau và biểu đồ nén. Khái niệm cốt lõi của nó là: giá thị trường sẽ tiêu thụ rất nhiều năng lượng chỉ khi xu hướng quay hoặc sắp quay, và hiệu suất bên ngoài là khối lượng giao dịch trở nên lớn hơn. Khi giá tăng, nó sẽ không tiêu thụ quá nhiều năng lượng do hiệu ứng thúc đẩy. Mặc dù ý tưởng này trái ngược với quan điểm rằng cả số lượng và giá tăng, nhưng nó có các tính năng độc đáo của riêng nó.

Công thức tính toán EMV

Bước 1: tính mov_mid

Trong số đó, TH đại diện cho giá cao nhất trong ngày, TL đại diện cho giá thấp nhất trong ngày, YH đại diện cho giá cao nhất trong ngày trước và YL đại diện cho giá thấp nhất trong ngày trước.

img

Bước 2: Tính tỷ lệ

Trong số đó, TVOL đại diện cho khối lượng giao dịch trong ngày, TH đại diện cho giá cao nhất trong ngày và TL đại diện cho giá thấp nhất trong ngày.

img

Bước 3: Tính toán emv

img

Sử dụng EMV

Người viết EMV tin rằng sự gia tăng lớn đi kèm với sự cạn kiệt nhanh chóng của năng lượng, và sự gia tăng thường không kéo dài quá lâu; ngược lại, khối lượng vừa phải, có thể tiết kiệm một lượng năng lượng nhất định, thường làm cho sự gia tăng kéo dài hơn. Một khi một xu hướng tăng lên được hình thành, khối lượng giao dịch ít hơn có thể đẩy giá lên, và giá trị của EMV sẽ tăng lên. Một khi thị trường xu hướng giảm được hình thành, nó thường đi kèm với sự sụt giảm vô hạn hoặc nhỏ, và giá trị của EMV sẽ giảm. Nếu giá ở một thị trường biến động hoặc giá tăng và giảm đi kèm với một khối lượng lớn, giá trị của EMV cũng sẽ gần bằng không. Vì vậy, bạn sẽ thấy rằng EMV nằm dưới trục không ở hầu hết thị trường, đây cũng là một đặc điểm chính của chỉ số này. Từ một quan điểm khác, các xu hướng EMV lớn có thể tạo ra đủ lợi nhuận và giá trị.

Việc sử dụng EMV khá đơn giản, chỉ cần xem liệu EMV vượt qua trục không. Khi EMV dưới 0, nó đại diện cho một thị trường yếu; khi EMV trên 0, nó đại diện cho một thị trường mạnh. Khi EMV thay đổi từ âm thành dương, nó nên được mua; khi EMV thay đổi từ dương thành âm, nó nên được bán. Đặc điểm của nó là nó không chỉ có thể tránh thị trường sốc trên thị trường, mà còn có thể vào thị trường đúng lúc khi thị trường xu hướng bắt đầu. Tuy nhiên, bởi vì EMV phản ánh sự thay đổi về khối lượng khi giá thay đổi, nó chỉ có ảnh hưởng đến xu hướng trung và dài hạn. Đối với chu kỳ giao dịch ngắn hạn hoặc tương đối ngắn, hiệu ứng EMVs rất kém.

Thực hiện chiến lược

Bước 1: Viết khung chiến lược

# Strategy main function
def onTick():
     pass

# Program entry
def main():
     while True: # Enter infinite loop mode
         onTick() # execution strategy main function
         Sleep(1000) # sleep for 1 second

FMZ.COMsử dụng chế độ đào tạo luân phiên.mainchức năng vàonTickchức năng.mainchức năng là chức năng đầu vào của chiến lược, và chương trình sẽ thực hiện các dòng mã từ dòngmaintrongmainchức năng, viết mộtwhilevòng lặp và lặp đi lặp lại thực hiện cáconTickTất cả các mã cốt lõi của chiến lược được viết trongonTick function.

Bước 2: Nhận dữ liệu vị trí

def get_position():
     position = 0 # The number of assigned positions is 0
     position_arr = _C(exchange.GetPosition) # Get array of positions
     if len(position_arr)> 0: # If the position array length is greater than 0
         for i in position_arr: # Traverse the array of positions
             if i['ContractType'] =='IH000': # If the position symbol is equal to the subscription symbol
                 if i['Type']% 2 == 0: # if it is long position
                     position = i['Amount'] # Assign a positive number of positions
                 else:
                     position = -i['Amount'] # Assign the number of positions to be negative
     return position # return position quantity

Bởi vì trong chiến lược này, chỉ số vị trí thời gian thực được sử dụng, để tạo điều kiện cho bảo trì,get_positionNếu vị trí hiện tại dài, nó trả về một số tích cực, và nếu vị trí hiện tại ngắn, nó trả về một số âm.

Bước 3: Nhận dữ liệu đường K

exchange.SetContractType('IH000') # Subscribe to futures variety
bars_arr = exchange.GetRecords() # Get K-line array
if len(bars_arr) <10: # If the number of K lines is less than 10
     return

Trước khi có được dữ liệu K-line cụ thể, trước tiên bạn phải đăng ký một hợp đồng giao dịch cụ thể,SetContractTypechức năng từFMZ.COMNếu bạn muốn biết thông tin khác về hợp đồng, bạn cũng có thể sử dụng một biến để nhận dữ liệu này.GetRecordschức năng để có được dữ liệu đường K, bởi vì trả về là một mảng, vì vậy chúng tôi sử dụng biếnbars_arrđể chấp nhận nó.

Bước 4: Tính toán emv

bar1 = bars_arr[-2] # Get the previous K-line data
bar2 = bars_arr[-3] # get the previous K-line data
# Calculate the value of mov_mid
mov_mid = (bar1['High'] + bar1['Low']) / 2-(bar2['High'] + bar2['Low']) / 2
if bar1['High'] != bar1['Low']: # If the dividend is not 0
     # Calculate the value of ratio
     ratio = (bar1['Volume'] / 10000) / (bar1['High']-bar1['Low'])
else:
     ratio = 0
# If the value of ratio is greater than 0
if ratio> 0:
     emv = mov_mid / ratio
else:
     emv = 0

Ở đây, chúng tôi không sử dụng giá mới nhất để tính giá trị của EMV, nhưng sử dụng đường K hiện tại tương đối chậm để phát ra tín hiệu và đặt một đường K để đưa ra lệnh. Mục đích của điều này là để làm cho backtest gần hơn với giao dịch thực. Chúng tôi biết rằng mặc dù phần mềm giao dịch định lượng hiện đã rất tiên tiến, nhưng vẫn rất khó để mô phỏng hoàn toàn môi trường tick giá thực, đặc biệt là khi phải đối mặt với backtesting dữ liệu dài cấp Bar, vì vậy phương pháp thỏa hiệp này được sử dụng.

Bước 5: Đặt lệnh

current_price = bars_arr[-1]['Close'] # latest price
position = get_position() # Get the latest position
if position> 0: # If you are holding long positions
    if emv <0: # If the current price is less than teeth
        exchange.SetDirection("closebuy") # Set the trading direction and type
        exchange.Sell(round(current_price-0.2, 2), 1) # close long position
if position <0: # If you are holding short positions
    if emv> 0: # If the current price is greater than the teeth
        exchange.SetDirection("closesell") # Set the trading direction and type
        exchange.Buy(round(current_price + 0.2, 2), 1) # close short position
if position == 0: # If there is no holding position
    if emv> 0: # If the current price is greater than the upper lip
        exchange.SetDirection("buy") # Set the trading direction and type
        exchange.Buy(round(current_price + 0.2, 2), 1) # open long position
    if emv <0: # if the current price is smaller than the chin
        exchange.SetDirection("sell") # Set the trading direction and type
        exchange.Sell(round(current_price-0.2, 2), 1) # open short position

Trước khi đặt lệnh, chúng ta cần xác định hai dữ liệu, một là giá của lệnh và một là tình trạng vị trí hiện tại. Giá đặt lệnh rất đơn giản, chỉ cần sử dụng giá đóng hiện tại để thêm hoặc trừ giá thay đổi tối thiểu của loạt.get_positionCuối cùng, vị trí được mở và đóng theo mối quan hệ vị trí giữa EMV và trục không.

Kiểm tra lại chiến lược

Cấu hình backtest

img

Lịch kiểm tra ngược

img img

Đường cong vốn

img

Chiến lược hoàn chỉnh

# Backtest configuration
'''backtest
start: 2019-01-01 00:00:00
end: 2020-01-01 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''


def get_position():
     position = 0 # The number of assigned positions is 0
     position_arr = _C(exchange.GetPosition) # Get array of positions
     if len(position_arr)> 0: # If the position array length is greater than 0
         for i in position_arr: # Traverse the array of positions
             if i['ContractType'] =='IH000': # If the position symbol is equal to the subscription symbol
                 if i['Type']% 2 == 0: # if it is long position
                     position = i['Amount'] # Assign a positive number of positions
                 else:
                     position = -i['Amount'] # Assign the number of positions to be negative
     return position # return position quantity


# Strategy main function
def onTick():
     # retrieve data
     exchange.SetContractType('IH000') # Subscribe to futures
     bars_arr = exchange.GetRecords() # Get K-line array
     if len(bars_arr) <10: # If the number of K lines is less than 10
         return

     # Calculate emv
     bar1 = bars_arr[-2] # Get the previous K-line data
     bar2 = bars_arr[-3] # get the previous K-line data
     # Calculate the value of mov_mid
     mov_mid = (bar1['High'] + bar1['Low']) / 2-(bar2['High'] + bar2['Low']) / 2
     if bar1['High'] != bar1['Low']: # If the dividend is not 0
          # Calculate the value of ratio
          ratio = (bar1['Volume'] / 10000) / (bar1['High']-bar1['Low'])
     else:
          ratio = 0
     # If the value of ratio is greater than 0
     if ratio> 0:
          emv = mov_mid / ratio
     else:
          emv = 0

     # Placing orders
     current_price = bars_arr[-1]['Close'] # latest price
     position = get_position() # Get the latest position
     if position> 0: # If you are holding long positions
          if emv <0: # If the current price is less than teeth
               exchange.SetDirection("closebuy") # Set the trading direction and type
               exchange.Sell(round(current_price-0.2, 2), 1) # close long position
     if position <0: # If you are holding short positions
          if emv> 0: # If the current price is greater than the teeth
               exchange.SetDirection("closesell") # Set the trading direction and type
               exchange.Buy(round(current_price + 0.2, 2), 1) # close short position
     if position == 0: # If there is no holding position
          if emv> 0: # If the current price is greater than the upper lip
               exchange.SetDirection("buy") # Set the trading direction and type
               exchange.Buy(round(current_price + 0.2, 2), 1) # open long position
     if emv <0: # if the current price is smaller than the chin
               exchange.SetDirection("sell") # Set the trading direction and type
               exchange.Sell(round(current_price-0.2, 2), 1) # open short position

# Program entry
def main():
     while True: # Enter infinite loop mode
         onTick() # execution strategy main function
         Sleep(1000) # sleep for 1 second

Chiến lược hoàn chỉnh đã được công bố trên quảng trường chiến lược củaFMZ.COMtrang web, và nó có thể được sử dụng bằng cách nhấp vào Copy.https://www.fmz.com/strategy/213636

Tóm lại

Thông qua quá trình nghiên cứu này, chúng ta có thể thấy rằng EMV trái ngược với các nhà giao dịch thông thường, nhưng nó không phải là không hợp lý. Bởi vì EMV giới thiệu dữ liệu khối lượng, nó hiệu quả hơn so với các chỉ số kỹ thuật khác sử dụng tính toán giá để tìm ra những gì đằng sau giá. Mỗi chiến lược có các đặc điểm khác nhau. Chỉ bằng cách hiểu đầy đủ những lợi thế và nhược điểm của các chiến lược khác nhau và loại bỏ chất thải và chiết xuất bản chất của nó, chúng ta có thể tiến xa hơn so với thành công.


Có liên quan

Thêm nữa