Analisis Strategi Saluran Donchian dalam Lingkungan Penelitian

Penulis:Lydia, Dibuat: 2022-12-26 09:19:00, Diperbarui: 2023-09-20 10:43:17

img

Analisis Strategi Saluran Donchian dalam Lingkungan Penelitian

Pengenalan Strategi

Di antara banyak strategi perdagangan, strategi Saluran Donchian harus menjadi salah satu strategi terobosan paling klasik. Ini terkenal sejak tahun 1970. Pada saat itu, sebuah perusahaan asing melakukan pengujian simulasi dan penelitian tentang strategi perdagangan program arus utama. Hasilnya menunjukkan bahwa strategi Saluran Donchian adalah yang paling sukses dalam semua tes strategi.

Kemudian, pelatihan pedagang turtle yang paling terkenal dalam sejarah perdagangan berlangsung di Amerika Serikat, yang sangat sukses. Pada saat itu, metode perdagangan Turtles bersifat rahasia, tetapi setelah lebih dari sepuluh tahun, Turtle Trading Rules dipublikasikan kepada publik, orang-orang menemukan bahwa Turtles menggunakan versi yang disempurnakan dari strategi Saluran Donchian.

Strategi perdagangan terobosan cocok untuk perdagangan varietas dengan tren yang relatif halus. Metode perdagangan terobosan yang paling umum adalah menggunakan hubungan posisi relatif antara harga, dukungan dan resistensi untuk menilai titik perdagangan tertentu. Strategi Saluran Donchian dalam artikel ini juga didasarkan pada prinsip ini.

Aturan strategi Saluran Donchian

Saluran Donchian adalah indikator tren, dan penampilannya dan sinyalnya agak mirip dengan indikator Bollinger Band. Namun, saluran harga Donchian dibangun sesuai dengan harga tertinggi dan harga terendah dalam periode tertentu. Misalnya, nilai maksimum harga tertinggi dari 50 K-line terbaru dihitung untuk membentuk trek atas; Hitung nilai minimum harga terendah dari 50 K-line terbaru untuk membentuk trek bawah.

img

Seperti yang ditunjukkan pada gambar di atas, indikator ini terdiri dari tiga kurva dengan warna yang berbeda. Secara default, harga tertinggi dan terendah dalam 20 periode digunakan untuk menunjukkan volatilitas harga pasar. Ketika saluran sempit, itu berarti bahwa volatilitas pasar kecil. Sebaliknya, ketika saluran lebar, itu berarti bahwa volatilitas pasar besar.

Jika harga naik di atas jalur atas, itu adalah sinyal beli; Sebaliknya, jika harga turun di bawah jalur bawah, itu adalah sinyal jual. Karena jalur atas dan bawah dihitung oleh harga tertinggi dan terendah, umumnya, harga jarang naik dan turun di bawah garis saluran atas dan bawah pada saat yang sama. Dalam kebanyakan kasus, harga bergerak di sepanjang jalur atas atau bawah secara sepihak, atau antara jalur atas dan bawah.

Logika strategi

Ada banyak cara untuk menggunakan Saluran Donchian, yang dapat digunakan sendiri atau dikombinasikan dengan indikator lain. Dalam pelajaran ini, kita akan menggunakan metode yang paling sederhana. yaitu, ketika harga menembus jalur atas dari bawah ke atas, yaitu di atas garis tekanan, kita percaya bahwa kekuatan banyak pihak tumbuh, gelombang pasar naik telah terbentuk, dan sinyal posisi terbuka beli telah dihasilkan; Ketika harga turun di bawah jalur bawah dari atas ke bawah, yaitu di bawah garis dukungan, kita percaya bahwa sisi posisi pendek menguat, gelombang tren penurunan telah terbentuk, dan sinyal posisi pembukaan jual telah dihasilkan.

