Sıralı olarak bir numaralandırma üzerinde yineleme nasıl yapılır? - sayfa 5

 
Sergei Vladimirov :
Neden hepsi aniden?
MIX'te TickSize 25, Digits 0. 25'in katı olmayan bir tamsayı fiyatının normalleştirilmesi OrderSend hatasına neden olur.
 
fxsaber :
MIX'te TickSize 25, Digits 0. 25'in katı olmayan bir tamsayı fiyatının normalleştirilmesi OrderSend hatasına neden olur.
Sadece bir sonraki şubede bilgisayarı banyoda boğmanızı tavsiye ettim, o zaman her şey daha da gözden düşecek.
 
Dmitry Fedoseev :
Sadece bir sonraki şubede bilgisayarı banyoda boğmanızı tavsiye ettim, o zaman her şey daha da gözden düşecek.
Ne yazık ki bir soytarısın. Ben hiçbir şey yaratmıyorum, ama lanet etme hakkım var - senin hakkında.
 
fxsaber :
MIX'te TickSize 25, Digits 0. 25'in katı olmayan bir tamsayı fiyatının normalleştirilmesi OrderSend hatasına neden olur.
Eh, böyle bir mantıkla ve 0.25'lik bir adım olması durumunda normalleştirme bir hata verecektir. Normalleştirmenin görevi, fiyatı egzotik bir fiyat adımına ayarlamak değil, kayan noktalı bir sayıyı belirli bir kesinliğe yuvarlamaktır . Herhangi bir hataya yol açmaz.
 
Sergei Vladimirov :
Eh, böyle bir mantıkla ve 0.25'lik bir adım olması durumunda normalleştirme bir hata verecektir. Normalleştirmenin görevi, fiyatı egzotik bir fiyat adımına ayarlamak değil, kayan noktalı bir sayıyı belirli bir kesinliğe yuvarlamaktır . Herhangi bir hataya yol açmaz.
Normalleştirme başlangıçta yalnızca biri için tanıtıldı (ve yardımda bahsedildi) - ticaret işlevleri için.
 
Vladimir Batrudinov :

Muhtemelen iki işlevi tanıtmanız gerekir: 1 - numaralandırmadaki öğelerin sayısını döndürür, 2 - öğeyi sayıya göre döndürür ...


Enum'da, örneğin aşağıdaki gibi, öğelere herhangi bir değer atayabilirsiniz. enum bir dizi değil.

 enum crazy
{
    e1 = 100500 ,
    e2 = - 200 ,
    e3 = - 100500 ,
    e4 = 0
};


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
{
     int z10 = e2;
     int z1 = e4;
  
}

C# gibi diller, numaralandırma adının belirtilmesini gerektirirken, C++ ve dolayısıyla MQL4/5, numaralandırmaları oldukça gevşek bir şekilde ele alır. Her ihtimale karşı, bu saçmalığın tıpkı C++'da olduğu gibi MQL5'te derlendiğini kontrol ettim.

 
Alexey Volchanskiy :

Enum'da, örneğin aşağıdaki gibi, öğelere herhangi bir değer atayabilirsiniz. enum bir dizi değil.

Ne olmuş? Bu öğeleri bildirim sırasına göre yinelemekle ilgiliydi.
 
Alexey Navoykov :
Ne olmuş? Bildirim sırasına göre bu öğeleri yinelemekle ilgiliydi.
Ah, peki, evet, soruyu yanlış okudum, diye düşündüm, değerlere göre.
 

Programcılara not:

 #define ENUM_QQ             \
  ENUM_QQ_HELPER(el_1, 3 )   \
  ENUM_QQ_HELPER(el_2, 9 )   \
  ENUM_QQ_HELPER(el_3, 38 )  \
  ENUM_QQ_HELPER(el_4, 1 )   

enum Enum_qq
{
#define ENUM_QQ_HELPER(el, val) el = val,
  ENUM_QQ
#undef ENUM_QQ_HELPER
};

void get_enumqq_array( int &ar[])
{
   int temp[] = {
#define ENUM_QQ_HELPER(el, val) el,
  ENUM_QQ
#undef ENUM_QQ_HELPER
  };
   ArrayResize (ar, ArraySize (temp));
   for ( int i = 0 ;  i < ArraySize (temp);  ++i)
    ar[i] = temp[i];
}

void OnStart ()
{
   int q[];
  get_enumqq_array(q);
   for ( int i = 0 ;  i < ArraySize (q);  ++i)
     Alert (q[i]);
}


Şimdi numaralandırmayı düzenlememiz gerekiyorsa, bir kez ve tek bir yerde düzenleme yapıyoruz. Yeni bir eleman eklememiz gerekiyor, örneğin element_new = 56, ekliyoruz

ENUM_QQ_HELPER(element_new , 56 )

Ve get_enumqq_array() işlevini düzenleme konusunda endişelenmeyin. Tekniğin adı X Macro https://en.wikipedia.org/wiki/X_Macro. Geliştiriciler dilerse standart numaralandırmaları benzer şekilde bitirmek kolaydır.

Belki hemen belli değil, numaralandırma şöyle çıktı:

 enum Enum_qq
{
   el_1 = 3
   el_2 = 9
   el_3 = 38
   el_4 = 1    
};
 
Vasiliy Sokolov :

Diyelim ki bir numaralandırmamız var. Sıralı olarak, örneğin bir döngüde, bu numaralandırmanın tüm olası değerleri nasıl alınır?

Onlar. tf1++ sürekli olarak PERIOD_M1 , PERIOD_M2 , PERIOD_M5 döndürmelidir... Bunun dil araçları kullanılarak yapılamayacağını düşünüyorum.

denenmedi, ancak teoride ENUM_MYENUM varsa, o zaman (ENUM_MYEUM)INT_MAX enumdan maksimum değeri vermelidir. Aksi takdirde, bu bir tür döküm hatasıdır. Yalnızca, cast operatörünün (type) bu türden bir değer döndürmesi gerektiği için.