Ana içeriğe geç

cTrader'da teknik gösterge oluşturun

Bu makale, cTrader'da algoritmik işlem yapma veya manuel eylemler için araçlar dahil olmak üzere özel teknik göstergeler oluşturma adımlarını özetlemektedir.

İpucu

Adım adım bir kılavuzda bir video izleyerek teknik göstergeler oluşturmayı öğrenin.

Algo uygulamasının Göstergeler sekmesinde, algoritma oluşturma sihirbazını açmak için Yeni düğmesine tıklayın.

Göstergeniz için bir ad girin, ardından C# ve Python arasında bir programlama dili seçin.

Bir oluşturma yöntemi seçin:

  • Sıfırdan – yeni gösterge yalnızca temel bir şablon içerecektir.

  • Şablon kullanarak – çok çeşitli gösterge türlerini, teknik analiz araçlarını ve daha fazlasını kapsayan Python# veya C# şablonları listesinden önceden hazırlanmış bir algoritma seçebileceksiniz.

Not

Önceden hazırlanmış algoritmalar, hesaplamalar ve özelleştirilebilir parametreler için zaten mantık içerir. Bu tür göstergeler, kaydedip oluşturduktan sonra grafiklerde görüntülenmeye hazırdır.

Oluştur'a tıkladıktan sonra, kod düzenleyici açılır ve gösterge kodunu düzenlemeye başlayabilirsiniz.

Kodu düzenle

Oluşturma yönteminize bağlı olarak, gösterge kodu örneği aşağıdaki öğelerden bir veya daha fazlasını içermelidir:

 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