Jika harga jatuh kembali ke jalur tengah Saluran Donchian setelah membeli untuk membuka posisi, kita berpikir bahwa kekuatan multi-partai melemah, atau kekuatan partai posisi pendek menguat, dan sinyal penjualan dan penutupan posisi dihasilkan; Jika harga naik kembali ke jalur tengah Saluran Donchian setelah pembukaan posisi jual, kita berpikir bahwa sisi posisi pendek melemah, atau kekuatan multi-partai menguat, dan sinyal posisi penutupan beli dihasilkan.

Kondisi pembelian dan penjualan

  • Posisi pembukaan panjang: jika tidak ada posisi dan harga penutupan lebih tinggi dari jalur atas.
  • Posisi pembukaan pendek: jika tidak ada posisi dan harga penutupan lebih rendah dari jalur bawah.
  • Posisi penutupan panjang: jika Anda memegang posisi panjang dan harga penutupan lebih rendah dari jalur tengah.
  • Posisi penutupan pendek: Jika Anda memegang posisi pendek dan harga penutupan lebih besar dari jalur tengah.

Pelaksanaan kode strategi

Selanjutnya, kita akan memahami strategi ini satu per satu di lingkungan penelitian platform FMZ Quant:

Masukkan lingkungan penelitian dari platform FMZ Quant, seperti yang ditunjukkan di bawah ini:

img

Donchian Channel strategi dalam Python versi.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 Pengiriman: 9, Tahun Pengiriman: 0, EndDelivDate: 0, ExchangeID: SHFE ExchangeInstID: rb888, Tanggal kadaluarsa : 0, InstLifePhase: 49, InstrumentID: rb888, Nama Instrumen: kontinuitas rb, IsTrading: 1, Long MarginRatio: 0,06, MaxLimitOrderVolume: 500, MaxMarginSideAlgorithm: 49, MaxMarketOrderVolume: 30, MinLimitOrderVolume: 1, MinMarketOrderVolume: 1, OpenDate: 0, OpsiJenis : 48, PosisiDateType: 49, PosisiJenis : 50, PriceTick: 1, Kelas Produk: 49, ProductID: rb, Short MarginRatio: 0,06 MulaiDelivDate: 0, StrikePrice: 0, InstrID yang mendasari: rb, Multiple yang mendasari : 1, VolumeMultiple: 10}

Selanjutnya, kita mendapatkan array K-line, karena menurut logika strategis, kita perlu pasar untuk berjalan untuk jangka waktu tertentu dan kemudian membuat penilaian logis, sehingga logika strategis kita dapat lebih beradaptasi dengan pasar. Di sini kita akan mengambil 50 K-line sebagai persyaratan awal sementara. Informasi K-line FMZ Quant disimpan dalam bentuk array, yang berisi harga tertinggi, harga terendah, harga pembukaan, harga penutupan, kuantitas perdagangan dan informasi lainnya. Untuk isi bagian ini, silakan lihat dokumen API resmi 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 menghitung nilai maksimum dari harga tertinggi dan nilai minimum dari harga terendah dalam 50 K-line dengan menggunakan harga penutupan sebagai standar.

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

Selanjutnya, kita perlu menghitung nilai rata-rata jalur 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 perhitungan yang diperlukan untuk strategi ini. Selanjutnya, kita akan mulai menilai kondisi pembukaan secara logis dan melakukan operasi posisi pembukaan yang sebenarnya sesuai dengan hasil penilaian logis. Perlu dicatat di sini bahwa kita perlu menggunakan templat berjangka komoditas domestik dari platform FMZ Quant. Karena lingkungan penelitian saat ini tidak dapat mendukung templat ini, kita akan menulisnya sementara, tetapi operasi akan melaporkan kesalahan, di halaman penulisan strategi platform FMZ Quant untuk pengkodean aktual, impor templat ini tanpa masalah, alamat templatnya adalah:https://www.fmz.com/strategy/24288. Ketika Anda kode pada halaman editing strategi platform FMZ Quant, Anda perlu menyalin template ini ke perpustakaan strategi Anda sendiri terlebih dahulu, dan kemudian centang saat 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 selanjutnya adalah menentukan logika strategi dan membuka dan menutup posisi sesuai dengan logika.

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 banyak