iDeal Sistem Modülünü kullanırken bilinmesinde yarar olan Temel C# Yazılım dili kuralları

iDeal Sistem modülünde C# yazılım dili kurallarına göre formül yazılır. iDeal tarafından sunulan hazır fonksiyonlarla birlikte, C# dilinde yazılım geliştirirken kullanılabilecek hemen hemen tüm C# komutlarını da kodlarınızda kullanabilirsiniz.

Yazılımcılık konusunda deneyimli olan kullanıcılar C# kodlamanın elverdiği hemen hemen tüm imkânları kullanarak formül yazabilirler. Örneğin bir sayının karesi C# dilinde Math.Pow(x,2) şeklinde alınır ve aynı yazım şekli ideal formüllerinde de kullanılabilir.

IDEAL Sistem Modülünde bir sistem/formül yazma aşamalarında ihtiyaç duyabileceğiniz temel bilgileri ve önemli ipuçlarını aşağıda sıraladık.

IDEAL Üzerinde Formül Yazmanın Genel Akış Diyagramı

Değişken Tipleri

Sadece C# değil, diğer programlama dillerinde de en sık kullanılan elemanlar değişkenlerdir. Bilinen/bilinmeyen tüm VERİ değişkenlere atanır ve tüm hesaplamalar/kıyaslamalar ve yeni veri elde etmeler Değişkenler üzerinden elde edilir. Böylece kodlama anlaşılır ve sadeleşir.

En sık ihtiyaç duyulan değişken tipleri aşağıda gösterilmiştir:

ÖRNEKLER:

var x = 0;
var y = "";
int adet = 25;
float fiyat = 1.52f;
double oran = 0.1254;
string mesaj = "merhaba ideal";

EĞER İSE / DEĞİL İSE ve MANTIKSAL OPERATÖRLER (KIYASLAMALAR)

Sistem, Robot, indikatör formülü yazarken en çok ihtiyaç duyulan işlerden biri de bazı koşulların olup olmadığını kontrol etmektir. EĞER şöyle İSE böyle yap gibi kontrolleri if (EĞER) ve else (DEĞİLSE) komutlarıyla yaparız.

Bu tür kontrolleri yaparken de matematikteki mantıksal operasyonları kullanılırız. İhtiyaç duyacağınız mantıksal operatörler ve kullanım şekilleri aşağıda gösterilmiştir.

Bu durumda bir koşul sağlanıyorsa bir işi, sağlanmıyorsa başka bir işi yaptırtmak için aşağıdaki gibi bir kod satırı gerekir; (x değeri y değerinden küçükse, “a” değerini eksi 5, değilse 5 yap)

if (x < y)
      a = -5;
   else
      a = 5;   

Yazılım dillerinde (aksini yapacak komutlar kullanılmamışsa) kodlar satır satır okunur ve işletilir. Yukarıdaki örneği çalıştıran uygulama önce “if” satırına gelecek ve if parantezi içindeki koşula bakacak.

Koşul içindeki ifade DOĞRU ise ALT SATIRA geçecek ve orada söylenen işi yapacak, “else” satırını ve o satır altına yazılan işi direk atlayacaktır. Tam tersi durumda, if komutunun içindeki koşul sağlanmıyorsa, uygulama bu kez else (DEĞİLSE) satırında tanımlanan işi yapacaktır.

Eğer koşul sayısı birden fazla ise (Koşul1 sağlanıyorsa bir iş, koşul2 sağlanıyorsa bir başka iş, koşul3 sağlanıyorsa bir başka iş……. Hiçbiri sağlanmıyorsa bir başka iş) şeklinde seri olarak koşullar varsa komutun kullanım şekli şöyle olur:

EĞER (Koşul1)
       İŞ 1;
YOK EĞER (Koşul2)
       İŞ 2;
YOK EĞER (Koşul3)
       İŞ 3;
HİÇBİRİ
       İŞ 4;

Bu algoritmanın C# dilince yazımı şöyledir;

if (0 < x < 10)
      a = 0;
else if (10 < x < 20)
      a = 1;  
else if (20 < x < 50)
      a = 2;  
else
      a = 10;

Eğer, IF/ELSE koşullarının altında yaptırılacak işlemlere ait satır sayısı BİRDEN FAZLA İSE, tüm bu satırlar iki tane parantez (güzel parantez) içine alınmak zorundadır.

ÖRNEK:

if (x < y)
   { 
      a = -5;
      b = 10;
   }

else
   {
      a = 5;
      b = 100;
   }

