Sampel kode indikator
Halaman ini menyediakan beberapa contoh kode Python dan C# untuk membuat indikator teknis yang digunakan untuk trading manual atau algoritmik.
Repositori sampel indikator
Sampel kode indikator yang komprehensif, termasuk template siap pakai untuk berbagai jenis indikator dan alat analisis teknis, tersedia di repositori Python dan C# terpisah di GitHub.
Indikator sederhana
Indikator high minus low menghitung selisih antara harga tertinggi dan terendah dari bar saat ini dan menampilkannya dalam serangkaian output. Rangkaian tersebut digambar pada grafik sebagai garis yang menghubungkan nilai-nilai yang dihasilkan di setiap bar.
1 2 3 4 5 6 7 8 9 10 11 | |
Catatan
Indikator Python menggunakan parameter yang dapat disesuaikan yang dideklarasikan dalam file .cs mereka.
1 2 3 4 5 6 7 | |
Deklarasi [Indicator...] mencakup beberapa parameter yang didefinisikan sebagai berikut:
IsOverlay- boolean yang menentukan apakah garis akan ditampilkan di atas grafik atau ditampilkan di panel UI terpisah.TimeZone- field kelasTimeZonesyang menentukan zona waktu data indikator dan waktu server.AccessRights- field kelasAccessRightsyang menentukan hak akses yang dialokasikan untuk indikator Anda.ScalePrecision- int yang mengatur presisi skala output indikator.
Seperti yang telah Anda pelajari sebelumnya saat mengedit kode indikator, atribut Output dideklarasikan untuk menandai properti sebagai output indikator. Properti ini harus public agar dapat dirujuk oleh kelas lain.
Output indikator harus selalu bertipe data IndicatorDataSeries yang merupakan daftar double yang dapat diindeks seperti array. Oleh karena itu, nilai pada setiap [index] dalam daftar Result dapat ditetapkan dalam metode Calculate sebagai berikut.
1 2 3 4 | |
1 2 | |
Indikator dengan parameter
Dalam kebanyakan kasus, output indikator dapat bervariasi tergantung pada input pengguna. Cara pengaturan parameter yang dapat disesuaikan untuk indikator mirip dengan cara ini dilakukan untuk cBot.
Indikator simple moving average di bawah ini dirancang untuk menerima sumber harga dan periode sebagai parameter yang dapat disesuaikan. Parameter seperti itu (Source dan Periods dalam contoh ini) harus didahului oleh atribut Parameter.
Mirip dengan atribut [Indicator()] dan [Output()] yang dibahas sebelumnya, atribut [Parameter()] dapat mendefinisikan karakteristik tertentu yang diterapkan pada input pengguna.
1 | |
Catatan
Indikator Python menggunakan parameter yang dapat disesuaikan yang dideklarasikan dalam file .cs mereka.
Di atas, kita menentukan karakteristik berikut:
- Nama yang ditampilkan untuk menandakan parameter ini di UI cTrader (
"MA Periods"). - Nilai default parameter; dapat diubah oleh pengguna saat menyesuaikan instance (
DefaultValue = 14) - Nilai minimum dan maksimum parameter (
MinValue = 1, MaxValue = 20)
Dalam cuplikan berikut, kami menunjukkan bagaimana parameter yang dapat disesuaikan dapat diintegrasikan ke dalam kode indikator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
Catatan
Indikator Python menggunakan parameter yang dapat disesuaikan yang dideklarasikan dalam file .cs mereka.
1 2 3 4 5 6 7 8 | |
Indikator bersarang
Indikator bersarang didefinisikan sebagai indikator yang nilainya bergantung pada hasil perhitungan yang dilakukan oleh indikator lain. Indikator ini berguna saat menulis jenis ekstensi tertentu seperti indikator DeMark 9. Perhatikan contoh kode berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
Catatan
Indikator Python menggunakan parameter yang dapat disesuaikan yang dideklarasikan dalam file .cs mereka.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Dalam contoh di atas, deMinMA dan deMaxMA adalah dua variabel yang digunakan untuk menghitung nilai indikator DeMarker kita.
Indikator bersarang perlu didefinisikan dalam metode Initialize(). Misalnya, deMinMA didefinisikan sebagai simple moving average dari rangkaian deMin.
1 | |
1 | |
deMin, pada gilirannya, didefinisikan dalam metode Calculate() sebagai nilai maksimum dari dua nilai harga terendah terakhir.
1 | |
1 | |
Untuk menyederhanakan penggunaan indikator bersarang, IntelliSense secara otomatis mengisi daftar semua indikator bawaan ketika Anda mengetik Indicators diikuti dengan titik ke dalam editor kode. Ini juga akan menampilkan semua parameter input terkait setelah Anda memilih indikator tertentu dari daftar ini.

Pemuatan lambat
cTrader Algo menggunakan lazy loading saat Anda menggunakan indikator yang direferensikan. Nilai-nilai yang disediakan oleh indikator yang direferensikan tidak dihitung sampai kode Anda mulai aktif menggunakannya.
Jika Anda mengakses data Outputs dari indikator yang direferensikan, cTrader akan mulai memuat data indikator dengan memanggil metode Calculate() pada bar masa lalu dan masa depan. Dalam kasus lain, indikator yang direferensikan akan tetap idle dan, oleh karena itu, tidak akan mengkonsumsi sumber daya sistem.
Ini juga berarti bahwa jika indikator Anda tidak memiliki Output atau jika Anda mencoba mengakses salah satu properti publiknya, Anda akan mendapatkan nilai default dari properti yang dimaksud. Untuk mengatasi masalah ini, panggil metode Calculate() dari indikator kustom Anda dari metode Calculate() indikator saat ini.
Osilator dan atribut levels
Istilah "osilator" mencakup semua indikator yang berosilasi di sekitar variabel konstan tertentu.
Saat membuat osilator, sangat berguna untuk terlebih dahulu menggambar garis horizontal atau "level" pada nilai konstan tersebut; indikator kemudian akan berosilasi di sekitar garis ini. Dalam banyak kasus, nilai konstan sama dengan nol.
Dalam contoh di bawah ini, kita mendefinisikan osilator momentum. Biasanya berosilasi di sekitar nilai 100. Kita menambahkan garis level pada nilai ini menggunakan atribut Levels yang dideklarasikan sebelum atribut indikator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Catatan
Indikator Python menggunakan parameter yang dapat disesuaikan yang dideklarasikan dalam file .cs mereka.
1 2 3 4 | |
Perhatikan bahwa atribut Levels hanya dapat digunakan jika indikator tidak ditampilkan di atas grafik, yang berarti properti IsOverlay tidak diatur ke true. Secara default, nilai IsOverlay adalah false. Jika atribut ini dihilangkan dari kode Anda, Levels seharusnya berfungsi dengan baik.
Jika Anda perlu membuat beberapa garis "level", tambahkan daftar nilai yang dipisahkan koma dalam tanda kurung seperti yang ditampilkan di bawah ini.
1 | |
1 | |
1 | |
Level dalam Indikator Python
Dalam Python, Anda mendeklarasikan Level dalam file indikator C# Anda sama seperti indikator C#.
Properti IsLastBar
Dalam beberapa kasus, Anda mungkin ingin membuat indikator yang harus dihitung hanya untuk bar terakhir dalam grafik trading. Menyederhanakan hal ini, properti IsLastBar dapat digunakan untuk memeriksa apakah parameter indeks dari metode Calculate() adalah bar terakhir.
Indikator di bawah ini didasarkan pada waktu UTC; namun, dapat menampilkan waktu buka terakhir di New York dan Tokyo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Menggabungkan indikator
cTrader memungkinkan untuk menggabungkan beberapa indikator dalam panel yang sama atau dalam grafik yang sama.
Indikator berikut menggabungkan indikator Aroon, RSI, dan sistem pergerakan arah dalam satu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
Catatan
Indikator Python menggunakan parameter yang dapat disesuaikan yang dideklarasikan dalam file .cs mereka.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Beberapa timeframe
-
Menggunakan beberapa timeframe
Contoh berikut menampilkan indikator moving average pada timeframe yang berbeda.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
[Indicator(IsOverlay = true, TimeZone = TimeZones.UTC)] public class MultiTF_MA : Indicator { [Parameter(DefaultValue = 50)] public int Period { get; set; } [Output("MA", LineColor = "Yellow")] public IndicatorDataSeries MA { get; set; } [Output("MA5", LineColor = "Orange")] public IndicatorDataSeries MA5 { get; set; } [Output("MA10", LineColor = "Red")] public IndicatorDataSeries MA10 { get; set; } private Bars bars5; private Bars bars10; private MovingAverage ma; private MovingAverage ma5; private MovingAverage ma10; protected override void Initialize() { bars5 = MarketData.GetBars(TimeFrame.Minute5); bars10 = MarketData.GetBars(TimeFrame.Minute10); ma = Indicators.MovingAverage(Bars.ClosePrices, Period, MovingAverageType.Triangular); ma5 = Indicators.MovingAverage(bars5.ClosePrices, Period, MovingAverageType.Triangular); ma10 = Indicators.MovingAverage(bars10.ClosePrices, Period, MovingAverageType.Triangular); } public override void Calculate(int index) { MA[index] = ma.Result[index]; var index5 = bars5.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]); if (index5 != -1) MA5[index] = ma5.Result[index5]; var index10 = bars10.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]); if (index10 != -1) MA10[index] = ma10.Result[index10]; } }Catatan
Indikator Python menggunakan parameter yang dapat disesuaikan yang dideklarasikan dalam file
.csmereka.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
class MultiTF_MA(): def initialize(self): self.bars5 = api.MarketData.GetBars(TimeFrame.Minute5) self.bars10 = api.MarketData.GetBars(TimeFrame.Minute10) # Period is declared as a parameter in the C# file # We use indicator time frame bars for this moving average self.ma = Indicators.MovingAverage(api.Bars.ClosePrices, api.Period, MovingAverageType.Triangular) # We use other two time frame bars that we created previously # for these two moving averages self.ma5 = Indicators.MovingAverage(self.bars5.ClosePrices, api.Period, MovingAverageType.Triangular) self.ma10 = Indicators.MovingAverage(self.bars10.ClosePrices, api.Period, MovingAverageType.Triangular) def calculate(self, index): # MA, MA5, and MA10 are outputs we declared in the C# file api.MA[index] = self.ma.Result[index] index5 = self.bars5.OpenTimes.GetIndexByTime(api.Bars.OpenTimes[index]) if index5 > -1: api.MA5[index] = self.ma5.Result[index5] index10 = self.bars10.OpenTimes.GetIndexByTime(api.Bars.OpenTimes[index]) if index10 > -1: api.MA10[index] = self.ma10.Result[index10] -
Menggunakan beberapa timeframe dan simbol
Contoh berikut menampilkan indikator moving average pada beberapa timeframe dan simbol.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
[Indicator(IsOverlay = true, TimeZone = TimeZones.UTC)] public class MultiSymbolMA : Indicator { private MovingAverage ma1, ma2, ma3; private Bars bars2, bars3; private Symbol symbol2, symbol3; [Parameter(DefaultValue = "EURCHF")] public string Symbol2 { get; set; } [Parameter(DefaultValue = "EURCAD")] public string Symbol3 { get; set; } [Parameter(DefaultValue = 14)] public int Period { get; set; } [Parameter(DefaultValue = MovingAverageType.Simple)] public MovingAverageType MaType { get; set; } [Output("MA Symbol 1", LineColor = "Magenta")] public IndicatorDataSeries Result1 { get; set; } [Output("MA Symbol 2", LineColor = "Magenta")] public IndicatorDataSeries Result2 { get; set; } [Output("MA Symbol 3", LineColor = "Magenta")] public IndicatorDataSeries Result3 { get; set; } protected override void Initialize() { symbol2 = Symbols.GetSymbol(Symbol2); symbol3 = Symbols.GetSymbol(Symbol3); bars2 = MarketData.GetBars(TimeFrame, symbol2.Name); bars3 = MarketData.GetBars(TimeFrame, symbol3.Name); ma1 = Indicators.MovingAverage(Bars.ClosePrices, Period, MaType); ma2 = Indicators.MovingAverage(bars2.ClosePrices, Period, MaType); ma3 = Indicators.MovingAverage(bars3.ClosePrices, Period, MaType); } public override void Calculate(int index) { ShowOutput(Symbol, Result1, ma1, Bars, index); ShowOutput(symbol2, Result2, ma2, bars2, index); ShowOutput(symbol3, Result3, ma3, bars3, index); } private void ShowOutput(Symbol symbol, IndicatorDataSeries result, MovingAverage movingAverage, Bars bars, int index) { var index2 = bars.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]); result[index] = movingAverage.Result[index2]; string text = string.Format("{0} {1}", symbol.Name, Math.Round(result[index], symbol.Digits)); Chart.DrawStaticText(symbol.Name, text, VerticalAlignment.Top, HorizontalAlignment.Right, Color.Yellow); } }Catatan
Indikator Python menggunakan parameter yang dapat disesuaikan yang dideklarasikan dalam file
.csmereka.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
class MultiSymbolMA(): def initialize(self): # Symbol2 and Symbol3 are declared as parameters in the C# file self.symbol2 = api.Symbols.GetSymbol(api.Symbol2) self.symbol3 = api.Symbols.GetSymbol(api.Symbol3) self.bars2 = api.MarketData.GetBars(api.TimeFrame, self.symbol2.Name) self.bars3 = api.MarketData.GetBars(api.TimeFrame, self.symbol3.Name) self.ma1 = api.Indicators.MovingAverage(api.Bars.ClosePrices, api.Period, api.MaType) self.ma2 = api.Indicators.MovingAverage(self.bars2.ClosePrices, api.Period, api.MaType) self.ma3 = api.Indicators.MovingAverage(self.bars3.ClosePrices, api.Period, api.MaType) def calculate(self, index): # Result1, Result2, and Result3 are declared as outputs in the C# file self.show_output(api.Symbol, api.Result1, self.ma1, api.Bars, index) self.show_output(self.symbol2, api.Result2, self.ma2, self.bars2, index) self.show_output(self.symbol3, api.Result3, self.ma3, self.bars3, index) def show_output(self, symbol, result, movingAverage, bars, index): index2 = bars.OpenTimes.GetIndexByTime(api.Bars.OpenTimes[index]) result[index] = movingAverage.Result[index2] text = f"{symbol.Name} {round(result[index], symbol.Digits)}" api.Chart.DrawStaticText(symbol.Name, text, VerticalAlignment.Top, HorizontalAlignment.Right, Color.Yellow)
