Açık ticareti kontrol etme sorunları

 

Hey, zaten açık bir ticaret olup olmadığını kontrol etmek için bunu koduma ekledim. Sorun şu ki, kod bir işlem yapacak ve hepsi bu. Bu kodla ilgili bir sorun görebilen var mı? Programlama konusunda süper bir uzman değilim


// Açık işlemleri kontrol et

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(Sipariş Seçimi(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=true;
}
başka
{
tradeopen=yanlış;
}

}

}

 
Kodunuz Bekleyen ve Açık işlemleri alacak, bunun dışında bana uygun görünüyor.
 

promt cevabınız için teşekkürler Raptor


Sakıncası yoksa kodun tamamını ekleyeceğim, Belki başka bir yerde gözden kaçırdığım bir şey vardır. Şu anda bununla duvara çarptım.

Dosyalar:
daz.mq4  3 kb
 
dazamate :
Bu kodla ilgili bir sorun görebilen var mı?

  1. Sihirli sayı olmaması, aynı çift/farklı zaman dilimlerinde diğer tüm EA ve manuel ticaret ve kendisi ile uyumsuz olduğu anlamına gelir.
  2. İlk açılan sipariş EA'nın değilse, açık işlemlere sahip olsa bile bayrak yanlıştır.
     int TotalOrderCount(){
         int count= 0 ;
         for (pos = OrdersTotal ()- 1 ; pos >= 0 ; pos--) if (
             OrderSelect (pos, SELECT_BY_POS)                 // Only my orders w/
        &&   OrderMagicNumber ()  == magic.number             // my magic number
        &&   OrderSymbol ()       == Symbol () ){               // and my pair.
            count++;
        }
         return (count);
    }

 
dazamate :

promt cevabınız için teşekkürler Raptor


Sakıncası yoksa kodun tamamını ekleyeceğim, Belki başka bir yerde gözden kaçırdığım bir şey vardır. Şu anda bununla duvara çarptım.

Birkaç yorum. . .

i ilan ediyorsun. .

 int i;

. . . ama hiçbir yere koymuyorsun, ben neyim?

ayarladın. . .

 static bool tradeopen = false ;

. . sonra bir ticaret yapıp yapamayacağınızı kontrol edin . . . bu noktada her zaman yanlış olacaktır. . . o zaman daha sonra doğru olarak ayarlayabilen kodunuz var

 if (OrderSymbol()== Symbol ())
    {
    tradeopen=true;
    }  

bar sayısı 0 olarak ayarlandı

 static int barcount = 0 ;

bu yüzden grafiğinizde en az 1 çubuk varsa bu her zaman doğru olacaktır. . .

 if ( Bars != barcount)

Kodunuzu satır satır gözden geçirmeniz gerekir. . . Anlamadığınız bir şey varsa, ona bakın ve onun hakkında okuyun. . . öğrenmenin tek yolu bu.

 

Raptor, içinden geçtiğin için teşekkürler. Dediğim gibi ben süper uzman değilim. Diğer insanların bir şeyleri nasıl kodladığını okudum ve benimkine uygulamaya çalıştım. Fonksiyonlar hakkında çok fazla okuma yaptım. İşe yaramadığında sinir bozucu oluyor ve kendi felaketinizi nasıl teşhis edeceğinizi bilmiyorsunuz.

Yorumlarınıza yanıt olarak

 int i;

Gitti, onu yanlışlıkla orada bıraktığım başka bir şey için kullanıyordum