LİSTELER TANIMLAMAK

IDEAL üzerinde formül yazarken genellikle LİSTELER kullanılacaktır. LİSTE birden fazla elemanı olan bir tablo gibi düşünülebilir. Zira Sistem/Robot formülleri genellikle hisse senedi, parite, endeks veya vadeli sözleşmelerin tarihsel GRAFİK VERİLERİ üzerinde kurulan strateji ve hesaplamalar içerir. GRAFİK VERİSİ, belirli bir zaman (periyot) boyunca her bir zaman dilimine karşılık bir veya birden fazla veri içeren (BARLAR) bir LİSTEDİR. Aynı şekilde İndikatörler de birer listedir ve her bir BARA karşılık bir değer içerirler. Zaman ekseninde (grafikteki yatay eksen) her bir zaman dilimine karşılık bir değeri olan listeler aslında aynı zamanda birer ÇİZGİDİR.

 

Bir hissenin AÇILIŞ,KAPANIŞYÜKSEK,DÜŞÜK fiyatları, Bir indikatörün değerleri, bir yatay çizgi vs. Hepsi birer listedir. IDEAL Sistem modülündeki pek çok fonksiyon, bir liste formatında veri okur ve kullanıcıya sunar.   Kullanıcılar, daha sonra hesaplanacak verileri atayacakları listeleri kodlarının başında, bir isim vererek sisteme tanımlarlar. Liste tanımlarken global değişken tipi olan “var” kullanılır. Diğer (sayı veya metin tipindeki) değişkenlerde olduğu gibi, listeleri tanımlarken de eleman listenin içindeki her bir elemanın başlangıçtaki değeri belirtilir.

 

Örnek:

var Listem1 = Sistem.Liste(x);

Bu örnekte Listem1 isimli bir liste tanımlanır ve listenin tüm elemanları başlangıçta x değeridir. (Boş listede x = 0) Örneğin grafiğe belli bir fiyat seviyesinde bir yatay çizgi çizilecekse ve o çizgiye SEVIYE adını verelim)

var SEVIYE = Sistem.Liste(95.400);
Sistem.Cizgiler[0].Deger = SEVIYE;

Satırlarını yazmak yeterli olacaktır. (Kütüphane Ana sayfamızdaki IDEAL Sistem Fonksiyonları kısmından, Liste ve Çizgiler isimli fonksiyonları kullanım detayları incelenebilir.)

LİSTELER ÜZERİNDE İŞLEM YAPMAK

Listeler üzerinde işlem yapmak için genel yazılım kuralı olarak birer isim verip değişkenler tanımlar ve işlemleri bu değişkenler üzerinden yaparız. Fakat Metastock ve benzeri programlarda alışılagelen yöntemle, doğrudan listelerin kendileri işleme tabi tutulamaz. Listeler, birden fazla eleman içerirler ve her türlü işlem (matematiksel işlem, mantıksal kıyas vb.) LİSTELERİN ELEMANLARI arasında yapılabilir.

Bir listenin her hangi bir elemanı, o listenin bir INDEX’i ile belirtilir.

Yani: Listenin x numaralı elemanı, liste adının yanına köşeli parantez içinde x yazılarak belirtilir.

ÖRNEK: Bir grafikte 1350 numaralı (ilk bar en eski bar) barın kapanış değeri KAPANISLAR[1350] olarak belirtilir ve bu şekilde kullanılır.

ÖRNEK2: KAPANISLAR isimli listeye, bir grafiğin barlarının kapanış fiyatları alınsın. 350 ve 500 numaralı barların kapanış fiyatlarının toplamı X olsun. X değerini bulalım;

var KAPANISLAR = Sistem.GrafikFiyatSec("Kapanis");
var X = KAPANISLAR[350] + KAPANISLAR[500];

ÖRNEK3: 100 numaralı bar kapanışı, önceki bar kapanışından büyükse, x değerini 1 arttır

var KAPANISLAR = Sistem.GrafikFiyatSec("Kapanis");
var x = 0;
if (KAPANISLAR[100] > KAPANISLAR[100-1])
    x = x+1;

(Burada 99 yazmak yerine özellikle 100-1 yazdık köşeli parantez içine. Aslında aynı şey ama sonraki satırlarda anlatılacak diğer örnek ve açıklamalara yatkınlık olsun diye 99 yerine 100-1 yazdık. )

DÖNGÜLER

