Tidak seperti indikator teknis lainnya,
Simple volatility EMV dirancang sesuai dengan prinsip grafik volume yang sama dan grafik terkompresi. Konsep utamanya adalah: harga pasar akan mengkonsumsi banyak energi hanya ketika tren berbalik atau akan berbalik, dan kinerja eksternal adalah bahwa volume perdagangan menjadi lebih besar. Ketika harga naik, itu tidak akan mengkonsumsi terlalu banyak energi karena efek dorongan. Meskipun ide ini bertentangan dengan pandangan bahwa baik kuantitas maupun kenaikan harga, ia memiliki fitur uniknya sendiri.
Langkah 1: Menghitung 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: Perhitungkan rasio
Di antara mereka, TVOL mewakili volume perdagangan hari itu, TH mewakili harga tertinggi hari itu, dan TL mewakili harga terendah hari itu.
Langkah 3: Menghitung emv
Penulis EMV percaya bahwa kenaikan besar disertai dengan cepat habisnya energi, dan kenaikan seringkali tidak berlangsung terlalu lama; sebaliknya, volume moderat, yang dapat menghemat sejumlah energi, sering membuat kenaikan berlangsung lebih lama. Setelah tren naik terbentuk, volume perdagangan yang lebih sedikit dapat mendorong harga naik, dan nilai EMV akan meningkat. Setelah pasar penurunan terbentuk, itu sering disertai dengan penurunan tak terbatas atau kecil, dan nilai EMV akan menurun. Jika harga berada di pasar yang fluktuatif atau kenaikan harga dan penurunan disertai dengan volume yang besar, nilai EMV juga akan mendekati nol. Jadi Anda akan menemukan bahwa EMV berada di bawah sumbu nol di sebagian besar pasar, yang juga merupakan fitur utama dari indikator ini. Dari perspektif lain, nilai-nilai EMV mega-trends dapat menghasilkan keuntungan dan menghasilkan keuntungan yang cukup.
Penggunaan EMV cukup sederhana, hanya melihat apakah EMV melintasi sumbu nol. Ketika EMV di bawah 0, itu mewakili pasar yang lemah; ketika EMV di atas 0, itu mewakili pasar yang kuat. Ketika EMV berubah dari negatif menjadi positif, itu harus dibeli; ketika EMV berubah dari positif menjadi negatif, itu harus dijual. Karakteristiknya adalah bahwa ia tidak hanya dapat menghindari pasar kejutan di pasar, tetapi juga memasuki pasar pada saat pasar tren dimulai. Namun, karena EMV mencerminkan perubahan volume ketika harga berubah, itu hanya memiliki efek pada tren jangka menengah hingga panjang. Untuk siklus perdagangan jangka pendek atau relatif pendek, efek 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.COMPertama, Anda perlu mendefinisikanmain
Fungsi danonTick
Fungsi.main
fungsi adalah fungsi entri dari strategi, dan program akan menjalankan baris kode baris darimain
fungsi.main
fungsi, tulis awhile
loop dan berulang kali menjalankanonTick
Semua kode inti dari strategi ditulis dalamonTick
function.
Langkah 2: Dapatkan data posisi
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
Karena dalam strategi ini, hanya jumlah posisi real-time yang digunakan, untuk memfasilitasi pemeliharaan,get_position
digunakan di sini untuk merangkum jumlah posisi. jika posisi saat ini panjang, mengembalikan angka positif, dan jika posisi saat ini pendek, mengembalikan angka 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 harus terlebih dahulu berlangganan kontrak perdagangan tertentu, menggunakanSetContractType
fungsi dariFMZ.COMJika Anda ingin tahu informasi lain tentang kontrak, Anda juga dapat menggunakan variabel untuk menerima data ini.GetRecords
fungsi untuk mendapatkan data K-line, karena dikembalikan adalah array, jadi kita menggunakan variabelbars_arr
untuk menerimanya.
Langkah 4: Menghitung 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 terbaru untuk menghitung nilai EMV, tetapi menggunakan garis K arus yang relatif tertinggal untuk mengeluarkan sinyal dan menempatkan garis K untuk mengeluarkan pesanan. Tujuan dari ini adalah untuk membuat backtest lebih dekat dengan perdagangan nyata.
Langkah 5: Membuat 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 menempatkan order, kita perlu menentukan dua data, satu adalah harga order dan yang lainnya adalah status posisi saat ini. harga menempatkan order sangat sederhana, hanya menggunakan harga penutupan saat ini untuk menambahkan atau mengurangi harga perubahan minimum dari berbagai. karena kita telah menggunakanget_position
fungsi untuk merangkum posisi, kita bisa memanggilnya langsung di sini. akhirnya, posisi dibuka dan ditutup sesuai dengan hubungan posisi antara EMV dan sumbu nol.
Konfigurasi Backtest
Log uji 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 lengkap telah dipublikasikan di alun-alun strategiFMZ.COMsitus web, dan dapat digunakan dengan mengklik Salin.https://www.fmz.com/strategy/213636
Melalui kursus studi ini, kita dapat melihat bahwa EMV bertentangan dengan pedagang biasa, tetapi itu tidak tidak masuk akal. Karena EMV memperkenalkan data volume, itu lebih efektif daripada indikator teknis lain yang menggunakan perhitungan harga untuk mengetahui apa yang ada di balik harga. Setiap strategi memiliki karakteristik yang berbeda. Hanya dengan memahami sepenuhnya keuntungan dan kerugian dari berbagai strategi dan menghilangkan sampah dan mengekstraksi intinya, kita dapat melangkah lebih jauh dari kesuksesan.