Python dasar untuk trading algo
Trader menggunakan Python untuk membangun bot trading, indikator teknikal, plugin, dan alat lain untuk membantu trading algo atau operasi manual, dan artikel ini menjelaskan dasar-dasar coding di Python.
Python adalah bahasa pemrograman serbaguna tingkat tinggi yang populer yang digunakan untuk pengembangan web, ilmu data, otomatisasi dan baru-baru ini, trading algoritmik di cTrader. Baik Anda membuat bot trading berbasis sinyal sederhana atau strategi multi-indikator yang kompleks, Python membuat prosesnya lebih cepat, lebih efisien dan lebih mudah dikelola.
Algoritma Python dalam satu menit!
- Nikmati dukungan Python bawaan dan akses tanpa hambatan ke API cTrader Algo, dengan cTrader sebagai satu-satunya platform utama yang menawarkan integrasi native secara langsung. Tidak diperlukan plugin, adapter, atau pengaturan yang rumit.
- Fokus lebih banyak pada apa yang harus dicapai oleh strategi Anda karena logikanya menjadi lebih mudah disusun. Nikmati iterasi cepat, komponen yang dapat digunakan kembali, dan kinerja yang dapat diskalakan.
- Kembangkan dengan cepat, debug lebih cerdas, dan berkolaborasi tanpa hambatan. Kode Anda akan selalu dapat diadaptasi, andal, dan dapat dipelihara.
- Akses dan manfaatkan ribuan pustaka gratis/open-source, tutorial mendalam, contoh kode, dan dukungan komunitas yang kuat di seluruh dunia.
Variabel dan tipe data
Di Python, variabel memiliki tipe dinamis, yang berarti Anda tidak perlu mendeklarasikan tipe datanya secara eksplisit. Interpreter menentukan tipe pada saat runtime berdasarkan nilai yang ditetapkan.
Anda membuat variabel hanya dengan menetapkan nilai ke variabel tersebut:
1 2 3 4 | |
Tipe data umum
| Tipe | Deskripsi | Contoh |
|---|---|---|
int | Bilangan bulat | 5, 100, api.StepPips |
float | Bilangan desimal | 1.1234, 100.5, api.Symbol.Ask |
bool | Nilai Boolean | True, False |
str | String | "EURUSD", api.Label |
list | Kumpulan item | [1, 2, 3], [p for p in api.Positions] |
Dalam algoritma cTrader, variabel menyimpan data penting terkait informasi pasar, keputusan trading, dan konfigurasi cBot. Variabel-variabel ini sering mewakili volume trading yang dihitung, nilai indikator, bendera Boolean, nama simbol, label, dan lainnya.
Berikut contohnya:
1 2 3 4 | |
Dalam kasus ini, self.volumeInUnits adalah float yang digunakan untuk menempatkan order, sementara self.enoughMoney adalah bool yang mengontrol apakah akan terus membuka posisi dalam strategi grid.
Kelas dan objek
Python adalah bahasa pemrograman berorientasi objek (OOP), menyediakan alat untuk mengorganisir kode melalui kelas dan objek yang memodelkan entitas dan perilaku dunia nyata. Sebuah kelas mendefinisikan cetak biru untuk membuat objek, yang merupakan instance dari kelas tersebut dengan data dan perilaku unik mereka sendiri. Konsep utamanya diuraikan di bawah ini:
- Kelas didefinisikan menggunakan kata kunci
class. - Metode
__init__(konstruktor) umumnya digunakan untuk menginisialisasi keadaan objek. - Metode instance mendefinisikan perilaku.
- Atribut menyimpan data spesifik untuk setiap objek.
Misalnya, Anda dapat membuat kelas Car:
1 2 3 4 5 6 7 | |
Kemudian Anda dapat membuat objek dari kelas Car dan berinteraksi dengannya:
1 2 3 | |
Dalam konteks cTrader
Di cTrader, cBot, indikator, dan plugin diimplementasikan sebagai kelas yang merangkum seluruh logika mereka. Algo berinteraksi dengan platform cTrader menggunakan objek api khusus yang menyediakan akses ke simbol, grafik, order, indikator, dan lainnya.
Anda dapat membuat kelas SimplecBot di cTrader dengan cara ini:
1 2 3 | |
Kelas SimplecBot mencakup satu metode (on_start(self)) yang dieksekusi sekali ketika bot trading dimulai. Fungsi api.Print menulis pesan ke log, menunjukkan bagaimana metode objek merangkum perilaku trading.
Setiap instance dari kelas secara efektif mewakili algoritma trading mandiri yang mengelola siklus hidup dan keputusan tradingnya sendiri menggunakan prinsip OOP. Dalam cBot cTrader standar, sebuah kelas mungkin menyimpan data keadaan internal, seperti volume, hasil indikator, dll., dan menggunakan beberapa metode untuk mengelola logika trading.
Pertimbangkan contoh crossover MACD ini yang menginisialisasi indikator MACD saat dimulai dan menempatkan order beli ketika sinyal crossover MACD terjadi:
1 2 3 4 5 6 7 | |
Kata kunci self
Di dalam kelas, self merujuk pada instance kelas dan menyediakan akses ke variabel dan metodenya. self digunakan untuk:
- Menyimpan data seperti hasil indikator, volume posisi, dan nilai konfigurasi.
- Melacak keadaan internal di berbagai panggilan metode seperti
on_start(),on_tick()atauon_bar_closed().
Contoh ini menunjukkan bagaimana self digunakan:
1 2 3 4 | |
Dalam kasus ini, self.volume menyimpan volume yang dihitung untuk digunakan dalam trading, sementara self.macd menyimpan objek indikator MACD, memungkinkan akses ke nilainya sepanjang siklus hidup cBot. Tanpa self, variabel-variabel ini akan bersifat lokal untuk on_start() dan tidak dapat diakses di on_bar_closed() di mana keputusan trading mungkin dibuat.
Metode dan fungsi
Fungsi adalah blok kode yang dapat digunakan kembali untuk melakukan tugas tertentu. Ketika fungsi didefinisikan di dalam kelas, mereka disebut metode, dan mereka beroperasi pada keadaan internal kelas melalui parameter self. Dalam konteks trading algoritmik dengan cTrader, metode mendefinisikan bagaimana algoritma trading Anda berperilaku dalam kondisi berbeda, seperti tick pasar, penutupan bar, atau inisialisasi.
Platform secara otomatis memanggil metode khusus (dikenal sebagai penangan event) pada waktu yang tepat, seperti:
on_start(self) – dipanggil sekali ketika bot diinisialisasi.
1 2 | |
on_tick(self) – dipanggil pada setiap tick pasar yang masuk.
1 2 | |
on_bar_closed(self) – dipanggil ketika candle/bar baru ditutup (ideal untuk strategi berbasis waktu).
1 2 3 4 | |
Metode kustom atau pembantu
Untuk menghindari penulisan ulang dan duplikasi kode, Anda dapat mendefinisikan metode Anda sendiri. Metode kustom tersebut harus merangkum logika umum yang mungkin digunakan kembali oleh robot trading Anda.
Metode di bawah ini mengembalikan semua posisi terbuka yang terkait dengan label cBot saat ini, memudahkan untuk melacak atau menutup posisi secara konsisten.
1 2 | |
Pertimbangkan metode lain yang menghitung jarak dalam pip antara harga saat ini dan entri posisi, yang penting untuk keputusan dalam strategi berbasis grid.
1 2 | |
Setelah metode didefinisikan, Anda dapat memanggilnya dari dalam kelas yang sama menggunakan kata kunci self. Pendekatan ini memungkinkan Anda menggunakan kembali logika di mana saja dalam bot Anda tanpa menduplikasi kode.
Misalnya, setelah mendefinisikan get_bot_positions(), Anda mungkin memanggilnya di dalam metode lain untuk menutup semua posisi:
1 2 3 4 | |
Di sini, self.get_bot_positions() memanggil metode pembantu, mengembalikan hanya posisi yang terkait dengan label bot saat ini.
Demikian pula, metode get_distance_in_pips() dapat digunakan kembali untuk membuat keputusan trading. Misalnya, dalam strategi grid, Anda mungkin ingin membuka order baru hanya jika pasar telah bergerak cukup jauh dari posisi terakhir:
1 2 3 4 5 6 7 | |
Konsep lainnya
Namespace dan impor
Namespace di Python membantu mengorganisir kode dan menghindari tabrakan nama dengan mengelompokkan pengidentifikasi terkait (variabel, fungsi, kelas). Impor memungkinkan Anda membawa masuk modul eksternal, pustaka atau paket untuk memperluas fungsionalitas di luar fitur standar Python.
Di Python, Anda dapat mengimpor modul standar atau paket kustom:
1 2 | |
Anda juga dapat mengimpor fungsi atau kelas tertentu:
1 2 | |
Saat menulis algoritma untuk cTrader dalam Python, impor bekerja sedikit berbeda karena cTrader terintegrasi dengan cTrader Algo API berbasis .NET. Pengaturan ini melibatkan jembatan yang memungkinkan kode Python berinteraksi dengan assembly .NET, dan ini menjelaskan mengapa cBot biasanya dimulai dengan:
1 2 3 4 5 6 7 8 9 | |
Di mana:
import clrmemuat Common Language Runtime (CLR), memungkinkan Python berinteroperasi dengan pustaka .NET.clr.AddReference("cAlgo.API")mereferensikan assembly cAlgo API, yang berisi semua kelas, metode, dan objek terkait trading.from cAlgo.API import *membawa masuk semua tipe dari API (misalnya,TradeType,Color,Position).from robot_wrapper import *memuat fungsi pembantu dan pembungkus yang menyederhanakan operasi trading umum.
Sistem namespace memastikan bahwa:
- Nama bawaan Python (seperti
print) menghindari konflik dengan nama cTrader (sepertiapi.Print). - Semua objek khusus trading (
api.Symbol,api.Indicators,api.ExecuteMarketOrder) berasal dari namespace cTrader Algo API, menjaga mereka terorganisir dan berbeda. - Anda dapat memperluas fungsionalitas dengan mengimpor paket kustom Anda sendiri untuk bekerja bersama tipe bawaan cTrader.
Loop
Loop memungkinkan Anda mengulang operasi pada urutan nilai atau sampai kondisi terpenuhi. Dalam trading algoritmik, loop sering digunakan untuk memproses posisi (misalnya, menutup, memfilter atau memperbaruinya), memeriksa kondisi di beberapa aset atau indikator, menerapkan strategi grid atau martingale di mana penempatan order berulang diperlukan dan lainnya.
Di Python, iterasi mudah dilakukan dan mendukung baik loop for (untuk iterasi melalui koleksi) dan loop while (untuk pengulangan sampai kondisi berubah).
Anda dapat menulis loop untuk menutup posisi:
1 2 3 4 | |
Dalam kasus ini:
self.get_bot_positions()mengembalikan semua posisi yang dimiliki oleh cBot saat ini.- Loop
formelalui setiap posisi. - Posisi yang cocok ditutup dengan
api.ClosePosition.
Pertimbangkan loop berbeda yang melakukan iterasi pada semua posisi grid terbuka, menutupnya satu per satu dan secara rekursif memeriksa apakah ada posisi yang tersisa (pengamanan jika terjadi penutupan parsial).
1 2 3 4 5 6 | |
Pernyataan kondisional
Pernyataan kondisional mengontrol alur eksekusi di Python dengan memungkinkan algoritma Anda membuat keputusan berdasarkan ekspresi logis. Kondisional adalah tulang punggung logika strategi, menentukan kapan harus masuk, keluar atau mengelola posisi.
Python mendukung tiga konstruksi kondisional utama:
if– mengeksekusi kode ketika kondisi benar.elif(else if) – memeriksa kondisi lain jika yang pertama salah.else– memberikan fallback ketika tidak ada kondisi yang terpenuhi.
Pertimbangkan kondisi persilangan MACD yang dinyatakan dalam kode ini:
1 2 3 4 | |
Struktur ini:
- Menempatkan order beli ketika garis MACD berada di atas garis sinyal.
- Menempatkan order jual ketika garis MACD berada di bawah garis sinyal.
- Melewatkan trading jika tidak ada sinyal yang jelas.
Daftar
Python menyediakan alat yang kuat dan ringkas untuk bekerja dengan kumpulan data, seperti trading, harga atau indikator. Dua yang paling umum adalah list comprehension dan fungsi agregasi bawaan seperti sum().
Misalnya, Anda dapat menulis kode yang melakukan iterasi pada numbers dan hanya menyimpan angka genap dengan cara ini:
1 2 | |
Anda dapat menggunakan list comprehension untuk memilih hanya posisi untuk simbol saat ini, menghasilkan daftar terfilter yang berguna dalam lingkungan multi-simbol.
1 | |
Mengagregasi laba atau volume menggunakan sum() adalah pendekatan standar dalam strategi trading grid untuk menentukan kapan total laba memenuhi target.
1 | |
Anda dapat menggabungkan penyaringan dan agregasi dengan cara ini:
1 2 | |
Operasi sinkron dan asinkron
Python mengikuti model eksekusi sinkron secara default. Metode siklus hidup algoritma Anda, seperti on_start, on_tick dan on_bar_closed, dipicu oleh loop event platform, satu per satu.
Berikut adalah representasi dasar alur trading sinkron:
graph TD
A(Menemui sinyal) ==> B(Mengeksekusi order)
B ==> C(Posisi mencapai TP/SL)
C ==> D(Menutup posisi)
D ==> A Dalam alur sinkron, operasi yang berjalan lama dapat memblokir thread, berpotensi menunda event berikutnya. Namun, dalam strategi dunia nyata, algoritma biasanya memulai tindakan non-blocking, seperti mengirimkan order atau mengatur stop-loss dan take-profit, kemudian menunggu event di masa depan (seperti tick atau bar baru) untuk menangani hasilnya. Pengaturan ini menghasilkan orkestrasi mirip asinkron, meskipun konstruksi async/await Python tidak digunakan.
Catatan
Untuk sebagian besar algoritma trading, pemrograman asinkron eksplisit tidak diperlukan.
cTrader mengelola konkurensi dengan menserialkan callback berbasis event Anda. Setiap metode dipanggil secara independen dan tidak pernah secara paralel, menghilangkan kebutuhan untuk pengamanan multithreading. Desain ini memungkinkan strategi untuk merespons beberapa kondisi trading sekaligus, dalam arti logis, tanpa memblokir.
Dalam contoh di bawah ini, strategi mengevaluasi sinyal beli dan jual secara independen dan merespons sesuai, tanpa tumpang tindih dalam konteks eksekusi.
graph TD
A([Menerima sinyal]) ==> B([Membuka order beli]) & C([Membuka order jual untuk<br> lindung nilai]) ==> D([Sebuah order mencapai<br>take profit atau stop loss])
D ==> E([Menutup posisi])
E ==> A Meskipun keputusan mungkin tampak paralel, mereka ditangani secara berurutan oleh sistem antrian internal cTrader. Arsitektur platform bertujuan untuk mencegah masalah konkurensi sambil menjaga robot trading responsif terhadap perubahan pasar.
