Hatalar, hatalar, sorular - sayfa 1724

 
MK, neden standart kitaplığa ikili arama için normal işlevler eklemiyorsunuz? ArrayBsearch, yalnızca türlerin basit olduğu ve özel bir karşılaştırıcıya gerek duyulmadığı basit durumlarda kullanışlıdır. Şablonlar var, c++::std::lower/upper_bound üzerinde bir sarıcı yapın. Şimdiye kadar, normal olmayan (neredeyse tamamen cppreference'dan kopyalanmış) kendiniz yazmanız gerekiyor.
 template < typename A, typename T, typename Compare>
uint lower_bound( const A &ar[], const T &value, Compare &comp){
   long count = ArraySize (ar);
   uint first = 0 ;
  
   while (count > 0 ){
       uint it = first;
       uint step = count / 2 ;
      it += step;
       if (comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1 ;
      }
       else
         count = step;
   }
   return first;
}

void OnStart (){
   struct M_point{
       double price;
       datetime time;
   };
   M_point ar[ 5 ];
   ar[ 0 ].time = 2 ; ar[ 1 ].time = 4 ; ar[ 2 ].time = 6 ;
   ar[ 3 ].time = 8 ; ar[ 4 ].time = 10 ;
   struct Comp{
       bool comp( const M_point &p, datetime value) { return p.time < value;}
   }cmp;
   datetime value = 6 ;
   lower_bound(ar, value, cmp);
   return ;
}

Bu süreçte birkaç soru geldi:
1. Comp için bir operatör() yazmak neden imkansız (nedense yasak)?
 bool operator ()( const M_point &p, datetime value ) { return p.time < value ;}
2. Yaygın bir uygulama gibi sabit bir referansı kabul eden bir fonksiyona bir değer iletmek neden imkansız?
lower_bound(ar, 6 , cmp) ); // ошибка
Not: ve bu uyarı da çok can sıkıcı: "yapının üyesi yok, boyut 1 bayta atanmış"
 
coderex :

Onlarla her şey yolunda, sipariş vermek OnTradeTransaction aracılığıyla kontrol edilmelidir, bu arada, doğrudan borsaya Plaza2 üzerinden bağlanırsanız, durum aynıdır - sipariş vermeyle ilgili mesajların alındığını kontrol etmeniz gerekir. Ve MT4'te bu işlev eşzamanlıdır, ancak aynı seçenek MT5'te mevcuttur, yalnızca bu durumda mantığınız işlev bir yanıt alana kadar duracaktır.

Gerekirse, piyasaya yerleştirme için kesilmiş olmasına rağmen kontrol sınıfını bırakabilirim, ancak yakında limit emirleri için kesinleştireceğim.

Uygulamayı kontrol etmek için, yerleşiminin gerçeğini UNUTMAYINIZ. Sınıfı bırak.
 
fxsaber :
Senden kod tabanına bir şey koyman için yalvarıyorum! Eğitim amaçlı.

Kendiniz belirttiğiniz için yapamam https://www.mql5.com/ru/forum/1111/page1743#comment_2877482 . Son zamanlarda hata yerelleştirilemedi, hizmet masasında kaynak kodunu oluşturmak için çok zaman harcadı - sonunda birçok çapraz referans nedeniyle hiçbir şey olmadı (biri diğerini katlanarak çeker) - .ex5 gönderildi

Eğitim amacıyla bir görev önerebilirim: ek değişkenler eklemeden h()'yi basitleştirin, böylece f() her durumda bir kez çağrılır

 bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef MACRO
         if ( f() )
#endif
         {
                 if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100 :

Derlerken hata

(*) Genel durumda, şablon (1)'de T yerine hem A - > (2) hem de const A - > (3) ikame edilebilir.

Niye ya? Const içeren bir şablon, const olmayanları kabul edemez - bu, sözleşmeyi bozar.

 
A100 :

Eğitim amacıyla bir görev önerebilirim: ek değişkenler eklemeden h()'yi basitleştirin, böylece f() her durumda bir kez çağrılır

 bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef MACRO
         if ( f() )
        {
                g1();
                g2();
        }
#else
         if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky :

Niye ya? Const içeren bir şablon, const olmayanları kabul edemez - bu, sözleşmeyi bozar.

Bir şablon kendi içinde değildir (bir işlevin aksine) - görevi bir değiştirme gerçekleştirmektir (#define'e benzer). Değiştirme sonucunda herhangi bir çelişki yoksa (ve hiçbiri yoksa), şablon göreviyle başa çıktı. En azından bunu C++ ile derlemeyi denedim ve derleyici herhangi bir hata veya uyarı vermedi.
 
fxsaber :
Bu tam olarak bir basitleştirme değil. Orijinal sürümde MACRO+2*f+g1+g2=5 - sahip olduğunuz: MACRO+2*f+2*g1+2*g2=7.
 
Sergey Diubakin :

Benzer bir sorunla karşılaşan var mı? Terminalin veya benimkinin "Böceği" mi?

GetLastError() ne döndürür?
 
fxsaber :

MT5-OrderSend tam olarak senkronize DEĞİLDİR - ticaret ortamıyla senkronizasyon yoktur. Bu, tarihin tanıklığının gerçek durumla uyuşmadığı anlamına gelir.

Herhangi bir zaman aşımından söz edilemez. Sorunun güvenilir bir çözümü yok, çünkü senkronizasyon sorunları sunucuda değil, terminal düzeyinde ele alınmalıdır.

Aslında, MT5 kullanıcıları, MT4 köprü geliştiricilerinin yaşadıklarını yaşadı.

OrderSend gönderilirse, bunun yapıldığını UNUTMAYIN (burada olası bir güvenlik açığı vardır). Ayrıca, ilgili mesaj OnTrade'e ulaşana kadar mevcut geçmişe (işlem ortamı) dikkat etmeyin. Gelir gelmez HATIRLANAN UNUTULMALIDIR.

DEPOLANAN veri olmadığında, MT4'te olduğu gibi geçmişe güvenilebilir.

MT4-OrderSend TAMAMEN senkronize edildi.
Bunun neden yapıldığını merak ediyorum ...
Asenkron OrderSendAsync ile akıllı oynarsanız, hem OnTrade hem de OnTradeTransaction işleyebileceğinizi anlıyorum. OrderSend ile MT4'teki gibi basit bir davranış istiyorum. Çağrılan ve çıkışta zaten değiştirilmiş açık pozisyonlar ve geçmiş alındı.
İnce bir nokta var. Mevcut durum global bir değişkende saklanırsa ve durum değişikliği için bekleme süresi yeterince uzunsa ve tüccar Expert Advisor'ın parametrelerini değiştirmeyi başarırsa, global değişkenler sıfırlanacak ve durum sıfırlanacaktır.
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef MACRO
        }
#endif
                g2();
#ifndef MACRO
        }
#endif
}