IDEAL de formül yazarken en çok kullanılacak işlemlerin başında DÖNGÜLER gelir. DÖNGÜ, bir işlemi/hesaplamayı birden fazla kere yaptırtmak için kullanılır. Yani örnek olarak, MA5 ile MA100 değerlerini kıyaslayacaksak bu kıyaslamayı HER BAR BARDAKİ DEĞERLERİ için yapmak gerekir. 5’lik ve 100’lük ortalamaların birbirinden büyük/küçük olduğu ya da birbirini kestiği noktalar Birer BAR’dır ve bu kontrol HER BAR için yapılınca, sinyalin/koşulun hangi Bar’da olduğu, o barın fiyat/zaman/barno gibi bilgileri de elde edilmiş olur.

Yine örneğin, bir sembolün grafiğindeki Yüksek ve Düşük değerlerinin toplamının yarısına ihtiyacımız varsa, Yapılacak olan matematiksel işlem olan (H + L) / 2 işlemi HER BAR için yaptırılır ve HER BAR için çıkan sonuç, bir listenin o bara karşılık gelen elemanına yazılır. Bu işlemler DÖNGÜ içerisinde yapılır.

KALIP olarak her zaman kullanabileceğiniz döngü formatı şöyledir;

for (int x = 1; x < 100; x++)
  { 
     DÖNGÜ BOYUNCA YAPILACAK TÜM İŞLEMLER
  }

Bu kalıpta “for” kelimesi yazılıp bir parantez açılır ve 3 adet bilgi parantezin içine sırayla girilir ve parantez kapatılır

Artık döngü kalıbının içinde, listeler arasında kıyaslama, hesaplama ve bir başka listeye değer atama işlemleri yapılabilir. Burada dikkat edilecek tek nokta, yukarılarda da birkaç kez vurguladığımız gibi, işlem, kıyas veya atamayı yaparken listenin hangi elemanı olduğunu belirterek (idexini de yazarak) yapmaktır. Yani LISTEADI[x] şeklinde kullanmak.

ÖRNEK-1: Bir grafiğin High, Low ve Close değerlerini toplayıp 3’e bölelim ve sonucu ekranda çizgi olarak görelim: (Her satırın yanına, o satırda ne yapıldığına dair notlar düşülmüştür.)

var V = Sistem.GrafikVerileri ;    //Kodun uygulanacağı kodun, o an seçili periyodu için tüm grafiği (oku ve V isimli listeye al)
var C = Sistem.GrafikFiyatOku(V,"Kapanis"); //V listesinden (OHLC barlardan) KAPANIŞ FİYATI listesini oku ve C isimli listeye al
var H = Sistem.GrafikFiyatOku(V,"Yuksek"); // V listesinden (OHLC barlardan) HIGH FİYATI listesini oku ve H isimli listeye al
var L = Sistem.GrafikFiyatOku(V, "Dusuk"); // V listesinden (OHLC barlardan) LOW FİYATI listesini oku ve L isimli listeye al
var Sonuc = Sistem.Liste(0) ;    //Boş (bütün elemanları sıfır olarak tanımlanan) bir liste tanımla ve listeye “Sonuc” adını ver
 

for (int i = 1; i < V.Count; i++)    //1 numaralı bardan başla, V listesinin eleman sayısına kadar , “i” değerini BİRER BİRER arttır
{
   Sonuc[i] = ( H[i] + L[i] + C[i] ) / 3;     //her bir adımda (her bir “i” değeri için) H,L ve C listelerinin o bara denk 
                                               gelen elemanlarını H[İ], L[i] ve C[i] topla ve 3’e böl. Bunu boş listemizin
                                                “i” numaralı satırına yaz (Sonuc[i])
}
//DÖNGÜ bitince her bar için hesaplanıp Sonuc listesine yazma işi tamamlanmış olur ve Sonuc isimli liste 
bu satırda artık hesaplardan elde edilen değerlerle doldurulmuştur. 

Sistem.Cizgiler[0].Deger = Sonuc; //Sonuc isimli listeyi grafikte bir çizgi olarak göster.(yazılan formüle LISTE_DONGU
                                  ismi verilip, çift tıklanarak grafiğe uygulanmıştır.)

NOT: Grafik barlarını tarayarak yapılan işlemlerde, yukardaki kalıp, 1’den başlar ve bar sayısı kadar ileriye doğru ilerler. Yani ilk hesaplama/atama işlemi EN ESKİ TARİHLİ bar için yapılır.

Eğer işlemi ters sırayla yapmak istersek (önce en son bar, sonra birer birer geriye doğru en eski bara gitmek)

Kalıp şöyle olur: for (int x = 100;  x > 1;  x--)