MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 607

 
Vitaly Gorbunov :

Gerekli siparişlerin sayısını bir yerde belirlemiş olmanız iyi, ancak bu blokta tüm siparişleri tekrar gözden geçirip kontrol edeceksiniz!

Kodu normal şekilde kırın hemen göreceksiniz!

Kesinlikle tekrar sayabilirsiniz. Ama bu özü değiştirmez. if() ifadesi "else" yapmaz. Bu sadece bir vaka, ancak daha fazlası oldu.
 
for ( int h = OrdersTotal ()- 1 ; h >= 0 ; h--)
    {
     if ( OrderSelect (h, SELECT_BY_POS ))
      {
       if ((cnt_OO >= 2 ))
        {
       if (( OrderMagicNumber () == Magic)&&( OrderLots () <= Lots/Prikup - Dplus))
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice ();
         LotsNext  = NormalizeDouble ( OrderLots ()*K,lotDigit);
         if (NewPB > 0 )
          PBcloseON = true ;
         Alert ( "Pospedny Order NEXT  " , OrderTicket ());
         Alert ( "Otkritih orderov  " ,cnt_OO);
//         break;
        }
       break ;
       }
         LotsNext    = NormalizeDouble (Lots*Prikup,lotDigit); 
         Alert ( "Otkritih orderov NEXT net " );
         Alert ( "Otkritih orderov  " ,cnt_OO);
         break ;
     
        }}

Böyle deneyin!

Burada aksi takdirde (başka) kodunuzda göremiyorum!

Başka kılıflar atın bakalım orda ne var :)

Mantığı dikkatli bir şekilde inceledikten sonra kodunuzu elden geçirdim.

Böyle çıktı

 if (cnt_OO> 0 ) //Если нет ордеров то и не надо ни чего делать
{
   for ( int h = OrdersTotal ()- 1 ; h >= 0 ; h--)
   {
     if ( OrderSelect (h, SELECT_BY_POS ))
     {
       if (cnt_OO== 1 )
         {
           //Если ордер один проверяем тот ли ордер (майджик и прочее) и что то там делаем
         }
       else
         {
           //Если ордеров больше чем 1 проверяем те ли ордера (майджик и прочее) и что то там делаем
         }
     }
   }
   
}
 

Öyle olabilir. Ancak ders kitabı, koşul karşılanmazsa, if () operatörünün koşulunu işlemek için bloğu kapatan kaşlı ayraçtan sonra komutların işlendiğini söylüyor. Bu gerçekleşmiyor.

Bir de hata vardı:

     if (( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))&&( OrderMagicNumber () == Magic)&&(OrderLotsOld==zLots))
      {
       

İlk if ifadesine bir koşul daha eklediysem - sırada ne var, işe yaramadı

iki tahminim var

1. Moronic strateji test cihazı. Bu durumlar programın hata ayıklama aşamasında ortaya çıktığı için, bunu gerçek bir hesapta kontrol etmek için tam bir eksantrik olmanız gerekir. Evet ve demoda da çünkü yeniden başlatma durumunu yeniden oluşturmak zor. Test cihazının aptal olduğu ve MT4 penceresindeki birkaç siparişi kapatma sırasının, kapanış aynı anda gerçekleşirse genellikle gerçek olanla uyuşmadığını söylüyor. Programdaki son siparişleri yeniden hesaplarsanız bu açıkça görülür. Bu aptallık, tuhafın kim olduğunu bulmak için bana bir haftalık çalışmaya mal oldu.

Testçinin mantığı, kene geçmişinde bile gerçek hayattan uzaktır. Algoritmam için bu çok kritik.

2. Tahmin olarak. Sadece MQL/MT4'te değil, aynı zamanda sistem uzmanları için de özellikle ileri düzey gurular için bir soru.

- Farklı pencerelerde aynı çift üzerinde iki özdeş Uzman Danışmanım var. Örneğin, hafta sonu için bilgisayar kapatıldıktan sonra Pazartesi günü Expert Advisors'ı başlatırken, ilk tikte ikisi de aynı anda çalışmaya başlar. İlkinin devleti yeniden kurmak için işe yarayacağını umuyordum, sonra ikincisi. Kim şanslıysa önce işe başlar.

Aslında, veri kurtarma ile ilgili mesajlar karışıktır. Diğer bir deyişle, programın yürütülmesi, örneğin sistem zamanlayıcısı tarafından bir koşul tarafından kesintiye uğratılır ve ardından devam eder. Örneğin, orada işlerin nasıl gittiğini görmek için başka bir hesaba geçiş yaparken ilginç durumlar ortaya çıkar. Hesabı kontrol etme koşulları programın başındadır ve asıl hesaba dönüş anında program ortadadır ve şimdi hangi hesap olduğu umurlarında değildir.

Bir çıkış yolu buldum - her bloğun başında hesap numarasını kontrol ettim. Her yerde olduğundan emin değilim.

 

Amon1953, düzelttiğim ilk değişkene baktınız mı? Çalışır? Aynen if() kılavuzunda yazıldığı ve uzun yıllar boyunca kullanıldığı gibi. Sorun kodunuzda, yanlış bloğa ara verdiniz.

(( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))&&( OrderMagicNumber () == Magic)&&(OrderLotsOld==zLots)) satırı koddan yırtılmışsa, değişkenlere ne atandığına bakmanız gerekir.

