NTL+ 'de uzman danışmanların yazma | Algoritmik Ticaret | IFCM Türkiye
IFC Markets Online CFD Broker

NTL+ dilinde uzman danışmanların yazma temelleri

Tanıtım

Bu makale, NTL+ dilinde ilk göstergesini yazmak isteyen programcılar içindir. İçinde uzman danışmanların bir dizi oluşturma özellikler açıklanacaktır ki onların bilinmesi birçok hataları ortadan kaldırıp yazma süresini azaltacaktır (Skript, NTL+ dilinde üç tip program birleştirir: danışmanlar, göstergeler ve utilitler).


Danışmanın oluşturulması.

Yeni danışmanı oluşturmak için Navigator penceresine geçin, Advisors klasörü üzerine farenin sağ tuşuyla tıklayın ve bağlam menüsünden Create fonksiyonunu seçin. Yeni danışman için yeni ad girmeniz istenecektir. Danışmanın adı için, Windows işletim sisteminde dosya adlarının yazım kuralları uygulanmaktadır: ad şu karakterleri içermemelidir *|\:"<>?/ .


Yeni bir dosya oluşturduktan sonra, Initialize(), Run(), DeInitialize() olmak üzere 3 fonksiyonu içeren başlangıç şablonu göreceksiniz. Bu fonksiyonların her biri bir danışman hayatının belirli bir anda çalıştırılır. Programcı bunları çağırmak zorunda değildir çümkü bu otomatik olarak yapılıyor.


Danışman çalıştırıldıktan hemen sonra, parametrelerin ilk başlatılması için tasarlanmış olan Initialize() fonksiyonu gerçekleştirilir. Unutmayın ki Initialize() fonksiyonunda ticaret işlemleri yapmanız gerekmiyor çünkü başlatıldığı anda ticaret parametrelerinin değerleri belirlenmeyebilir (örneğin, Bid ve Ask fiyatları, hesap verileri, pozisyon ve emirler hakkında bilgi).


Her tik geldiğinde, skript'in ana kodunun bulunması gerektiği Run() fonksiyonu çağrılır. Bu kodda piyasadaki mevcut durumu analiz edilebilir, ticaret işlemlerini gerçekleştirmek kararı alınabilir ya da herhangi bir matematiksel hesaplamalar yapılabilir. Her tik verilerin işlenmesi 10 saniye geçmemelidir, aksi halde program kullanıcı danışmanı otomatik olarak duracaktır.


Danışman durduğunda, skriptin durdurulmasından önce bazı nihai adımları gerçekleştiren DeInitialize() fonksiyonu çağrılır. Birçok skript'lerde initialization ve deinitialization sırasında bir şey yapmak gerekmez - bu durumda Initialize() ve DeInitialize() fonksiyonları boş bırakılabilir yada skript'ten silinebilir (terminal onları çağırmayacak).


Danışman kodunun yazılması ve algoritmin oluşturulması.

İlk adım, uzman danışmanınız tarafından gerçekleştirilecek algoritmayı geliştirmektir. Bu algoritma açık bir yapıya ve detaylı yorumlara sahip olmalı, bu da ileride onun modifikasyonu ve optimizasyonunu kolaylaştıracaktır.


Uzun ve kısa pozisyonların hangi ölçütler üzerinde açtırılacağını, onların hangi durumda kapanacağı, zaten açılmış olan pozisyonların sayısının nasıl kontrol edileceği ve sınırlanacakğını belirlemek gerek. Eğer sizin uzman danışman bekleyen emirleri (OCO ve aktifleştirilen emirleri dahil) ayarlayacaksa artık ayarlanmış olan emirlerin silinme ve değiştirilme imkanı için düşünün.


Pozisyonların doğru açma/kapatma, emir ayarlanma parametrelerinin seçilmesi, hepsi bir bütün olarak danışmanın başarısını etkiliyor. Bu yüzden stratejinin geliştirilmesi, başarılı ekspert oluşturulurken büyük önem taşımaktadır. Ticaret kriterleri teknik göstergeler, fiyat seviyeleri analizi ve diğer hesaplamalara dayalı olabilir.


Danışmanın çalışması sırasında elle müdahale olasılığınızı sağlamayı unutmayın: danışman pozisyonu açıp siz onu terminalde elle kapatacaksanız ne olur? Danışman, arızalanmasına yol açacak herhangi plansız duruma girip girmeyeceğini düşünün.