[Indicator(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class SimpleIndicator : Indicator
{
    [Parameter(DefaultValue = "Hello world!")]
    public string Message { get; set; }

    [Output("Main")]
    public IndicatorDataSeries Result { get; set; }

    protected override void Initialize()
    {
    // Called once when the indicator is launched
    // Initialise variables, nested indicators or series

        Print(Message);
    }

    public override void Calculate(int index)
    {
    // Called automatically on each historical bar
    // Also called in real-time on each tick
    // Place the indicator formula and logic here
    }

    // === Custom Methods ===
    // Add helper methods below to structure your indicator logic

}

Indicator özniteliği, TimeZone ve AccessRights gibi isteğe bağlı özellikleri ile birlikte, gösterge sınıfı (SimpleIndicator) bildiriminden önce gelir.

Bu yöntemler her göstergeye varsayılan olarak dahildir:

  • Initialize() yöntemi, göstergeniz başladığında bir kez çağrılır. Genellikle değişkenleri, iç içe göstergeleri ve başlangıçtan itibaren hazır olması gereken serileri ayarlamak için kullanılır.
  • Calculate() yöntemi, her geçmiş çubukta otomatik olarak ve her yeni tick'te gerçek zamanlı olarak çağrılır. Burası, göstergenin formülünü uyguladığınız ve sonuçların nasıl hesaplanıp görüntüleneceğini tanımladığınız yerdir.

[Output()] özniteliği, göstergenizin ürettiği değerleri ve bunların grafikte nasıl göründüğünü belirtir. Her çıktının adını ve stilini, örneğin çizgi rengini ayarlayarak özelleştirebilirsiniz.

Initialize() ve Calculate() yöntemleri, her özel göstergenin temelini oluşturur ve asla atlanmamalıdır. Bir cBot kodlarken yaptığınız gibi, işlevselliği genişletmek için kendi yöntemlerinizi ekleyebilirsiniz. Algoritmalar hakkında daha fazla bilgi edinmek için C# temelleri kılavuzuyla başlayın ve gösterge kodu örneklerini keşfedin.

Not

Referanslar cTrader'da algoritmalar oluşturmak için tüm sınıfları, olayları, yöntemleri, değişkenleri vb. içerirken, tam algoritma örnekleri ve şablonları bir GitHub deposunda mevcuttur.

Yeni bilginizi gösterge kodunu düzenlemek ve ihtiyaçlarınıza uyarlamak için uygulayın.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class SimpleIndicator:
    def initialize(self):
        # Called once when the indicator is launched
        # Initialise variables, nested indicators or series
        api.Print(api.Message)

    def calculate(self, index):
        # Called automatically on each historical bar
        # Also called in real-time on each tick
        # Place the indicator formula and logic here
        api.Result[index] = 100 # Example calculation

    # === Custom Methods ===
    # Add helper methods below to structure your indicator logic

SimpleIndicator sınıfı, Python'da özel bir gösterge tanımlar.

Bu yöntemler her göstergeye varsayılan olarak dahildir:

  • initialize(self) yöntemi, göstergeniz başladığında bir kez çağrılır. Genellikle değişkenleri, iç içe göstergeleri ve başlangıçtan itibaren hazır olması gereken serileri başlatmak için kullanılır.
  • calculate(self, index) yöntemi, her geçmiş çubukta otomatik olarak ve her yeni tick'te gerçek zamanlı olarak çağrılır. Burası, göstergenin formülünü uyguladığınız ve sonuçların nasıl hesaplanıp görüntüleneceğini tanımladığınız yerdir.

initialize(self) ve calculate(self, index) yöntemleri, her özel göstergenin temelini oluşturur ve asla atlanmamalıdır. Bir cBot kodlarken yaptığınız gibi, işlevselliği genişletmek için sınıfın içine kendi yardımcı yöntemlerinizi de ekleyebilirsiniz. Algoritmalar hakkında daha fazla bilgi edinmek için Python temelleri ile başlayın ve gösterge kodu örneklerini keşfedin.

Yeni bilginizi gösterge kodunu düzenlemek ve ihtiyaçlarınıza uyarlamak için uygulayın.

Kaydet ve oluştur

Kodunuzu kod düzenleyicinin üst kısmındaki Kaydet düğmesine tıklayarak veya Ctrl+S kısayolunu kullanarak kaydedin.

Göstergenizi kullanmadan önce, gösterge projesini oluşturarak kodunu doğrulamanız gerekir. Kod düzenleyicinin üst kısmındaki Derle düğmesine tıklayın veya Ctrl+B tuşlarına basın.

Kodunuzu kod düzenleyicinin üst kısmındaki Kaydet simgesine tıklayarak veya Cmd+S kısayolunu kullanarak kaydedin.

Göstergenizi kullanmadan önce, gösterge projesini oluşturarak kodunu doğrulamanız gerekir. Kod düzenleyicinin üst kısmındaki Derle simgesine tıklayın veya Cmd+B tuşlarına basın.

Derleme başarılı olduğunda, Derleme sonucu bölümünde bir onay mesajı görürsünüz. Derleme başarısız olursa, bunun yerine karşılaşılan tüm hataların bir özeti görünür.

Son derlemeden bu yana kodda değişiklikler varsa, Derle simgesinin yanında bir yıldız işareti görünür. Bu durumda, göstergenin bir örneğini herhangi bir grafiğe eklemeden önce göstergeyi tekrar oluşturmalısınız.

Göstergeyi bir grafikte kullanmak veya görüntülemek için bir örneğini ekleyin veya bölümlerde açıklandığı gibi gösterge kodunu değiştirmeye devam edebilirsiniz.

NaN aritmetiği kullanın

Göstergeler belirli görselleri çıkarmak için hesaplamalar yapar ve kodunuzun bu hesaplamalar sırasında uç durumları ve sınır koşullarını doğru şekilde ele alması çok önemlidir.

Bir detrended price oscillator çıktısı veren bir göstergeden aşağıdaki kod parçasını inceleyin:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
private MovingAverage movingAverage;

protected override void Initialize()
{
    movingAverage = Indicators.SimpleMovingAverage(Source, Periods);
}

public override void Calculate(int index)
{
    Result[index] = Source[index] - movingAverage.Result[index - Periods / 2 - 1];
}

Yukarıdaki kod genel hesaplama kurallarını tanımlar ancak sınır koşullarını atlar. Örneğin, Periods 10 olarak ayarlanmışsa ve index 0–9 aralığına düşerse, hesaplama NaN (Sayı Değil) döndürecektir. Bu sorun, göstergenin negatif bir dizine sahip bir çubuk grafik için değerleri hesaplayamaması nedeniyle oluşur.

Sorunu çözmek için aşağıda gösterildiği gibi bir koşul ekleyebilirsiniz:

1
2
3
4
5
6
7
public override void Calculate(int index)
{
    if (index >= Periods + Periods / 2 + 1)
    {
        Result[index] = Source[index] - movingAverage.Result[index - Periods / 2 - 1];
    }
}

Basit hareketli ortalama kodunun kendisi de index >= Periods olduğunu kontrol etmelidir. Başka bir hareketli ortalama türü gibi iç içe bir gösterge kullanırsanız, koşul ek hesaplamaları hesaba katmak için farklılık gösterecektir.

Açık sınır koşulları tanımlayabilseniz de, C# bu sorunlardan NaN aritmetiği aracılığıyla kaçınmak için uygun bir yol sunar. Özellikle, double veri türü NaN hesaplamalarını tam olarak destekler. Örneğin:

1
2
3
4
5
double result = double.NaN + 1.4; 
// result will be NaN

bool isNaN = double.IsNaN(result); 
// isNaN will be true

Ancak, bir hesaplamadaki herhangi bir işlenen NaN olduğunda, sonuç da NaN olacaktır. Özel cTrader göstergeleri DataSeries türü üzerinde çalıştığından, negatif bir dizinle bir DataSeries öğesine erişmeye çalışırsanız, NaN döndürecektir ve değer işlem grafiğine çizilmeyecektir. Bu davranış, göstergenin istisnalar fırlatmadan çalışmaya devam etmesini sağlar. Çoğu durumda, sınır koşullarını güvenle göz ardı edebilir ve yalnızca genel hesaplama mantığına odaklanabilirsiniz.

Açık kontroller ekle

NaN aritmetiği sınır koşullarını ele almayı basitleştirse de, bazı durumlarda hala açık NaN kontrolleri gereklidir. Özyinelemeli göstergeler yaygın bir örnektir. Özyinelemeli bir gösterge, mevcut değerini daha önce hesaplanan değere göre hesaplar.

Üstel hareketli ortalamanın aşağıdaki uygulamasını inceleyin:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public override void Calculate(int index)
{
    var previousValue = Result[index - 1];

    if (double.IsNaN(previousValue))
    {
        Result[index] = Source[index];
    }
    else
    {
        Result[index] = Source[index] * _exp + previousValue * (1 - _exp);
    }
}

Gösterge ilk dönemi hesapladığında, başlangıç değeri açıkça NaN olmayan bir türe ayarlanmalıdır. Aksi takdirde, sonraki tüm hesaplamalar NaN döndürür ve göstergeyi kullanılamaz hale getirir.

Yukarıdaki kodda bu, double.IsNaN(previousValue) yöntemiyle ele alınır. Bu kontrol için == operatörü (previousValue == double.NaN) kullanılamaz çünkü NaN'ın kendisi de dahil olmak üzere başka bir değerle herhangi bir karşılaştırması her zaman false olarak değerlendirilir.

Gösterge kodundan memnun kaldığınızda, onu derleyin ve ardından bir grafiğe bir örnek ekleyerek kullanın.

Image title