Di antara banyak strategi perdagangan, strategi Saluran Donchian harus menjadi salah satu strategi terobosan klasik. Ia terkenal seawal 1970. Pada masa itu, sebuah syarikat asing menjalankan ujian simulasi dan penyelidikan mengenai strategi perdagangan program arus perdana. Hasilnya menunjukkan bahawa strategi Saluran Donchian adalah yang paling berjaya dalam semua ujian strategi.
Kemudian, latihan pedagang
Strategi perdagangan terobosan sesuai untuk berdagang varieti dengan trend yang agak lancar. Kaedah perdagangan terobosan yang paling biasa adalah menggunakan hubungan kedudukan relatif antara harga, sokongan dan rintangan untuk menilai titik perdagangan tertentu. Strategi Saluran Donchian dalam artikel ini juga berdasarkan prinsip ini.
Saluran Donchian adalah penunjuk trend, dan penampilannya dan isyaratnya agak serupa dengan penunjuk Bollinger Band. Walau bagaimanapun, saluran harga Donchian dibina mengikut harga tertinggi dan harga terendah dalam tempoh tertentu. Sebagai contoh, nilai maksimum harga tertinggi 50 K-garis terkini dikira untuk membentuk trek atas; Mengira nilai minimum harga terendah 50 K-garis terkini untuk membentuk trek bawah.
Seperti yang ditunjukkan dalam gambar di atas, penunjuk ini terdiri daripada tiga lengkung dengan warna yang berbeza. Secara lalai, harga tertinggi dan terendah dalam 20 tempoh digunakan untuk menunjukkan turun naik harga pasaran. Apabila saluran sempit, ini bermakna turun naik pasaran adalah kecil. Sebaliknya, apabila saluran lebar, ini bermakna turun naik pasaran adalah besar.
Jika harga naik di atas trek atas, ia adalah isyarat membeli; sebaliknya, jika harga jatuh di bawah trek bawah, ia adalah isyarat jual. Oleh kerana trek atas dan bawah dikira oleh harga tertinggi dan terendah, secara amnya, harga jarang naik dan jatuh di bawah garis saluran atas dan bawah pada masa yang sama. Dalam kebanyakan kes, harga bergerak di sepanjang trek atas atau bawah secara sepihak, atau antara trek atas dan bawah.
Terdapat banyak cara untuk menggunakan Saluran Donchian, yang boleh digunakan secara bersendirian atau digabungkan dengan penunjuk lain. Dalam pelajaran ini, kita akan menggunakan kaedah yang paling mudah. iaitu, apabila harga memecahkan trek atas dari bawah ke atas, iaitu, di atas garis tekanan, kita percaya bahawa kekuatan banyak pihak semakin meningkat, gelombang pasaran yang meningkat telah terbentuk, dan isyarat kedudukan terbuka beli telah dihasilkan; Apabila harga jatuh di bawah trek bawah dari atas ke bawah, iaitu, di bawah garis sokongan, kita percaya bahawa sisi kedudukan pendek semakin kuat, gelombang trend menurun telah terbentuk, dan isyarat kedudukan pembukaan jual telah dihasilkan.
Jika harga jatuh kembali ke trek tengah Saluran Donchian selepas membeli untuk membuka kedudukan, kita fikir bahawa kekuatan multi-pasangan melemah, atau kekuatan parti kedudukan pendek menguat, dan isyarat menjual dan menutup kedudukan dihasilkan; Jika harga naik kembali ke trek tengah Saluran Donchian selepas pembukaan kedudukan jualan, kita fikir bahawa sisi kedudukan pendek melemah, atau kekuatan multi-pasangan menguat, dan isyarat pembelian kedudukan ditutup dihasilkan.
Syarat pembelian dan jualan
Seterusnya, kita akan memahami strategi ini satu demi satu dalam persekitaran penyelidikan platform FMZ Quant:
Masukkan persekitaran penyelidikan platform FMZ Quant, seperti yang ditunjukkan di bawah:
Strategi Saluran Donchian dalam versi Python.ipynb Dalam [1]:
from fmz import *
task = VCtx('''backtest
start: 2019-08-01 09:00:00
end: 2019-10-10 15:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
''')
# Create a Backtesting Environment
# The example format of the backtest information in red above can be obtained by clicking "Save settings" on the strategy edting page of the FMZ Quant platform.
Dalam [2]:
# First, we need to get the position information, and we define a mp() function to do this.
def mp():
positions = exchange.GetPosition() # Get position array
if len(positions) == 0: # If the length of the position array is 0
return 0 # Prove a short position, return 0
for i in range(len(positions)): # Iterate through the positions array
if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
return 1 # If there are long position orders, return 1
elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
return -1 # If there are short position orders, return -1
print(positions)
mp() # Next, we execute this function to get the position information, and we can see that the result is 0, which means that the current position is short.
Keluar[2]:0
Dalam [3]:
# Let's start testing this strategy using the current main rebar contract as an example.
exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888.
Keluar[3]:
{
Seterusnya, kita mendapat array K-line, kerana menurut logik strategik, kita memerlukan pasaran untuk berjalan untuk jangka masa dan kemudian membuat penilaian logik, supaya logik strategik kita dapat menyesuaikan diri dengan lebih baik dengan pasaran. Di sini kita akan mengambil 50 K-line sebagai keperluan permulaan sementara. Maklumat K-line FMZ Quant disimpan dalam bentuk array, yang mengandungi harga tertinggi, harga terendah, harga pembukaan, harga penutupan, kuantiti dagangan dan maklumat lain. Untuk kandungan bahagian ini, sila rujuk dokumen API rasmi platform FMZ Quant:https://www.fmz.com/api
Dalam [4]:
# Next we define a variable to store the K-line array.
records = exchange.GetRecords() # Get the K-line array
Dalam [5]:
# According to the strategy logic description, we use the closing price as the price to open a position, so we need to calculate the closing price of the latest K-line.
close = records[len(records) - 1].Close # Get the latest K-line closing price
close
Keluar[5]: 3846.0
Kemudian, kita perlu mengira nilai maksimum harga tertinggi dan nilai minimum harga terendah dalam 50 K-garis dengan menggunakan harga penutupan sebagai standard.
Dalam [6]:
upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
upper
Keluar[6]: 3903.0
Dalam [7]:
lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
lower
Keluar[7]: 3856.0
Seterusnya, kita perlu mengira nilai purata trek atas dan bawah saluran ini.
Dalam [8]:
middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks.
middle
Keluar[8]: 3879.5
Di atas, kita telah menyelesaikan semua pengiraan yang diperlukan untuk strategi ini. Seterusnya, kita akan mula menilai keadaan pembukaan secara logik dan menjalankan operasi kedudukan pembukaan sebenar mengikut hasil penilaian logik. Perlu diperhatikan di sini bahawa kita perlu menggunakan templat niaga hadapan komoditi domestik platform FMZ Quant. Oleh kerana persekitaran penyelidikan semasa tidak dapat menyokong templat ini, kita akan menulisnya sementara, tetapi operasi akan melaporkan ralat, di halaman penulisan strategi platform FMZ Quant untuk pengekodan sebenar, import templat ini tanpa sebarang masalah, alamat templat adalah:https://www.fmz.com/strategy/24288. Apabila anda kod pada halaman penyuntingan strategi platform FMZ Quant, anda perlu menyalin templat ini ke perpustakaan strategi anda sendiri terlebih dahulu, dan kemudian mengetuknya semasa backtesting.
Dalam [ ]:
obj = ext.NewPositionManager() # When using the FMZ Quant trading class library, errors will be reported at runtime, which can be ignored. Now it is the research environment,
# This problem does not occur during the actual coding process, and the following is the same without further comment.
Langkah seterusnya adalah untuk menentukan logik strategi dan membuka dan menutup kedudukan mengikut logik.
Dalam [ ]:
if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
obj.CoverAll() # Close all positions
if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
obj.CoverAll() # Close all positions
if positions == 0: # If it's a short position
if close > upper: # If the closing price rises above the upper track
obj.OpenLong("rb888", 1) # Buy opening positions
elif close < lower: # If the closing price falls below the lower track
obj.OpenShort("rb888", 1) # Sell opening positions
Dalam [ ]:
# Complete strategy code:
def mp():
positions = exchange.GetPosition() # Get the position array
if len(positions) == 0: # If the length of the position array is 0
return 0 # It proved a short position, return 0
for i in range(len(positions)): # Iterate through the positions array
if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
return 1 # If there are long position orders, return 1
elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
return -1 # If there are short position orders, return -1
def main(): # Main function
exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888
while True: # Enter the loop
records = exchange.GetRecords() # Get the K-line array
if len(records) < 50: continue # If there are less than 50 K-lines, skip the loop
close = records[len(records) - 1].Close # Get the latest K-line closing price
positions = mp() # Get position information function
upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks
obj = ext.NewPositionManager() # Use the Trading Library
if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
obj.CoverAll() # Close all positions
if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
obj.CoverAll() # Close all positions
if positions == 0: # If it's a short position
if close > upper: # If the closing price rises above the upper track
obj.OpenLong("rb888", 1) # Buy opening positions
elif close < lower: # If the closing price falls below the lower track
obj.OpenShort("rb888", 1) # Sell opening positions