IQ VE BACK TEST VE TERMİNAL İLE FARKLAR
Merhabalar,
IQ tarafında, algoritma yapısı, veri terminaline göre daha farklı, daha serbesttir.
Bu sebeple, bazı detaylar için, kurgunun kullanıcı tarafından belirlenmesi / hedefe bağlı olarak tanımlanması gerekir.
Veri terminali tarafında kullanıcılarımızda alışkanlık şöyledir:
AL’madan SAT’maz. Bir AL oluştuktan sonra SAT’madan bir daha AL’maz. Bakiye verilir ise, tümünü kullanır.
Kademeli alım söz konusu değildir. Strateji içinde birden fazla sembole emir gönderimi söz konusu değildir.
IQ tarafında ise,
Yazacağınız koda bağlı olarak çoklu seçenekler mümkündür.
Peş peşe alım olabilir. Bakiyeye bağlı kalmak mecburiyeti yoktur.
Kademeli alım yapılabilir vb.
Bu gibi detaylardan dolayı, IQ içinde standart durumlar oluşturulmak istenirse, bazı seçenekler / durumlar buna göre belirlenmelidir.
Seçimler, hedefe yönelik yapılabilir. Kodun içine talebe göre çalışmayı sağlayacak eklemeler yapılabilir.
Standart sonuçlar için, her durumda emirlerin sıralı gönderimi seçilmelidir.
Kodun içinde bu seçim, şu komut ile yapılır:
SendOrderSequential(true);
Bu komut true olarak tanımlanırsa, emirler AL ile başlayacak ve sıralı gönderilecektir.
Bu konuda ek seçenekler / bilgilendirme için:
OVERALL / BAKİYE TARAFI İÇİN:
Seçenek1:
Başlangıç bakiyesini sıfır yapmak. Emir gönderim miktarlarını 1 AL – 1 SAT şeklinde yapmak
Test sonucundaki overall rakamı 1 AL – 1 SAT ile elde edilecek getiriyi gösterecektir. Bu getirinin sembolün fiyatına oranı, getiri oranı olarak baz alınabilir.
Seçenek2:
Baktest içinde kaç adet AL-SAT miktarı tanımlayacak isek, başlangıç bakiyesini sembolün bu miktarının bedeline eşitlemek.
İpucu: Esasen, testin başlangıç tarihindeki bedelin baz alınması daha doğru olacaktır. Bu durum, sistem tester’daki puan testine karşılık gelir.
Seçenek 3:
Kodun içine gerekli komutları girerek, verilen bakiyenin tümünün kullanılmasını sağlamak.
Bunun için örnek bir kod linkte yer almaktadır.
DİKKAT: Tüm testler açısından, şöyle bir durum söz konusudur. Son emir SAT olmaz ise, OVERALL ve BAKİYE arasında bir fark oluşur. Baz almanız gereken değer, overall olacaktır. Aşağıda örnekler vardır.
Örnek 1:
AL ile başlayan bir strateji için, İşlem sayısı çift rakam olursa:
OVERALL=BAKİYE

İşlem sayısı tek rakam olursa, overall ve bakiye farklı olur.

Bunun açıklaması şudur:
AL ile başlayan bir stratejide, tek sayıda işlem, son işlemin AL olması anlamına gelir.
Overall – Son Alım Tutarı = Bakiye.
Getiri hesabında, overall baz alınmalıdır / alınmaktadır zaten.
*
Optimizasyon değil de, back test de yapılsa, durum / yorum aynı şekildedir.

Yukarıda emir sayısı çift sayıdır ve overall = bakiyedir.
*
Aşağıda ise emir sayısı tek sayıdır. Ve overall ile bakiye farklıdır.

BİR ÖRNEK ÜZERİNDEN DETAYLI AÇIKLAMA :
Genelde şu 2 durum ile karşılaşılmaktadır:
• Backtestlerin başlangıç bakiyesini 1000 yapıyorum. Sonuç, 1300-1400 çıkması gerekirken hep 995-1005 arası bir şey çıkıyor.
• Backtest sonucunda aşırı yüksek getiri çıkıyor.
Her 2 durumun da asli sebebi, Bakiye ile Miktar uyumsuzluğudur.
Bakiyeyi 1.000 TL (Birim yapıp), bedeli 1 TL olan bir sembolden 10 AL – 10 SAT yaparsak, 1.000 TL bakiyenin sadece 10 TL sini kullanmış oluruz.
Öte yandan,
Bakiyeyi 1.000 birim yapıp mesela, BTC ile 1 AL – 1 SAT bile yapsak, her alış veriş, takriben 50.000 birimlik olacaktır.
Her 2 durum da, getiri oranı verisini çok fazla etkiler.
Somut bir örnek üzerinden gidelim. GARAN için yapılmış olan testlerin sonuçlarını irdeleyelim.
İlk testte miktarlar 1 AL 1 SAT. Başlangıç bakiyesi sıfır.

Gelen rapor:

Başlangıç bakiyesini sıfır verdiğimiz için, yüzdelik rakam ona göre hesaplanıyor.
Bununla beraber, esas olarak,
1 alıp 1 satarak, fiyatı şu anda takriben 8 TL olan Garan ile 2.09 TL kazanmışız. Bu da yaklaşık 26 % getiri demektir.
Burada getiri sembolün fiyatı ile bağlantılıdır.
*
AL-SAT miktarlarını 100 yapıp

Başkangıç bakiyesini 800 yapalım.

Elde ettiğimiz sonuç:

Gene yaklaşık yüzde 26 olacaktır.
Dikkat: Getiri, 100* 2.094783.

yani 1 AL 1 SAT ile elde edilen overall un 100 AL-100 SAT için olacak doğal sonucudur. Başlangıç bakiyesini de 800 aldığımız için, bu sefer yüzdelik getiri doğrudan sonucu vermektedir.
Lütfen, IQ tarafında back testlerinizi, bu şekilde inceleyin, değerlendirin, yorumlayın.
Hayırlı kazançlar dileriz.


Diğer bir soruya yazdığımı buraya da kopyalayayım, belki fikir verir bir başkasına,
ben şöyle birşey yaptım. Yapılan kâr ve zarar ile tüm overall ile maksimum lot miktarına işlem girerek backtest yapma çabalarım,
GetOverall(); fonksiyonunu kullanarak başlangıçta belirlediğimiz tutar örneğin 100000 tl ise
o an emri gönderdiği bar fiyatı ne ise örneğin (100000 tl / sinyalin geldiği fiyat) olacak şekilde her işlemde kaç lot alabiliyorsa o kadar aldırarak sistem testini yapmaya çalışıyorum.
veya (overall * 0.8) /güncelFiyat yaparak her işlemi sermayenizin %80 i ile alabileceği kadar lot almasını sağlayarak sinyal gönderttirebilirsiniz.
Örneğin şöyle bir yapı kullanıyorum
private decimal HesaplaPozisyonMiktari(decimal guncelFiyat)
{
decimal overall = GetOverall();
if (guncelFiyat != 0)
{
return (overall * 0.8m) / guncelFiyat;
}
return 0;
}
koşullarda emir gönderirken ise
decimal pozisyonMiktari = HesaplaPozisyonMiktari(c);
SendMarketOrder(Symbol, pozisyonMiktari, OrderSide.Buy);
aynı şekilde sell
decimal pozisyonMiktari = HesaplaPozisyonMiktari(c);
SendMarketOrder(Symbol, pozisyonMiktari, OrderSide.Sell);
Tabiki eklemeden geçmemeliyim, pozisyon sayılarına da özel kodlama yapmanız gerekiyor, yani ilk alım sinyali geldiğinde örneğin 10500 lot aldı ise satarken de 10500 lot satabilmesi için koşullar ve eşlemeler kurmanız lazım, yoksa alım koşullarınız boyunca her olumlu koşulda fiyat miktarları güncellenip sıradaki sat sinyalinde koşulların son barındaki fiyatı baz alır matriks iq ve 10500 lot satış yapması gerekirken 9500 satış yapar, o şartlarında düzgün kurgulanması gerekmekte,
örneğin
pozisyonAcik adında bir değişken ekleyebilirsiniz. Bu değişkenle, pozisyonun açık olup olmadığını takip edersiniz.
şöyle yapabilirsiniz alım koşulu gerçekleştiğinde, pozisyonAcik true olur ve bu sayede tekrarlanan alım sinyalleri işlenmez. Satım koşulu gerçekleştiğinde, sonAlimMiktari, ne ise o kadarlık bir satış emri gönderilir ve sonra pozisyonAcik false olarak ayarlanır, ve bu sayede alınmış olan miktar kadar satılmış olur, bunlara dikkat edilmezse simulasyon yanlış sonuçlar verir,
aşağıda pozisyonAcik true , sonAlimMiktari gibi konulara dikkat edilmeden yapılan overall hesaplamasıyla dikkat edilip kurgulanan arasındaki fark
yani
SendMarketOrder(Symbol, pozisyonMiktari, OrderSide.Buy);
_sonAlimMiktari = pozisyonMiktari; // Alım miktarını kaydediyoruz burada
_pozisyonAcik = true; // Pozisyon açıldı olarak işaretleyip
Debug("Alım gerçekleşti: " + pozisyonMiktari); buradan veya backtest sonucundan işlemleri kontrol edebiliriz
SendMarketOrder(Symbol, _sonAlimMiktari, OrderSide.Sell); // Önceki alınan miktarı satıyoruz
_pozisyonAcik = false; // Pozisyon kapandı olarak işaretliyoruz
Debug("Satım gerçekleşti: " + _sonAlimMiktari);
her pozisyona overall miktarının %80 i ile o anki alım sinyalinden alınabilecek maksimum lot