Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 152

 
Slava :

O var mı? gerçekten var mı? Hangi yön?

Nasıl çoğaltabilirsin?

Komut dosyasını Navigator's Favorites'e yerleştirin .

 void OnStart () {}


Yanlış sürümü derleyin

 void OnStart () {} 123


Terminal'i yeniden başlatın ve Sık Kullanılanlardan komut dosyası düzenlemeyi seçmeyi deneyin.

 
Vladimir Simakov :

geliştiriciler Bir açıklamaya ihtiyaç var. Neye inanmalı? Belgeler veya uygulamalar? Şimdiye kadar tanımsız davranış elde edildi.

@fxsaber resmi açıklamalardan önce kullanmanızı tavsiye etmiyorum, bir anda alıp düzelteceklerdir.

Belgeler güncel değil, düzelteceğiz

Statik değişkenleri ifadelerle başlatmanızı önermiyorum, mümkünse bir sabit kullanın.

Çünkü sabit olmayan ifadeler kullanıldığında, derleyici aşağıdaki kodu oluşturur

 //--- исходная функция
int func( int value )
  {
   static int myStaticVar= value ;    
   
   myStaticVar += value;
   return (myStaticVar);
  }

//--- то, что будет сгенерировано 
bool __Implicit_myStaticVar_initialized= false ;
int   __Implicit_myStaticVar= 0 ;

//--- исходная функция
int func( int value )
  {
   if (!__Implicit_myStaticVar_initialized)
     {
      __Implicit_myStaticVar_initialized= true ;
      __Implicit_myStaticVar= value ;
     }

   __Implicit_myStaticVar += value;
   return (__Implicit_myStaticVar);
  }


Bir ek yük ortaya çıkıyor, her çağrıda __Implicit_myStaticVar_initialized bayrağının bir kontrolü olacak

Sabitli varyant için aşağıdaki kodu alırsınız

 //--- исходная функция
int func( int value )
  {
   static int myStaticVar= 10 ;

   myStaticVar += value ;
   return (myStaticVar);
  }

//--- то, что будет сгенерировано 
int   __Implicit_myStaticVar= 10 ;

int func( int value )
  {
   __Implicit_myStaticVar += value ;
   return (__Implicit_myStaticVar);
  }

ek yük yok

 
Ilyas :

Teşekkürler, şimdi genel giderle birlikte açık.

 
Normalleştirilmemiş fiyat değerlerini özel sembollere kolayca yazabilirsiniz. Aşağıda basit bir kontrol var.
 bool IsNorm( const double Price )
{
   return ( NormalizeDouble (Price, _Digits ) == Price);
}

#define TOSTRING(A) #A + " = " + DoubleToString (A, 16 ) + " "
#define PRINT(A) Print (TOSTRING(A) + TOSTRING( NormalizeDouble (A, _Digits )))
#define ISNORM(A) if (!IsNorm(A)) PRINT(A);

void OnTick ()
{
   MqlTick Tick;
  
   if ( SymbolInfoTick ( _Symbol , Tick))
  {
    ISNORM(Tick.bid)
    ISNORM(Tick.ask)
    ISNORM(Tick.last)
  }
}


Sonuç

 2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 00    Tick.last = 1.8151900000000002 NormalizeDouble (Tick.last, _Digits ) = 1.8151900000000000 
2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 11    Tick.bid = 1.8151100000000003 NormalizeDouble (Tick.bid, _Digits ) = 1.8151100000000001 
2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 11    Tick.ask = 1.8153800000000003 NormalizeDouble (Tick.ask, _Digits ) = 1.8153800000000001 
2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 17    Tick.bid = 1.8151200000000002 NormalizeDouble (Tick.bid, _Digits ) = 1.8151199999999999 
2019.12 . 11 06 : 46 : 56.458 2019.10 . 09 23 : 59 : 17    Tick.ask = 1.8153800000000003 NormalizeDouble (Tick.ask, _Digits ) = 1.8153800000000001 
 
Bu konuyla ilgili olmayan yorumlar " MQL5 MT5 MetaTrader 5 Yeni Başlayanlardan Sorular " bölümüne taşındı.
 
RickD :
... Soru farklı. Belki de MQL5'te çözülmesi gereken bir hata vardır ve onu yeni başlayanlar için konuya aktarmak, durumun hızlı bir analizine katkıda bulunmaz.

Lütfen konu başlığını okuyunuz.

 
Artyom Trishkin :

Lütfen konu başlığını okuyunuz.

Ve çelişkiyi nerede gördün? Anlatılan durum hem dilin bir özelliği hem de bir bug olabilir. Keşfedilmesi gereken buydu.

 
RickD :

Ve çelişkiyi nerede gördün? Anlatılan durum hem dilin bir özelliği hem de bir bug olabilir. Keşfedilmesi gereken buydu.

Numara. İlk olarak, bir hata veya bir özellik olduğu ortaya çıkıyor - o zaman oruç tutuyor ve sadece bir özellik. Tema - yalnızca profesyonel özellikler.

 

@Ilyas @Slava @Renat Fatkhullin

mql, işlevler için belgelenmemiş anahtar sözcükleri destekler

 __inline
__forceinline

Bunları kullanmak mantıklı mı?
Eğer öyleyse, derleyici bunları hangi durumlarda kabul edecek?

 

ArrayReverse yardımından:

ArraySetAsSeries () işlevi , dizi öğelerini fiziksel olarak hareket ettirmez, ancak bir timeseride olduğu gibi öğelere erişimi düzenlemek için yalnızca dizin oluşturma yönünü tersine çevirir . ArrayReverse() işlevi, bir dizinin öğelerini, dizi "ters çevrilecek" şekilde fiziksel olarak hareket ettirir.

Ancak bu kod aksini kanıtlıyor:

   MqlRates rt[];
   CopyRates ( Symbol (), 0 , 0 , 5 , rt);
   ArraySetAsSeries (rt, true );
   ArrayResize (rt, 6 ); // добавляет элемент в конец массива
   //ArraySetAsSeries(rt, true);
   for ( int x = 0 ; x < ArraySize (rt); x++) {
       Print (rt[x].time);
  }
   Print ( "=================" );
(EURUSD,H1)     2019.12 . 13 02 : 00 : 00
(EURUSD,H1)     2019.12 . 13 01 : 00 : 00
(EURUSD,H1)     2019.12 . 13 00 : 00 : 00
(EURUSD,H1)     2019.12 . 12 23 : 00 : 00
(EURUSD,H1)     2019.12 . 12 22 : 00 : 00
(EURUSD,H1)     1970.01 . 01 00 : 00 : 00 - последний элемент
(EURUSD,H1)     =================
   MqlRates rt[];
   CopyRates ( Symbol (), 0 , 0 , 5 , rt);
   //ArraySetAsSeries(rt, true);
   ArrayResize (rt, 6 ); // добавляет элемент в конец массива
   ArraySetAsSeries (rt, true );
   for ( int x = 0 ; x < ArraySize (rt); x++) {
       Print (rt[x].time);
  }
   Print ( "=================" );
(EURUSD,H1)     1970.01 . 01 00 : 09 : 19 - последний элемент
(EURUSD,H1)     2019.12 . 13 02 : 00 : 00
(EURUSD,H1)     2019.12 . 13 01 : 00 : 00
(EURUSD,H1)     2019.12 . 13 00 : 00 : 00
(EURUSD,H1)     2019.12 . 12 23 : 00 : 00
(EURUSD,H1)     2019.12 . 12 22 : 00 : 00
(EURUSD,H1)     =================