Analisis Strategi Saluran Donchian dalam persekitaran penyelidikan

Penulis:Lydia, Dicipta: 2022-12-26 09:19:00, Dikemas kini: 2023-09-20 10:43:17

img

Analisis Strategi Saluran Donchian dalam persekitaran penyelidikan

Pengenalan Strategi

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 turtle yang paling terkenal dalam sejarah perdagangan berlangsung di Amerika Syarikat, yang merupakan kejayaan besar. Pada masa itu, kaedah perdagangan Turtles bersifat sulit, tetapi selepas lebih dari sepuluh tahun, Turtle Trading Rules diterbitkan kepada orang ramai, orang mendapati bahawa Turtles menggunakan versi yang lebih baik dari strategi Saluran Donchian.

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.

Peraturan strategi Saluran Donchian

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.

img

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.

Logik strategi

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

  • Posisi pembukaan panjang: jika tidak ada kedudukan dan harga penutupan lebih tinggi daripada trek atas.
  • Posisi pembukaan pendek: jika tidak ada kedudukan dan harga penutupan adalah lebih rendah daripada trek bawah.
  • Posisi penutupan panjang: jika anda memegang kedudukan panjang dan harga penutupan adalah lebih rendah daripada trek tengah.
  • Posisi penutupan pendek: Jika anda memegang kedudukan pendek dan harga penutupan lebih besar daripada trek tengah.

Pelaksanaan Kod Strategi

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:

img

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]: {CombinationType: 0, CreateDate: 0, Bulan Penghantaran: 9, Tahun Penghantaran: 0, EndDelivDate: 0, ExchangeID: SHFE, ExchangeInstID: rb888, Tanggal tamat tempoh: 0, InstLifePhase: 49, InstrumentID: rb888, nama instrumen: kontinuiti rb, IsTrading: 1, Long MarginRatio: 0.06, MaxLimitOrderVolume: 500, Algorithm MaxMarginSide: 49, MaxMarketOrderVolume: 30, MinLimitOrderVolume: 1, MinMarketOrderVolume: 1, OpenDate: 0, PilihanJenis: 48, PositionDateType: 49, PosisiJenis: 50, PriceTick: 1, Kelas Produk: 49, ProductID: rb, Ratio Margin Pendek: 0.06, Tanggal Bermula Penghantaran: 0, Harga mogok: 0, InstrID yang mendasari: rb, Multiple Underlying: 1, VolumeMultiple: 10}

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

Berkaitan

Lebih lanjut