C# Temel Kavramlar

Sistem Modülü

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ı

  • Kullanıcı tarafından girilecek tüm önceden tanımlı bilgiler (sayılar, fiyatlar, periyotlar, semboller, süreler vs) birer değişken olarak tanımlanır. (değişkenler ve tanımlanmaları aşağıda açıklanacaktır)
  • IDEAL üzerinden elde edilecek tüm veriler ve bilgiler (yüzeysel, derinlik, grafik veya indikatör verileri) ilgili fonksiyonlarla okutulup (Her fonksiyonun kullanım şekli ve örnekleri IDEAL SİSTEM FONKSİYONLARI menüsü altında anlatılmıştır.) birer değişkene atanır.
  • Formül süresince bazı hesaplamalar sonucu elde edilecek yeni bilgiler veya listeler için de birer değişken tanımlanır.
  • Her değişken tanımlandığında, değişkene bir değer atamak şarttır. (bu değer BOŞLUK (NULL) veya SIFIR olabilir.
  • Değişken tanımlamak için değişkenin tipini yazıp bir boşluk bırakıp, tanımlanan değişkene bir isim verilir. (değişken isimleri Türkçe karakter veya noktalama işaretleri içeremez, birden fazla kelimeden oluşamaz ve büyük küçük harfe duyarlıdır.)
  • Değişken tanımı bir atama ile (değişkeni bir değere eşitlemek ile) tamamlanır. Bu durumda değişken tanımlanan satır DEGISKENTİPİ (BOŞLUK)DEGISKENE VERİLEN İSİM = DEĞER
  • Son olarak satırın tamamlandığı bilgisi için satır sonuna NOKTALI VİRGÜL konur. (bazı özel durumlar hariç her satırın tamamlandığı bilgisi için satır Noktalı Virgül ile bitirilir.)
  • Tam satır şu şekilde oluşur:  DEGISKENTİPİ (BOŞLUK)DEGISKENE VERİLEN İSİM = DEĞER;

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:

  • var = Global/Genel değişken tipi. Bu türde değişkenlere bir değer verildiği zaman, o değerin (sayı, tarih, metin vs) formatına uygun bir tipte veri saklar.
  • int = Tam Sayı cinsinde veriler için kullanılır (1,3,10,2500 vs)
  • float = kesirli sayısal değerler için kullanılır
  • single = çok sayıda ondalık basamak içeren reel sayılar için kullanılır
  • double = çok sayıda ondalık basamak içeren reel sayılar için kullanılır
  • string = yazı/metin formatındaki bilgiler için kullanılır

Ö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.

  • –          x > x                   x BÜYÜKTÜR y
  • –          x y                   x KÜÇÜKTÜR y
  • –          x == y                 x EŞİTTİR y
  • –          x != y                  x EŞİT DEĞİLDİR y
  • –          x >= y                 x BÜYÜKTÜR VEYA EŞİTTİR y
  • –          x <= y                 x KÜÇÜKTÜR VEYA EŞİTTİR y
  • –          x && x               x VE y
  • –          x || x                    x VEYA y  (Bu işaret ALTGR ile TİRE/EKSİ işaretine basılarak yapılır)

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

  •    Parantezin içindeki ilk bilgi (x), döngünün uygulanacağı listenin başlangıç değeri (veya kaç numaralı elemanından itibaren). Yazının en başında bahsettiğimiz bazı C# kuralları burada tekrar devreye girer:
    • Her bilgi satırı NOKTALI VİRGÜL ile biter
    • Döngünün başlangıç ve bitiş değerlerini bir değişken kontrol eder. Bu nedenle değişken tanımlama kuralı gereği DEGISKENTIPI (BOŞLUK) DEGISKENADI = DEĞER; kalıbı ile ilk döngü bilgisi verilmiş olur. (Bar numaraları birer birer artacağından, bize TAMSAYI değişkeni yeterli bu yüzden x değişkenimizin tipini “int” yaptık)
  •          Parantezin içine girilmesi gereken ikinci bilgi, döngünün ne zaman sona ereceğidir. Yani örneğimizdeki “x” kaç olana kadar bu işlem yapılsın. (Örnekte x = 99 olana kadar işlemler sürer. 100’ün de dahil olması için KÜÇÜK EŞİT ifadesi yazılmalı)
    • Bu da bir bilgi alanıydı ve diğer bilgi alanları gibi NOKTALI VİRGÜL İLE bitirildi.
  •          Parantezin içindeki son bilgi, ilk değerden son değere kadar dönecek olan işlemler boyunca, x değeri kaçar kaçar artacak. Birer birer artacaksa değişken adının yanına iki tane “+” işareti konur (x++ ile x=x+1 aynı şeydir.)
    • Döngüyü bar bar yapmayıp, başka bir değere göre yapıyorsak ve tarama birer birer artan değerler için değilse, döngüdeki x değişkenini integer (int) olarak değil double (reel sayı) olarak tanımlarız.
    • Örneğin
      for (double x=0.25; x <= 10; x+=0.05)

      Bu döngüde, işlemler, x değerinin 0.25’ten başlayıp 10 olana kadar (10 dahil) ilerlenir ve her seferinde x değeri 0.05 arttırılır.

  •         for ve if/else komut satırlarında (ve bu bloklar için açılmış olan güzel parantezlerin olduğu satırlara) NOKTALI VİRGÜL KONULMAZ.

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–)

Kütüphane

Yardıma mı İhtiyacınız Var?

Ürünlerimiz veya hizmetlerimizle ilgili yardıma ihtiyacınız varsa, lütfen bizimle temasa geçin.

0212 385 3535
bilgi@idealdata.com.tr

Daha Fazla Bilgiye mi İhtiyacınız Var?

Ürünlerimiz veya hizmetlerimizle ilgili yardıma ihtiyacınız varsa, lütfen bizimle temasa geçin.