Tidak seperti penunjuk teknikal lain,
EMV volatiliti mudah direka mengikut prinsip carta jumlah yang sama dan carta terdesak. Konsep utamanya adalah: harga pasaran akan menggunakan banyak tenaga hanya apabila trend bertukar atau akan bertukar, dan prestasi luaran adalah bahawa jumlah dagangan menjadi lebih besar. Apabila harga meningkat, ia tidak akan menggunakan terlalu banyak tenaga kerana kesan pendorong. Walaupun idea ini bertentangan dengan pandangan bahawa kedua-dua kuantiti dan kenaikan harga, ia mempunyai ciri-ciri uniknya sendiri.
Langkah 1: Hitung mov_mid
Di antara mereka, TH mewakili harga tertinggi hari itu, TL mewakili harga terendah hari itu, YH mewakili harga tertinggi hari sebelumnya, dan YL mewakili harga terendah hari sebelumnya.
Langkah 2: Hitung nisbah
Di antara mereka, TVOL mewakili jumlah dagangan pada hari itu, TH mewakili harga tertinggi pada hari itu, dan TL mewakili harga terendah pada hari itu.
Langkah 3: Hitung emv
Penulis EMV percaya bahawa kenaikan besar disertai dengan keletihan tenaga yang cepat, dan kenaikan sering tidak berlangsung terlalu lama; sebaliknya, jumlah sederhana, yang dapat menjimatkan sejumlah tenaga, sering membuat kenaikan berlangsung lebih lama. Sebaik sahaja trend menaik terbentuk, jumlah perdagangan yang kurang dapat mendorong harga naik, dan nilai EMV akan meningkat. Sebaik sahaja pasaran penurunan terbentuk, ia sering disertai dengan penurunan yang tidak berkesudahan atau kecil, dan nilai EMV akan menurun. Jika harga berada di pasaran yang tidak menentu atau harga naik dan turun disertai dengan jumlah yang besar, nilai EMV juga akan hampir sifar. Jadi anda akan mendapati bahawa EMV berada di bawah paksi sifar di kebanyakan pasaran, yang juga merupakan ciri utama penunjuk ini. Dari perspektif lain, nilai-nilai EMV mega-trend dan dapat menjana keuntungan yang mencukupi.
Penggunaan EMV agak mudah, hanya melihat sama ada EMV melintasi paksi sifar. Apabila EMV di bawah 0, ia mewakili pasaran yang lemah; apabila EMV di atas 0, ia mewakili pasaran yang kuat. Apabila EMV berubah dari negatif menjadi positif, ia harus dibeli; apabila EMV berubah dari positif menjadi negatif, ia harus dijual. Ciri-cirinya adalah bahawa ia tidak hanya dapat mengelakkan pasaran kejutan di pasaran, tetapi juga memasuki pasaran pada masa ketika pasaran trend bermula. Walau bagaimanapun, kerana EMV mencerminkan perubahan dalam jumlah apabila harga berubah, ia hanya mempunyai kesan pada trend jangka menengah hingga panjang. Untuk kitaran perdagangan jangka pendek atau agak pendek, kesan EMV
Langkah 1: Menulis kerangka strategi
# 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.COMmenggunakan mod latihan putaran.main
fungsi danonTick
fungsi.main
fungsi adalah fungsi kemasukan strategi, dan program akan menjalankan baris kod dengan baris darimain
fungsi.main
fungsi, tulis awhile
gelung dan berulang kali menjalankanonTick
Semua kod teras strategi ditulis dalamonTick
function.
Langkah 2: Dapatkan data kedudukan
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
Kerana dalam strategi ini, hanya bilangan kedudukan masa nyata digunakan, untuk memudahkan penyelenggaraan,get_position
digunakan di sini untuk merangkumi jumlah kedudukan. Jika kedudukan semasa panjang, ia mengembalikan nombor positif, dan jika kedudukan semasa pendek, ia mengembalikan nombor negatif.
Langkah 3: Dapatkan data K-line
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
Sebelum mendapatkan data K-line tertentu, anda mesti terlebih dahulu melanggan kontrak perdagangan tertentu, menggunakanSetContractType
fungsi daripadaFMZ.COMJika anda ingin mengetahui maklumat lain mengenai kontrak, anda juga boleh menggunakan pembolehubah untuk menerima data ini.GetRecords
fungsi untuk mendapatkan data K-garis, kerana dikembalikan adalah array, jadi kita menggunakan pembolehubahbars_arr
untuk menerimanya.
Langkah 4: Hitung 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
Di sini, kita tidak menggunakan harga terkini untuk mengira nilai EMV, tetapi menggunakan garis K semasa yang agak tertinggal untuk mengeluarkan isyarat dan meletakkan garis K untuk mengeluarkan pesanan. Tujuan ini adalah untuk membuat backtest lebih dekat dengan perdagangan sebenar.
Langkah 5: Menempatkan pesanan
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
Sebelum meletakkan pesanan, kita perlu menentukan dua data, satu adalah harga pesanan dan yang lain adalah status kedudukan semasa. harga meletakkan pesanan adalah sangat mudah, hanya menggunakan harga penutupan semasa untuk menambah atau mengurangkan harga perubahan minimum pelbagai.get_position
Akhirnya, kedudukan dibuka dan ditutup mengikut hubungan kedudukan antara EMV dan paksi sifar.
Konfigurasi Backtest
Log Ujian Balik
Kurva modal
# 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
Strategi yang lengkap telah diterbitkan di dataran strategiFMZ.COMlaman web, dan ia boleh digunakan dengan mengklik Salin.https://www.fmz.com/strategy/213636
Melalui kursus kajian ini, kita dapat melihat bahawa EMV bertentangan dengan peniaga biasa, tetapi tidak tidak munasabah. Kerana EMV memperkenalkan data jumlah, ia lebih berkesan daripada penunjuk teknikal lain yang menggunakan pengiraan harga untuk mengetahui apa yang berada di sebalik harga. Setiap strategi mempunyai ciri yang berbeza. Hanya dengan memahami sepenuhnya kelebihan dan kekurangan strategi yang berbeza dan menghilangkan sampah dan mengekstrak intipati, kita boleh pergi lebih jauh dari kejayaan.