Menggunakan Kalendar Ekonomi untuk Backtesting Strategi Trading di MetaTrader 5

Mike 2024.11.11 04:33 30 0 0
Lampiran

Untuk memendekkan cerita, kalendar ekonomi terbina dalam MetaTrader 5 tidak diselaraskan sepenuhnya dengan petikan sejarah.

Petikan ditandakan dengan cap waktu mengikut zon waktu yang berkuat kuasa di pelayan pada masa pembentukan setiap bar yang berkaitan.

Setelah bar terbentuk, ia akan tetap tidak berubah, termasuk cap waktunya. Sebaliknya, kalendar ekonomi memberikan maklumat tentang acara (masa lalu, masa kini, dan masa depan) yang terikat dengan zon waktu semasa pelayan. Oleh kerana banyak broker mengikuti jadual zon waktu tertentu, termasuk menghidupkan dan mematikan mod penjimatan siang, cap waktu acara sejarah mungkin teralih satu jam berbanding dengan bar yang berkaitan, kira-kira setengah tahun.

Lebih daripada itu, broker kadangkala mengubah zon waktu lebih radikal daripada sekadar menukar DST (Daylight Saving Time). Petikan sejarah mungkin kelihatan teralih beberapa jam ke kiri atau kanan berbanding dengan waktu acara ekonomi yang asalnya berlaku, tetapi kini dilaporkan oleh kalendar dalam zon waktu pelayan yang telah dikemas kini.

Memandangkan berita datang dari pelbagai negara dengan jadual DST mereka sendiri dan pelayan anda boleh terletak di kawasan dengan jadual yang berbeza, waktu pengeluaran berita boleh kelihatan "melompat" ke belakang dan ke depan di carta dengan cara yang lebih pelik (contohnya, selama beberapa minggu di musim bunga dan musim luruh).

Semua ini mungkin tidak kelihatan penting dalam talian, tetapi bagaimana jika kita ingin menguji strategi yang berasaskan berita?

Ya, anda boleh mengatakan bahawa kalendar tidak disokong dalam penguji MetaTrader secara native, tetapi ramai trader suka berdagang berdasarkan berita dan mereka yang tidak seharusnya mengikuti berita untuk menjauhkan diri dari pasaran sebelum ia menjadi huru-hara semasa berita. Oleh itu, backtesting dengan kalendar adalah penting. Itulah sebabnya adalah sangat logik untuk mengeksport kalendar ke penyimpanan luaran (fail, pangkalan data) dan kemudian mengimpornya ke penguji. Salah satu alat pengarkiban untuk pengalaman kalendar dalam penguji telah diperkenalkan dalam buku algotrading.

Di sini kita berhadapan dengan masalah desinkronisasi petikan sejarah dengan acara sejarah. Untuk memudahkan, masalah ini ditinggalkan tanpa penyelesaian dalam buku tersebut.

Kini ia telah diselesaikan terima kasih kepada versi lanjutan CalendarCache.mqh dan indikator yang dipamerkan CalendarMonitorCachedTZ.mq5. Ini adalah versi yang sedikit diubah suai dari CalendarMonitorCached.mq5 dari buku.

Indikator ini memantau acara berita dan mengemas kini secara dinamik jadual di carta dengan beberapa acara yang lalu dan akan datang.

Semua kerja yang berkaitan dengan pembetulan waktu dilakukan secara belakang tabir - dalam perpustakaan awam lain TimeServerDST.mqh. Untuk pemahaman yang lebih baik tentang bagaimana pembetulan waktu berfungsi, anda boleh menggunakan skrip CalendarCSVForDates.mq5 dan membandingkan fail CSV dengan dan tanpa pembetulan secara berdampingan.

Inilah cara perpustakaan disematkan dalam kod sumber kedua-dua program - skrip dan indikator ini.

#include <TimeServerDST.mqh> // termasuk sebelum cache kalendar membolehkan sokongan pembetulan zon waktu
#include <MQL5Book/CalendarFilterCached.mqh>
#include <MQL5Book/CalendarCache.mqh>

Seperti dalam indikator asal, terdapat input string CalendarCacheFile, di mana anda boleh memberikan nama fail kalendar untuk penulisan atau bacaan.

