Nasıl kodlanır? - sayfa 306

 

Merhaba,

İşlevlerle gerçekten hiçbir yere varamıyordum, onları sayısız kez kontrol ettim boşuna bu yüzden klonlamadan önce ne kadar ileri gittiğini görmek için kodumun her aşamasına çok sayıda Print() mesajı yazmaya karar verdim. Aslında GetLots işlevine kadar gitmiyor ve satın alma ve satma kriterlerimi kontrol ederken başarısız oluyor. Garip bir şekilde kodun bu kısmını değiştirmedim ama bir şey eksik - ama en azından artık nereye odaklanacağımı biliyorum!

 

Hepinize merhaba,

Kodumu bugün erken saatlerde test ettim ve nispeten iyi çalıştı. Kodu veya geriye dönük test kriterlerini değiştirmeden (tarihler gibi) bir saat sonra bir geriye dönük test yaptım ve sonuçlar tamamen farklı, hiçbir sonuç olmadığı gibi. Yani bunun neden olduğunu merak ediyorum? Örneğin MT4 bağlantısı?

 

...

Herhangi bir parametreyi değiştirmediyseniz, aşağıdakileri kontrol edin: geriye dönük testi çalıştırdığınızda, günlük sekmesini açın ve orada bazı hataların yazılıp yazılmadığını kontrol edin. Siparişlerin yürütülmesindeki hatalar, düzensiz sonuçların tek nedeni olabilir. Ayrıca satın alma ve satma kriterlerinin :sağlam olup olmadığını kontrol edin: yani - aynı noktadan deplasmanlara girecekler.

crsnape@btinternet.com:
Herkese merhaba, kodumu bugün daha önce test ettim ve nispeten iyi çalıştı. Kodu veya geriye dönük test kriterlerini değiştirmeden (tarihler gibi) bir saat sonra bir geriye dönük test yaptım ve sonuçlar tamamen farklı, hiçbir sonuç olmadığı gibi. Yani bunun neden olduğunu merak ediyorum? Örneğin MT4 bağlantısı?
 

Günlüğümde herhangi bir hata almıyorum. İlk giriş şudur:

2012.07.22 15:35:37 H4 Dönemi EA EURUSD,H4: başarıyla yüklendi

Bunları büyük bir liste izledi:

2012.07.22 15:47:07 TestGenerator: eşleşmeyen veri hatası (2012.07.19 12:00'de 56304 ses sınırı aşıldı)

ve sonra nihayet:

2012.07.22 15:47:07 H4 Dönemi EA girişleri: MagicNumber=42; RiskÖdül Oranı=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPPeriyot=12; YavaşMACDPPeriyodu=26; SinyalPeriyodu=9; DNCPPeriyodu=120; SL_Period=10;

Ama sonra hiçbir şey.

04.01.2012 - 21.07.2012 tarihleri arasında testim yapıldı.

 

...

O zaman giriş koşullarıyla ilgili bir sorununuz var (EA'nız hiçbir zaman sipariş açmayı denemedi)

crsnape@btinternet.com:
Günlüğümde herhangi bir hata almıyorum. İlk giriş şudur:

2012.07.22 15:35:37 H4 Dönemi EA EURUSD,H4: başarıyla yüklendi

Bunları büyük bir liste izledi:

2012.07.22 15:47:07 TestGenerator: eşleşmeyen veri hatası (2012.07.19 12:00'de 56304 ses sınırı aşıldı)

ve sonra nihayet:

2012.07.22 15:47:07 H4 Dönemi EA girişleri: MagicNumber=42; RiskÖdül Oranı=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPPeriyot=12; YavaşMACDPPeriyodu=26; SinyalPeriyodu=9; DNCPPeriyodu=120; SL_Period=10;

Ama sonra hiçbir şey.

04.01.2012 - 21.07.2012 tarihleri arasında testim yapıldı.
 

Evet garip çünkü daha önce pozisyonlara giriyordu. Kodumda baştan sona biraz print() var ve kodumun en başlangıcını bile kaydetmek için günlüğe hiçbir şey yazılmıyor. Mevcut çubukta daha önce bir pozisyonun açılıp açılmadığını kontrol etmek için bu bile değil:

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Çubuklar))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Uzun pozisyon (SATIN AL) olasılığını kontrol edin

if (GlobalVariableGet (HasOrderedGV) == yanlış)

{

Yazdır("TEST");

if (... giriş koşulları...

 

...

EA'nız herhangi bir aşamada bir sipariş açmayı deneseydi, bu günlüğe yazılırdı (hata ya da değil, önemli değil - bir hata olması durumunda, orada bir hata olurdu, bir sipariş açsaydı orada bir hata olurdu. oraya yazılacak)

Ancak orada hiçbir şey yazılmadığından, EA'nızın gerçekten bir sipariş açmaya çalışmak için hiçbir zaman sahneye çıkmadığı ve bu yalnızca EA'da yerine getirilmesi gereken koşullar kümesinin hiçbir zaman gerçekten sipariş açma adımına geçmediği takdirde gerçekleşebileceği anlamına gelir. sipariş. Bu yüzden şartlarınızı netleştirmeniz gerekiyor. Yürüteceğini bildiğiniz en basit koşuldan deneyin ve ardından koşulları ekleyerek oluşturun. Bu şekilde, siparişleri açmanızı engelleyen adımı tanımlayabileceksiniz.

crsnape@btinternet.com:
Evet garip çünkü daha önce pozisyonlara giriyordu. Kodumda baştan sona biraz print() var ve kodumun en başlangıcını bile kaydetmek için günlüğe hiçbir şey yazılmıyor. Mevcut çubukta daha önce bir pozisyonun açılıp açılmadığını kontrol etmek için bu bile değil:

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Çubuklar))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Uzun pozisyon (SATIN AL) olasılığını kontrol edin

if (GlobalVariableGet (HasOrderedGV) == yanlış)

{

Yazdır("TEST");

if (... giriş koşulları...
 

if komutlarından sonra birkaç Print() daha koydum ve bu noktada başarısız olduğunu düşünüyorum, özellikle de günlüğüm bu noktadan sonra yazdırmayı durduran kırmızı çizgi.

//--- KÜRESEL DEĞİŞKENLER

string HasOrderedGV = "has_ordered_GV";

string barlarGV = "bars_GV";

//--- H4 zaman bloğunda sipariş verilmiş olup olmadığını belirleyin

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Çubuklar))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Mevcut çubuk için sipariş verilmiş olup olmadığını belirleyin", HasOrderedGV);

//--- Uzun pozisyon (SATIN AL) olasılığını kontrol edin

if (GlobalVariableGet (HasOrderedGV) == yanlış)

{

Bu kodu internette buldum ve benimkinde kullandım. Ama şimdi işe yarayıp yaramayacağını merak ediyorum. BarGV global değişkeni bir dizge olarak bildirilir, ancak ilk satırda 0'a başvurur. Bu doğru mu?

 

...

Bu kod, ilk kez çalıştırıldığında sorunsuz çalışır.

0, aşağıdaki nedenle test edilir:

double GlobalVariableGet([/TD] [TD] dize adı)

"Var olan bir global değişkenin değerini veya bir hata oluşursa 0 değerini döndürür"

Global değişken değeri alınırken hata, global değişken henüz oluşturulmadığında olacaktır. Ama dediğim gibi, bu kod ilk kez çalıştırıldığında sorun değil. Sorun şudur: Bir test yaptığınızı ve testin sonunda barGV'nin 5000'e ayarlandığını hayal edin. Şimdi EA'yı tekrar çalıştırırsınız ve çubuklar her zaman bar GV değerinden (hala 5000 olan) daha az olacaktır. Bu (kod) farklı yazılmalıdır. Bunun gibi bir şey kullan

GlobalVariableSet(barsGV,0);

init() içinde ve ardından ardışık testler için de iyi çalışması gerekir. Ama aynı zamanda, yapay olarak, EA'yı başlattığınızda mevcut çubukta bir hata olabilecek açık bir sipariş yokmuş gibi "varsayacaktır". Geçerli bir çubukta açılan siparişleri saymak için işlevi kullanmak, bu amaç için global değişkenleri kullanmaktan çok daha iyidir (birden çok nedenden dolayı)

________________________________________________

Not: Bunun gibi global değişken(ler)i kullanmak, bir EA'nın birden çok örneğini kullanmanızı engeller (her global değişken başka bir koddan görülebilir - herhangi bir kod: EA,script, Indicator ..., yani ad benzersiz değilse, EA'ların aynı anda tüm aynı global değişkeni okuma ve ayarlama riskinin karışması riski)

crsnape@btinternet.com:
if komutlarından sonra birkaç Print() daha koydum ve bu noktada başarısız olduğunu düşünüyorum, özellikle de günlüğüm bu noktadan sonra yazdırmayı durduran kırmızı çizgi.

//--- KÜRESEL DEĞİŞKENLER

string HasOrderedGV = "has_ordered_GV";

string barlarGV = "bars_GV";

//--- H4 zaman bloğunda sipariş verilmiş olup olmadığını belirleyin

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Çubuklar))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Mevcut çubuk için sipariş verilmiş olup olmadığını belirleyin", HasOrderedGV);

//--- Uzun pozisyon (SATIN AL) olasılığını kontrol edin

if (GlobalVariableGet (HasOrderedGV) == yanlış)

{

Bu kodu internette buldum ve benimkinde kullandım. Ama şimdi işe yarayıp yaramayacağını merak ediyorum. BarGV global değişkeni bir dizge olarak bildirilir, ancak ilk satırda 0'a başvurur. Bu doğru mu?
 

Ahh.. anlıyorum. Çünkü Global Değişkenler değerlerini hafızaya kaydeder. Yani geri testi bitirdiğinde ve 5000'de dediğiniz gibi, geriye dönük test tekrar çalıştırılsa bile bu belleğe kaydedilir, böylece BarsGV 5000'in altında olmadığı için asla false döndürmez mi? Tanrım, bu derin.

Ayrıca, bir hata üretirse, HasOrderedGV'yi false olarak ayarlar, böylece kodun geri kalanıyla devam edebilir mi?

Seni doğru anladım mı?

BTW- buna izin veriliyor mu?

GlobalVariableSet(HasOrderedGV, false);

Çünkü MQL4 Kitabında şöyle diyor:

datetime GlobalVariableSet([/TD] [TD] dize adı, çift değer)

Örneğimdeki ikinci değer bool double değil mi?

Neden: