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

 
Bir makro çağırırken, herhangi bir parametre belirtemezsiniz (atlayın), bazen özellikle belirtilmemiş bir parametreyle çalışan bir makro olasılığını sağlamak istersiniz.


Bu gibi durumlar için birkaç yardımcı makro veriyorum.

1. Bazen makronuzun içinde bir parametrenin ayarlanıp ayarlanmadığını belirleme isteği vardır. IS_PARAMETER_SET(p), p verildiğinde true döndüren bir ifade belirtir (dize değişkeni == NULL olsa bile).

Dikkat: İfade, derleme aşamasında ön işlemeden sonra değerlendirilir!!!, yani. #ifdef IS_PARAMETER_SET(p) #else gibi bir şeyi uygulamak için kullanılamaz. (bu, aşağıdaki diğer makrolar için de geçerlidir)

2. Parametre ayarlanmadığında derleme hatası almamak için parametre değerini açıkça bir dizgeye dönüştürmeniz gerekiyorsa, __EVAL_STR(p) kullanabilirsiniz. p belirtilmemişse veya açıkça bir NULL değişmezi olarak belirtilmişse, "" döndürür. Diziler, yapılar ve sınıflar için geçerli değildir.

3. Bir parametrenin bir sayıya açık dönüşümü - __EVAL_NON_STR(p). p verilmezse 0 döndürür.p bir dize olduğunda yanlış çalışır!

Kod ve kullanım örnekleri:

 //Expression returns true if macro's parameter is specified.
#define IS_PARAMETER_SET(p) ( "" != #p || __hlp_macro_func(p))
bool __hlp_macro_func( const string p = NULL ) { return "" == p;}
template < typename T> bool __hlp_macro_func(T p)    { return true ;}
template < typename T> bool __hlp_macro_func(T& p)   { return true ;}
template < typename T> bool __hlp_macro_func(T& p[]) { return true ;}


//Expression returns parameter p; if parameter is not specified returns NULL; if p is string returns p
//Error for arrays and objects
#define __EVAL(p) ( "" == #p?NULL:p+NULL)


//Explicit conversion to string. If parameter is not specified or is constant NULL returns ""
//Error for arrays and objects
#define __EVAL_STR(p) ( "" == #p || "NULL" == #p? "" :( string )(p+ NULL ))


//Explicit conversion to number. If parameter is not specified returns 0. Works incorrect if p is string!
//Error for arrays and objects
#define __EVAL_NON_STR(p) ( "" == #p? 0 : p+ 0 )


struct S1
  {   int                a; };
class C1
  { int                a; };

void OnStart ()
  {
//---
   Print (IS_PARAMETER_SET());                 //false
   Print (IS_PARAMETER_SET( "" ));               //true
   Print (IS_PARAMETER_SET( "test" ));           //true
   Print (IS_PARAMETER_SET( NULL ));             //true
   Print (IS_PARAMETER_SET( 0 ));               //true
   Print (IS_PARAMETER_SET( 1 ));               //true
   string str;
   Print (IS_PARAMETER_SET(str));             //true

   int arr[ 1 ];
   Print (IS_PARAMETER_SET(arr));             //true
   S1 _struct;
   Print (IS_PARAMETER_SET(_struct));         //true
   C1 _class;
   Print (IS_PARAMETER_SET(_class));           //true

#define   MACRO1_(a,b)  (IS_PARAMETER_SET(b)?a:-a)
   Print (MACRO1_( 1 , 0 ));                     //1
   Print (MACRO1_( 1 ,));                       //-1

#define   MACRO2_(a,b,c)   Print (a, " = " ,b + c)
#define   MACRO3_(a,b,c)   Print (__EVAL_STR(a), " = " ,__EVAL_NON_STR(b) + __EVAL_NON_STR(c))

 //MACRO2_(, 2,);                            // ',' - syntax error, parameter missed
   MACRO3_(, 2 ,);                             // = 2
   MACRO3_( "a" , 2 , 3 );                       // a = 5
  }


 
fxsaber :

RannForex-Server demo hesabında aşağıdaki kod ile bu Expert Advisor'ı çalıştırırsanız hemen bu durumu yeniden oluşturabilirsiniz.


Sonuç.


Yol boyunca, komut dosyası (her zaman ilk kez değil) eşzamanlı bir OrderSend'in yürütülmesinde bir hata gösterir.

OrderSend'i birkaç on/yüz milisaniye boyunca yürüttükten sonra, sipariş fiyatı eskidir ve OrderSend'in başarıyla yerleştirdiği fiyat değildir.


Aynı biletler konusuna dönersek, bazı sonuçlar çıkarabiliriz.

  1. Kısmi bir sınır belirlenirse, oluşturulan anlaşma "Siparişler ve Anlaşmalar" sekmesinde görünmez.
  2. Bir hedge işleminde, bir emir, farklı fiyatlarda birden fazla IN işlemi oluşturabilir. Sonuç olarak, bir pozisyon açmak için kesirli (puanlara göre) bir fiyat elde edilecektir.
  3. Oluşan pozisyonu Kısmi-ertelenmiş silmeden kapatabilirsiniz. Ancak bundan sonra erteleme işe yararsa, daha önce kapatılan pozisyonun biletine eşit bir biletle anlaşma açacaktır. Onlar. Belirli bir biletle bir pozisyonu kapattığınızda bir durum olabilir. Ve sonra pozisyon aynı biletle tekrar görünür.
  4. Aracı yazılımına bağlı olarak, kısmi yürütme farklı şekillerde uygulanabilir. Yukarıda standart MT5 uygulamasını tanımladım.

PS Birisi başka bir ticaret sunucusunda çoğaltmayı başardıysa, adı paylaşın.

Arama dizisi : Oshibka 010.

Kısmi tatmin meselesine tekrar dönüyorum.

1. Lütfen 3. maddeye göre netleştirin: "Kısmi-ertelemeyi silmeden oluşan pozisyonu kapatabilirsiniz. Ancak bundan sonra erteleme işe yararsa, daha önce kapatılan pozisyonun biletine eşit bir biletle anlaşma açacaktır. yani, belirli bir biletle bir pozisyonu kapattığınızda ve daha sonra pozisyon aynı biletle tekrar ortaya çıktığında bir durum olabilir."
Bu durumda POSITION_IDENTIFIER, POSITION_TICKET'e eşit miydi, değil miydi?

2. Daha önce "POSITION_TICKET != POSITION_IDENTIFIER" başlığında farklı bir MT5 mantığı gösterdiniz.

https://www.mql5.com/ru/forum/227423/page2#comment_6543129

fxsaber :

bulgular

Bunun, komisyoncu hackinin özellikleri değil, MT5'in normal davranışı olduğunu düşünürsek, o zaman

  • ORDER_STATE_PARTIAL geçmiş siparişlere sahip değil.
  • Doldurulan siparişler her zaman ORDER_STATE_FILLED durumuna sahiptir.
  • Kısmi uygulama durumunda, işlem sunucusu tarafından ilgili yeni piyasa emirleri oluşturulur (ORDER_REASON_CLIENT - orijinal emir otomatik olarak verilse bile (EXPERT)).
  • Eski canlı sipariş (bilet değişmez) azaltılmış bir hacimle (ORDER_VOLUME_CURRENT) asılı kalır.
  • Aynı zamanda, eski canlı sipariş ORDER_STATE_PARTIAL durumunu alır. Aslında bu işaret, ORDER_VOLUME_CURRENT ve ORDER_VOLUME_INITIAL karşılaştırmasının sonucudur.
  • Açılan tüm pozisyonlar ID == OrderTicket alır. Nerede OrderTicket - ticaret sunucusu tarafından oluşturulan biletler.
  • Bir ticaret anlaşmasının her zaman tam olarak bir geçmiş emri vardır ve durumu ORDER_STATE_FILLED'dir.
  • Gerçekleştirilen her geçmiş siparişin tam olarak bir ticareti vardır.
  • Yürütülen herhangi bir sipariş için ORDER_VOLUME_INITIAL, yürütüldüğü hacme eşittir. Onlar. tam yürütmeden sonra orijinal yırtık sipariş bile, ORDER_VOLUME_INITITAL tarafından oluşturulan anlaşmanın hacmine eşittir.
  • Orijinal emrin (kısmen uygulanan) zamanı değişmez ve işlem zamanına eşit değildir.
  • Geçmiş tablo, fırsatlara göre değil, sipariş zamanına (ORDER_TIME_SETUP) göre sıralanır. Bu nedenle, DEAL_TIME tarihinden itibaren HistorySelect yaparsanız, ilgili sırayı geçmiş tabloya alamayabilirsiniz.
  • HistorySelectByPosition her zaman gerekli anlaşma/sipariş kümesini döndürür.
  • Herhangi bir ticaret işlemi için kayma miktarını hesaplayabilirsiniz.

Tecrübelerinize göre, MT5 tarafından hangi durumlarda/çalışma modlarında hangi şemanın kullanıldığı genel bir model var mı?

3. Son olarak, "POSITION_TICKET != POSITION_IDENTIFIER" olduğu gerçek durumlar oldu mu?

POSITION_TICKET != POSITION_IDENTIFIER
POSITION_TICKET != POSITION_IDENTIFIER
  • 2018.02.12
  • www.mql5.com
зная id позиции можно ли без перебора узнать тикет позиции...
 
mktr8591 :
Bir makro çağırırken, herhangi bir parametre belirtemezsiniz (atlayın), bazen özellikle belirtilmemiş bir parametreyle çalışan bir makro olasılığını sağlamak istersiniz.
Herhangi bir makroda belirtilmemiş bir parametrenin derleyici tarafından boş bir dize olarak algılandığı ortaya çıktı?
 
fxsaber :
Herhangi bir makroda belirtilmemiş bir parametrenin derleyici tarafından boş bir dize olarak algılandığı ortaya çıktı?

bir bakıma evet , ancak "boş alan gibi" demek daha doğru olabilir. Anlatması zor. :-(.

Ama #p tam olarak bir dizgeye dönüşür ==""

 
mktr8591 :

bir bakıma evet , ancak "boş alan gibi" demek daha doğru olabilir. Anlatması zor. :-(.

Ama #p tam olarak bir dizgeye dönüşür ==""

Teşekkürler, ilginç nokta.

 
Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2021.04.03
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 :

Kısmi infaz meselesine tekrar dönüyorum.

1. Lütfen 3. maddeye göre netleştirin: "Kısmi-ertelemeyi silmeden oluşan pozisyonu kapatabilirsiniz. Ancak bundan sonra erteleme işe yararsa, daha önce kapatılan pozisyonun biletine eşit bir biletle anlaşma açacaktır. yani, belirli bir biletle bir pozisyonu kapattığınızda ve daha sonra pozisyon aynı biletle tekrar ortaya çıktığında bir durum olabilir."
Bu durumda POSITION_IDENTIFIER, POSITION_TICKET'e eşit miydi, değil miydi?

2. Daha önce "POSITION_TICKET != POSITION_IDENTIFIER" başlığında farklı bir MT5 mantığı gösterdiniz.

https://www.mql5.com/ru/forum/227423/page2#comment_6543129

Tecrübelerinize göre, MT5 tarafından hangi durumlarda/çalışma modlarında hangi şemanın kullanıldığı genel bir model var mı?

3. Son olarak, "POSITION_TICKET != POSITION_IDENTIFIER" olduğu gerçek durumlar oldu mu?

Her iki bağlantı da kısmi yürütmenin farklı uygulamalarından bahseder. Bu, MT5 tarafından değil, aracı yazılım tarafından belirlenir.

Uyumsuzluk bileti ve kimlik eşleşmedi.

 
Teşekkür ederim.
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Kitaplıklar: Kullanım

fxsaber , 2021.05.01 14:17

GetMicrosecondCount , önceki çağrıdan daha düşük bir değer döndürebilir (ULONG taşması yok). bu tür durumlara örnekler.
 2021.04 . 29 06 : 43 : 31.915    Alert : NewValue = 296000074313 , PrevValue = 296001329284

2021.04 . 29 06 : 43 : 32.149    Alert : NewValue = 296086250613 , PrevValue = 296087264090

2021.04 . 29 06 : 43 : 31.868    Alert : NewValue = 295129291901 , PrevValue = 295130576710

2021.04 . 29 06 : 43 : 32.180    Alert : NewValue = 295955613012 , PrevValue = 295956589070

2021.04 . 29 06 : 43 : 32.180    Alert : NewValue = 295146223171 , PrevValue = 295147199454

2021.04 . 29 06 : 43 : 32.149    Alert : NewValue = 295065995432 , PrevValue = 295067005968

2021.04 . 29 06 : 43 : 32.149    Alert : NewValue = 295078776581 , PrevValue = 295079787357

Her hat, üç MT4 terminalinde farklı Uzman Danışmanlar tarafından alınır.

Ve bu, MT5'te olur, ancak MT4'te çok daha az sıklıkta olur.

Dikkat olmak.

 
Bu konuyla ilgili olmayan yorumlar " MQL5 MT5 MetaTrader 5 Yeni Başlayanlardan Sorular " bölümüne taşındı.