Apabila indikator dilampirkan pada carta dalam talian dengan CalendarCacheFile yang kosong, ia berfungsi dengan kalendar terbina dalam secara langsung.

Apabila indikator dilaksanakan dengan nama tertentu dalam CalendarCacheFile dan fail tidak wujud, indikator mengeksport rekod kalendar ke dalam fail cache (mencipta fail) dan keluar. Ini adalah tahap di mana cap waktu perlu/dapat diperbetulkan (lihat FixCachedTimesBySymbolHistory di bawah).

Apabila indikator dilaksanakan dengan nama fail cache yang sedia ada dalam CalendarCacheFile, ia memuatkan cache dan berfungsi dengan salinan ini dengan cara yang sama seperti dengan kalendar terbina dalam. Ini sangat berguna untuk penguji.

Calendar Monitor dalam penguji membaca acara dari cache

Sila, jangan lupa bahawa penguji memerlukan untuk menentukan fail tambahan, dalam kes kami - fail kalendar dalam talian yang disediakan, dalam arahan #property tester_file ATAU anda perlu meletakkan fail kalendar ke dalam folder umum C:/Users/<User>/AppData/Roaming/MetaQuotes/Terminal/Common/.

Sudah tentu, cache juga boleh dimuatkan ke dalam EA semasa backtests dan pengoptimuman.

Input string FixCachedTimesBySymbolHistory diproses dengan cara berikut.

Jika ia kosong, indikator menyimpan cache tanpa pembetulan waktu.

Untuk membolehkan pembetulan waktu semasa eksport, anda perlu menentukan simbol yang akan digunakan untuk pengesanan empirikal zon waktu sejarah pelayan. Ia berfungsi berdasarkan sejarah petikan H1, lebih baik "XAUUSD" atau "EURUSD".

Dengan bantuan input ini, hanya beberapa baris ditambahkan ke dalam versi baru indikator:

         if(StringLen(FixCachedTimesBySymbolHistory))
            cache[].adjustTZonHistory(FixCachedTimesBySymbolHistory, true);

Metod adjustTZonHistory diperkenalkan khusus dalam kelas CalendarCache untuk pembetulan cap waktu dan pelaksanaannya menggunakan dalaman TimeServerDST.mqh.

Metod ini hanya perlu dipanggil dalam talian (bukan dalam penguji).

Biasanya metod ini perlu dipanggil pada objek cache yang diisi dari kalendar terbina dalam, sejurus selepas pengisian. Jika tidak, jika cache dimuat dari fail kalendar, atau jika metod sudah dipanggil sebelum ini, kandungan cache mungkin sudah diperbetulkan. Kemudian anda akan menerapkan pembetulan pada pembetulan dan mendapatkan cap waktu yang salah.

Parameter kedua (true) mengarahkan metod untuk menulis sempadan perubahan yang diterapkan ke dalam log. Sesuatu seperti ini:

Pembetulan waktu bermula pada 2021.07.19 00:30:00
2021.07.19 00:30:00: 148786 -10800 bezanya=-3600
2021.11.08 01:50:00: 135918 -7200 OK
2022.03.14 04:30:00: 161085 -10800 bezanya=-3600
2022.11.07 04:00:00: 165962 -7200 OK
2023.03.13 01:50:00: 168500 -10800 bezanya=-3600
2023.11.06 01:50:00: 169270 -7200 OK
2024.03.11 01:50:00: 181258 -10800 bezanya=-3600
2024.11.04 02:30:00: 208469 -7200 OK

Setiap baris mengandungi waktu dan ID acara di mana ketidakcocokan baru dikesan, offset waktu pelayan pada acara, dan perbezaan yang perlu diterapkan pada semua cap waktu berikutnya untuk menghapuskan bias dalam waktu pelayan pada saat penyimpanan kalendar.

Fail mqh yang dilampirkan (CalendarFilter.mqh, CalendarCache.mqh, QuickSortStructT(Ref).mqh) mengandungi pembetulan dan penambahbaikan berbanding versi asal mereka dari buku.

Kemas kini

11.11.2024 - pembetulan kecil dan kemas kini dalam CalendarFilter.mqh, CalendarCache.mqh;

22.11.2024 - pembetulan kecil dan penambahbaikan dalam CalendarCache.mqh.

Senarai
Komen 0