Düzgün çalışabilmesi için, açık pozisyonların ve her tikte ayarlanmış emirlerin durumunu analiz etmeniz gerekir. Burada, açık pozisyonların ve emirlerin sayısını döndüren Deals.Total ve Orders.Total özelliklerinin yanı sıra pozisyonu ve emri seçmek için Deals.Select() ve Orders.Select() yöntemleri yardımcı olacaktır.


Terminalin yeniden başlatma sonrasında da danışman çalışmasının restorasyonuna dikkat edin: başlatılmasından önceki duruma geçer mi? Yeniden başlatma arasında pozisyonların bir kısmının stop-loss veya take-profit ile kapatılabileceği olası durumları düşünün, ayrıca emirler gerçekleşebilir, bu da yeni pozisyonların açılmasına yol açabilecektir.


Danışman kodunda standart hatalar ve durumların oluşmasında eylemler göz önüne alınmalı: örneğin, pozisyon açmak için para yok veya emirlerin mevcut fiyata çok yakın ayarlanma tedbiri.


Hesap durumu verilerine erişim Account nesnesi ve onun özellikleri üzerinden sağlanabilir. Örneğin Account.Balance özelliği cari hesabın bakiyesini, Account.MarginFree de serbes marjini gösteriyor.


int Run() { // "volume" değişkenini başlatıyoruz - baz dövizin birimi olarak miktar int volume = 10000; if(Account.MarginFree < volume/Account.Leverage) return -1; }

«return -1» satırına dikkat edin - bu operatörün gerçekleşmesinde danışmanın çalışması zorla durduruluyor.


Koteler geçmişiyle çalışma.

Zaman serilerinin (Timeseries) kullanılma, bazı zaman önce görülmüş olan piyasa durumunun analizi için geçerli sembolün koteleri almayı sağlar. Zaman serileri, bir array grubudur: Open[] - barın açılış fiyatı, Close[] - barın kapanış fiyatı, High[] - barın maksimum fiyatı, Low[] - barın minimum fiyatı, Time[] - barın açılış zamanı ve Volume[] - barın tik hacmi (bardaki tik sayısı). Tüm zaman serileri, danışmanın çalıştığı sembol grafiği ve aralık (timeframe) için geçerlidir. Zaman serilerinde ters indeksleme kullanılır: en son (zaman açısından) unsur 0 indeksine sahip, ve ilk unsur Bars.Total(Chart.Symbol,Chart.Interval)-1 olacak.


Eğer rastgele karakter için veri almak istiyorsanız Bars nesnesini kullanmanız gerekecek. Onun metodları Open(), High(), Low(), Close(), Volume(), Time() ilgili zaman serilerine benzer ama bir tem fark; sembolü, bar boyutunu (aralık, zaman aralığı) ve değerini almak istediğiniz barın numarasını belirtmeniz gerektir. Skript çalıştırılmadan önce, sktiptin çalıştığı tüm semboller "Market watch" penceresinde mevcut olmalı. Onun için MarketWatch penceresini açın, farenin sağ tuşuyla boş alan üzerine tıklayıp bağlam menüsünden Subscribe komutasını seçin, gereken sembolleri işaretleyerek "OK" tuşunu tiklayın.


Uzman danışmanlarda, yeni bir barın ne zaman açıldığı ya da önceki barın şekillenmesinin bittiğini belirlemek gerekli olabilir. Bunun için Volume array'ını kullanabilirsiniz. Her tikte Volume[0] nesnesinin değeri bir artırılır, yeni barın ilk tikinden sonra ise 1'e eşit oluyor. Böylece, barın açma anını belirlemek için aşağıdaki tasarım uygundur:


int Run() { if(Volume[0]==1) { // Yeni bar açıldığında gerçekleşen kod. } }

Benzer bir şekilde, bir dışındaki tüm Volume[0] değerleri için Run() işlemi return operatörü yardımıyla bitirilebilir:


int Run() { if(Volume[0]>1) return (0); // Yeni bar açıldığında gerçekleşen kod. }

Bir başka alternatif yöntem, barın açma zamanının analiz edilmesidir: son iki tikin zamanı ötrüşüyorsa, o zaman skripted return(0) operatörü ile çıkıyoruz. Yeni bar oluşumunda, cari ve önceki tikte Time[0] için farklı değerleri alacağız, işte bu olay yeni barın açılması demektir.


datetime lasttime=0; int Run() { if(lasttime == Time[0]) return(0); // Yeni bar açıldığında gerçekleşen kod. lasttime = Time[0]; }

Danışmanın test edilmesi

Advisor Tester performansını ölçmek ve danışmanın çalışmasını kontrol etmek için tasarlanmıştır. Tester ana menünün View -> Advisor Tester işlevi ile çalıştırılır. Tester penceresinin üst kısmında aşağıdaki bölümler için sekmeler bulunmaktadır:


  • Parameters - Tester'in çalışma parametreleri
  • Results - pozisyonlar hakkında tablo şeklinde bilgilerin görüntülenmesi
  • Equity Graph - bakiye ve ekviti'nin değişmesi görüntülenmesi
  • Journal - dergi dosyası

Parameters

Parameters sekmesinde, test sürecini etkileyen şu parametreleri belirtebilirsiniz:


  • Açılan liste Advisor - test edilmesine tabi olacak danıçman seçimi.
  • Properties tuşu - düzenlemek için danışmanın ayarlarını çağrı. Eğer danışmanda, "extern" anahtar sözcüğüyle bildirilen parametreler yok ise o zaman buton aktif olmayacaktır.
  • Symbol - test için sembol*.
  • Interval - test için zaman aralığı (timeframe).
  • Spread - Spread değeri seçimi. Current spread değeri cari spread değerine tekabül. Spread alanında istediğiniz negatif olmayan değeri girebilirsiniz.
  • Method - test metodu. Aşağıdaki değerlerden birini seçebilirsiniz: Control Points veya Open Price Only.Control points seçtiğinizde her bar için dörder tik otomatik olarak oluşturulur (belirtilen sırayla). Açılış fiyatı kapanış fiyatından az olan barlar için tikler Open, Low, High, Close değerlerine tekabül ediyor; Açılış fiyatı kapanış fiyatından daka yüksek seviyede olan barlar için - Open, High, Low, Close.
    img
    Open Prices Only metodu için tüm ticaret işlemleri sadece açılış fiyatları üzerinde gerçekleştirilmektedir. Aynı anda zaman serilerinin sıfır endeksli öğeleri eşit olacak Open[0] = High[0] = Low[0] = Close[0], ve zaman serilerinin sıfır olmayan öğelerinin değerleri Control Points metodunun ilgili değerleri ile örtüşecektir.
  • İşaret kutusu Limit Dates test için tarih aralığını sınırlama fonksiyonunu açmak için tasarlanmıştır.
  • Tarih girme alanları From ve To test için tarih aralığını ayarlamak için kullanılır. Varsayılan değerler, belirtilen sembol ve aralık üzerinde yüklenen tarihin diyapazonuna tekabül etmaktedir.
  • Initial Deposit - testin başladığı andaki başlangıç depozito.
  • İşaret kutusu Enable visual mode, pozisyon açma/kapatma ve son açık pozisyon için emir yerleştirme anlarının işaretli olduğu grafiği gösterme için kullanılır.
  • İşaret kutusu Enable expert logs, System.Print fonksiyonundan Journal sekmesine yazdırma için kullanılır.
  • Start/Stop tuşu tester'in işini başlatıyor ve durduruyor.

Enable visual mode ve Enable expert logs işaret kutularının açması test hızını etkiliyor, o yüzden onları sadece gerektiğinde açmanız tavsiye edilir.


* Şu anda çok dövizli danışmanın test edilmesi sağlanmamaktadır. Eğer siz, birkaç semboldeki pozisyonla çalışan danışmanı test ediyorsanız ve bu sembollerin koteler tarihi diyapazonu örtüşmüyorsa, o zaman bid ve ask fiyatlarının, zaman serilerinin değerleri ve Bars nesnesi yöntemleriyle döndüren değerler sıfır olabilir.


Results

"Results" sekmesinde, test süresinde açılmış ve kapatılmış olan tüm pozisyonlar üzerinde bilgi gösterilmektedir. Aşağıda kapatılmış pozisyonları içeren tablo bulunmaktadır. Onda şu bilgi verilmekte:


  • Numara # - kapanmış pozisyonun sıra numarası. Ilk kapanmış pozisyon #1 alır, ikinci #2 vs.
  • Deal ID - kapanmış pozisyonunun tanımlayıcısı.
  • Symbol - üzerinde pozisyonun açıldığı sembol.
  • Volume1 - baz döviz cinsinden ifade edilen pozisyon miktarı
  • Volume2 - karşıt döviz cinsinden ifade edilen pozisyon miktarı
  • Open rate - açılış fiyatı
  • Open time - açılış zamanı
  • Stop loss - stop loss seviyesi (ayarlanmamışsa gösterilmemektedir)
  • Take profit - take profit seviyesi (ayarlanmamışsa gösterilmemektedir)
  • Last swap - mevcut pozisyondaki swap
  • Rate close - kapanış fiyatı
  • Time close - kapanış zamanı
  • Profit - pozisyon karı
  • Balance - pozisyon kapandıktan sonra bakiye*.
  • Equity - pozisyon kapandıktan sonra ekviti (varlık)*.

* Bu sütunlar genişletilmiş Show extended columns modunda görüntülenir. Bu mod tablonun bağlam menüsü aracılığıyla aktive edilir.


Alt tabloda, testin bittiği anda kapatılmamış olan pozisyonlar gösterilmektedir. Tablo sütunlarının adları, pozisyonların eksik kapatma sütunları hariç Closed Positions tablosunun sütunlarına denk geliyor.


Alt bilgi satırında, testin tamamlandığı anki bakiye, varlık, marjin ve serbest marjin görüntülenir.


Equity graph

Kapalı pozisyonun numarasına bağlı olarak bakiyenin ve varlığın değişmesinin görüntülenmesi. Grafik üzerinde farenin sol tuşu ile çift tıklama, kapalı pozisyonlar tablosu Closed positions'da ilgili pozisyonu gösterir.


Journal

Danışmanda kullanılan yazıcı işlevi System.Print'ten metin şeklinde görüntülenmesi. Parameters sekmesindeki "Enable expert logs" kutusunun işareti kaldırılmışsa, günlükte danışmanı başlat ve durdur emirleri görüntülenecektir.


Debugging işlemi

Skript'in debugging yapılması System.Print işlevi kullanılmadan nadiren tamamlanabilir. System.Print bilgileri Toolbox penceresinin Journal sekmesine görüntüler (ya da tester penceresinin Journal sekmesine). Ancak şunu da bilmek lazım: danışman başlatıldığında çıkarılan bilgi, «Kullanıcı_adı\Documents\NeTTradeX Advisors\logs» klasöründeki log dosyasına da kaydedilir. Log dosyaları txt formatında dosyalar ile çalışabilen bir metin editörü ile açılabilir. Log dosyasında, olayın gerçekleştiği zamanı, bitiş kodu (0 - başarılı bir bitiş, 1 - hata) ve metin mesajı kaydedilir.


System.LastError özelliğinin değer işleminin eklenmesi, danışmanınız düzgün çalışmadığında durumu analiz etmeyi sağlar. Bu özellik, ticaret işlemleri ile ilgili son hatanın sayısını kaydeder. Bu özelliğin önemli bir niteliği vardır: sonraki her işlem, işlerinin sonucuna göre bu özelliği değiştirir. Böylece, hatalı parametreyle bir işlem açtırma talebi gönderen ve ardından doğru parametrelerle emri uygulayan skriptiniz varsa o zaman System.LastError'da sıfır değeri kaydedilir (hata yok). Bu nedenle, System.LastError özelliğinin değerini, sonraki işlemden (bizim örneğimizde emir ayarlamadan) ÖNCE almanız gerekir, yalnız bu durumda onda işlem yapma sırasında meydana gelen hatanın kodu saklanacaktır. Hatanın bir metin açıklaması için, sorunun bir metinsel bilgisi içeren satırı döndüren System.ErrorDescription() yöntemi tasarlanmıitır. alınan değer ise hatanın, System.LastError yardımıyla elde edilen sayısal kodudur.


Debugging işleminde, System nesnesinin IsStopped özelliği yararlı olabilir. Programın son tikin gelmesi ile ilgili gerçekleşmesi 7 saniyeden fazla sürdüyse bu özellik "true" değerine sahip. Bu özelliği kullanarak programcı, skriptin yakında (3 saniye sonra) zorla durdurulacağı hakkında bilgi alır. Böylece skript, doğru tamamlanması için zaman alır.


Özet

Sonuç olarak, danışmanın yazılmasının iki aşamaya ayrılabildiğini vurgulayalım: algoritmanın geliştirilmesi ve kodunun yazılması. Ilk aşama ne kadar dikkatlice yapıldıysa ikinci aşama o kadar kolayca ve hızla gerçekleşecektir. Makalede, algoritmanın yazılmasının bazı önemli sorularının yanı sıra NTL+ diliyle tanışmanızı basitleştiren pratik çözümler gösterilmiştir.


Close support
Call to Skype Call to messenger Call to telegram Call to WhatsApp Call Back