İkinci noktada - her iki baykuş da paralel olarak yürütülecek, bu nedenle onlardan gelen mesajlar karıştırılacak, tarif ettiğiniz gibi yapmak için baykuşun kopyaları arasında bir semafor düzenlemeniz gerekiyor. Ancak hesabı değiştirdiğinizde anlaşılmaz bir şeyin olması çok ilginç. OnInit ve OnDeinit'i görmeyi çok isterim. Büyük ihtimalle problem oradadır.

 
Vitaly Gorbunov :

Amon1953, düzelttiğim ilk değişkene baktınız mı? Çalışır? Aynen if() kılavuzunda yazıldığı ve uzun yıllar boyunca kullanıldığı gibi. Sorun kodunuzda, yanlış bloğa ara verdiniz.

(( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))&&( OrderMagicNumber () == Magic)&&(OrderLotsOld==zLots)) satırı koddan yırtılmışsa, değişkenlere ne atandığına bakmanız gerekir.

İkinci noktada - her iki baykuş da paralel olarak yürütülecek, bu nedenle onlardan gelen mesajlar karıştırılacak, tarif ettiğiniz gibi yapmak için baykuşun kopyaları arasında bir semafor düzenlemeniz gerekiyor. Ancak hesabı değiştirdiğinizde anlaşılmaz bir şeyin olması çok ilginç. OnInit ve OnDeinit'i görmeyi çok isterim. Büyük ihtimalle problem oradadır.

Kontrol etmedim çünkü döngüden en son sırada çıkmamız gerekiyor (listenin ilk sırasında var).

Ben deneyimli bir programcı değilim ve OnInit ile OnDeinit'in nasıl çalıştığını tam olarak anlamıyorum. O yüzden kullanmıyorum ama görünüşe göre programın ortada kesintiye uğramadan çalışmasına izin veriyorlar.

Semafor gelince, o da belirsiz, danışmanlar farklı pencerelere kuruluyor ve farklı büyülere sahipler.

 
Size tavsiyem, programlamaya yeni başladıysanız, programlamanın temellerini bir kez daha öğrenin. Alınma ama seninle iletişim kurmak çok zor.
 
Vitaly Gorbunov :
Size tavsiyem, programlamaya yeni başladıysanız, programlamanın temellerini bir kez daha öğrenin. Alınma ama seninle iletişim kurmak çok zor.
Teşekkür ederim. Bu yeni başlayanlar için bölümdür. Bu tür bir iletişim bile bana fayda sağladı. Hem bir danışman algoritması yapmak hem de program kodu yazmak zor (özellikle programlama dili benim için tamamen yeni olduğu için)
 
Amon1953 :
Teşekkür ederim. Bu yeni başlayanlar için bölümdür. Bu tür bir iletişim bile bana fayda sağladı. Hem bir danışman algoritması yapmak hem de program kodu yazmak zor (özellikle programlama dili benim için tamamen yeni olduğu için)
Tabanı sıkmanız gerekiyor gibi görünüyor! Hangi mantığı uygulamak istediğinizi kodunuzdan tam olarak anlamadığım için, ne yapmak istediğinizi kelimelerle açıklamaya çalışın. Nerede yanıldığını açıklamaya çalışacağım.
 
Vitaly Gorbunov :
Tabanı sıkmanız gerekiyor gibi görünüyor! Hangi mantığı uygulamak istediğinizi kodunuzdan tam olarak anlamadığım için, ne yapmak istediğinizi kelimelerle açıklamaya çalışın. Nerede yanıldığını açıklamaya çalışacağım.

İhtiyacım olanı zaten açıkladım. Ayrıntıları açıklamaya çalışacağım.

Danışmanı yeniden başlatırken, algoritma bir emir zincirini temsil ettiğinden önceki durumu geri yüklemek gerekir. İlk sıra temeldir, zincirdeki sonraki siparişlerin parametreleri ondan hesaplanır. Örneğin, ikincinin hacmi tabanın %50'sidir, üçüncünün hacmi %75'tir, vb. EA'yı yeniden başlatırken, temel siparişin ve sonuncunun hacmini bilmemiz gerekir, çünkü bir sonrakinin hacmi sonuncudan hesaplanacaktır. Örneğin: 3 açık emir Ve bir sonraki (dördüncü) emri hesaplamak için, son açık olanın hacmini belirlememiz gerekiyor.

Sadece bir sipariş varsa, o zaman temeldir ve bu durumda onunla ilgilenmiyoruz - başka bir blok tarafından işleniyor.

Algoritma basittir. Ama sadece iki if() deyimi ile çalışır

 
Amon1953 :

İhtiyacım olanı zaten açıkladım. Ayrıntıları açıklamaya çalışacağım.

Danışmanı yeniden başlatırken, önceki durumu geri yüklemek gerekir , çünkü algoritma bir sipariş zincirini temsil eder. İlk sıra temeldir, zincirdeki sonraki siparişlerin parametreleri ondan hesaplanır. Örneğin, ikincinin hacmi tabanın %50'sidir, üçüncünün hacmi %75'tir, vb. EA'yı yeniden başlatırken, temel siparişin ve sonuncunun hacmini bilmemiz gerekir, çünkü bir sonrakinin hacmi sonuncudan hesaplanacaktır. Örneğin: 3 açık emir Ve bir sonraki (dördüncü) emri hesaplamak için, son açık olanın hacmini belirlememiz gerekiyor.

Sadece bir sipariş varsa, o zaman temeldir ve bu durumda onunla ilgilenmiyoruz - başka bir blok tarafından işleniyor.

Algoritma basittir. Ama sadece iki if() deyimi ile çalışır

Amon1953 :

Kontrol etmedim çünkü döngüden en son sırada çıkmamız gerekiyor (listenin ilk sırasında var).

Ben deneyimli bir programcı değilim ve OnInit ile OnDeinit'in nasıl çalıştığını tam olarak anlamıyorum . O yüzden kullanmıyorum ama görünüşe göre programın ortada kesintiye uğramadan çalışmasına izin veriyorlar.

Semafor gelince, o da belirsiz, danışmanlar farklı pencerelere kuruluyor ve farklı büyülere sahipler.

Belgeleri okuyun:

OnInit

OnInit() işlevi, Init olayının işleyicisidir. void veya int türünde olabilir , parametresi yoktur:

geçersiz   OnInit ();

Başlatma olayı, bir Uzman Danışman veya gösterge yüklendikten hemen sonra oluşturulur. Başlatma için OnInit() işlevi kullanılır. OnInit() bir int dönüş değerine sahipse, sıfır olmayan bir dönüş kodu başlatma başarısızlığını gösterir ve REASON_INITFAILED başlatmadan kaldırma neden koduyla bir Deinit olayı oluşturur .

Ayrıca değişkenlerin görünürlüğü ile de ilgilenin.

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после...