Bar tezgahıyla ilgili olarak kafamda neler olup bittiğini açıklayacağım. Kodun bu bölümünün neden iyi olmadığından hala emin değilim.

 static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if ( Bars != barcount) // <- This will be true so the if statement is allowed to run
    
       {      
         if (iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount= Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

Paritede açık işlem olup olmadığını görmek için yapılan kontrole gelince...

 static bool tradeopen = false ;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for ( int cnt= OrdersTotal ()- 1 ;cnt>= 0 ;cnt--)         {            if ( OrderSelect (cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if ( OrderSymbol ()== Symbol ()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

Bu nedenle, adetin sonunda, mevcut çiftte açık bir ticaret olup olmadığını görmek için bu kontrolü yapar. Tradeopen'ı true veya false olarak ayarlar. Bu bit off kodunun EA'nın sonunda kullanılması bir sorun mu?

Bir de çözemediğim başka bir sorun...

 int iBarHour;
iBarHour = TimeHour ( TimeCurrent ());
Print (iBarHour);
iBarHour neden her zaman 1 döndürür? Geçerli saati döndürmesini istiyorum :(


WHRoeder


EA'nın sihirli bir sayı kullanıp kullanmaması önemli mi? Tüm açık ve bekleyen işlemleri ve bunlardan herhangi birinin mevcut çift olup olmadığını kontrol edemez mi?


Bir kez daha beyler biliyorum ben bir acemiyim ama tüm girdileriniz takdir edildi biliyorum muhtemelen tehlikeli kodlamam hakkında tekrar dolandırılacağım: P


Teşekkürler

 
dazamate :

Bar tezgahıyla ilgili olarak kafamda neler olup bittiğini açıklayacağım. Kodun bu bölümünün neden iyi olmadığından hala emin değilim.

Üzgünüm, muhtemelen statik değişkenlerin kullanımı konusundaki bilgisizliğimi gösteriyorum. . . Bunun yerine global değişkenleri kullanıyorum ve kodun başlangıcında ayarlamak istediğim her şeyi init işlevine koyuyorum. https://docs.mql4.com/basis/functions/special

Kodun bu bölümünü hafta sonu boyunca çalıştırıyorsanız, değişmez, Sunucu zamanını kullanır ve her onay ile güncellenir.

 int iBarHour;
iBarHour = TimeHour( TimeCurrent ());
Print (iBarHour);

bu kodun çalıştığını varsayarsak, dDayOpenPrice yalnızca iBarHour = 6 iken ayarlanır, iBarHour = 7 olduğunda dDayOpenPrice artık doğru değere ayarlanmaz. dDayOpenPrice'ı global yaparsanız, kod çalışırken değeri kaydedilir (onu statik yapmak da muhtemelen işe yarayacaktır). Kod yeniden başlatılırsa, ertesi güne kadar hiçbir şey olmayacak. . . 6 am bara kadar değil.

WHRoeder

EA'nın sihirli bir sayı kullanıp kullanmaması önemli mi? Tüm açık ve bekleyen işlemleri ve bunlardan herhangi birinin mevcut çift olup olmadığını kontrol edemez mi?

Manuel ticaret olmadan yalnızca bir grafikte bir EA'nız varsa. . o zaman muhtemelen bir Sihirli sayı kullanmadan kurtulabilirsiniz, yine de onu kullanmak iyi bir uygulamadır, önce kodunuzu çalıştırın, sonra sihirli bir sayı uygulayın, öğrenmenize yardımcı olacaktır.

 

RaptorUK bir kez daha teşekkür ederim.


Kodun çalışıp çalışmadığını görmek için ea'yı geri test ediyorum ve kodda hata ayıklamaya yardımcı olmak için içlerinde neler olup bittiğini görmek için değişkeni Print(). ibarhour kodu düzgün çalışıyor gibi görünüyor, sadece geriye dönük testte düzgün görünmüyordu çünkü onu sürekli olarak ibarhour'un değerini yazdıracak şekilde ayarladım, kod tükürürken arka test cihazının Sıkışması için yeterince hızlı görüntüleyemez. Yazdırma koduna bir gecikme koymanın bir yolu olabilir mi?



Ayrıca evet 06:00 barının açılış değerini saklamasını istiyorum :)


Kodu yeniden düzenledim ve mevcut paritede herhangi bir işlem açıp açmadığını kontrol edebildiğim için kendimle gurur duyuyorum. WHRoeder örneğini kullandım ve onu ayrı bir fonksiyona dönüştürdüm :) ve fonksiyonun doğru veya yanlış döndürmesini sağladım. Yay.



Açıkça EA kodlama alanında bir elit olduğunuz için. Kendi EA'larını yapan insanlardan kaç tane başarı hikayesi duydunuz? Sadece kötü hikayeler duydum/gördüm.











 
dazamate :

Açıkça EA kodlama alanında bir elit olduğunuz için. Kendi EA'larını yapan insanlardan kaç tane başarı hikayesi duydunuz? Sadece kötü hikayeler duydum/gördüm.











ÇOK KOMİK . . . yorumun bana değil WHRoeder'a yönelik olmalı , o benden çok, çok daha yetkin bir kodlayıcı, paylaştığı koddaki son gönderilerinden bazılarına bir göz atın, kodunu anlayarak çok şey öğrenebilirsiniz, ben biliyorum , teşekkür ederim WHRoeder :-) .

Burada takılıyorum çünkü insanların kendilerine yardım etmelerine yardımcı olmayı seviyorum. . . ve bu süreçte bir şeyler öğreniyorum.

Başarılı bir EA'ya sahip olmak için önce başarılı bir yönteme ihtiyacınız var. . . bunlardan kaç tane var? birçok şey kısa bir süre için çalışır, birkaç şey bir veya iki ay boyunca çalışır, çok azı tutarlı bir şekilde çalışır. Birisinin iyi bir yöntemi olsa bile (bunu uygun testler olmadan nasıl bilecekler bilmiyorum) genellikle bunu uygulanabilir bir EA'ya dönüştürmek için bilgi veya yeteneğe sahip değiller. Geçerli bir EA'ya sahip olan herkesin gerçeği tanıtması pek olası değildir, onu kullanacak ve para kazanacaklardır. . .

İlerleme kaydettiğinizi duyduğuma sevindim. . . Yazdırma sorununuzla ilgili olarak, Yorum'u ( iBarHour ) kullanabilirsiniz ; bunun yerine, çıktıyı sol üst köşedeki ekrana alır.

 
  1. Rica ederim. "Bir şeyi öğrenmek için pratik yapın. Ustalaşmak için öğretin."
  2. Çubuklar güvenilmezdir (grafikte maksimum çubuğa ulaştığınızda değişmez ve kod kırılmaz.) Volume[0]==1 güvenilir değildir, bir işareti kaçırırsanız kod bozulur. Her zaman zamanı kullanın.
     int start(){
       static datetime Time0;
       if (Time0 == Time[ 0 ]) return ; Time0 = Time[ 0 ];
       // A new bar has started.

  3. muhtemelen statik değişkenlerin kullanımı konusundaki bilgisizliğimi gösteriyor. . . Bunun yerine global değişkenleri ve kodun başlangıcında ayarlamak istediğim her şeyi kullanıyorum.
    Değişkenin başlatılması gerekiyorsa, global olmalıdır. Değişken iki veya daha fazla fonksiyon arasında paylaşılıyorsa global olmalıdır. Aksi takdirde, işlev için yerel, gerekirse statik tanımlayın.
  4. EA'nın sihirli bir sayı kullanıp kullanmaması önemli mi?
    Muhtemelen her şeyi çalıştıracaksınız, sonra orada test etmek için başka bir çizelge açacaksınız ve sonra aniden her şey başarısız olacak. Baştan doğru yapın. Kodumda , başka bir grafiğe koymam durumunda sihirli sayıyı değiştirmemem durumunda hem sihirli sayıyı hem de çifti kontrol ediyorum.
 

Haklısın Raptor... Üzgünüm WHRoeder bu kaba değil, iyisin teşekkür ederim. Bu benim için büyük bir projenin başlangıcı, bu yüzden umarım sizi rahatsız etmeme aldırmazsınız.


 int start(){
   static datetime Time0;
   if (Time0 == Time[ 0 ]) return ; Time0 = Time[ 0 ];
   // A new bar has started.

WHRoeder, Bu kod çok basit görünüyor ama nasıl çalıştığını kafamda çözemiyorum, eğer time0'ı time[0]'a eşit yapıyorsa, time0 her time[0]'a eşitse if ifadesi her zaman doğru olmaz mı? Çalışmadığını söylemiyorum ama böyle bir yapıda nasıl çalıştığını anlamıyorum.


2 soru daha.

Bekleyen bir emir verilirse ve x miktarında çubukla tetiklenmezse iptal edileceği bir sayaç yapmaya nasıl giderim? Bulabildiğim tek şey, her yeni çubuk oluştuğunda sayılacak bir sayaç koymak ve eğer sayılan çubuk miktarı == bekleyen emirler iptal edilmeden önce belirtilen izin verilen çubuklar. Çubuk sayacı, bekleyen yeni bir sipariş her açıldığında sıfırlanıyor mu? Kulağa nasıl geliyor?

Sonraki soru.

Bu, nasıl devam edeceğime dair hiçbir fikrim yok.

1hr tf'de eurusd, usdchf, gbpusd, usdjpy'yi tarayan bir fonksiyon yapmak istiyorum. Son 06:00 gmt mum kayıtlarına geri döner, her çift için 6gmt -6gmt aralığını kaydeden ve kaydeden önceki 06:00 gmt mum kayıtlarına 24 bar daha geri döner. Ardından tüm çiftlerden 6gmt - 6gmt aralığını karşılaştırır ve en yüksek olanı döndürür. 1 zaman çizelgesine eklenmiş bir ea'nın bunu yapması mümkün müdür?


Bilgileriniz için tekrar teşekkürler arkadaşlar ve hastalarınız

Neden: