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

 

Bu arada, Assert analogu

 #define ASSERT (STD_CAssert( __LINE__ , __FUNCTION__ )).Assert

class STD_CAssert{
   string function;
   int line;
public :
   STD_CAssert( int _line, string _func):line(_line),function(_func){}
   void Assert( bool condition, string text= NULL );
  };
//--------------------------------------------------------------------------
void STD_CAssert::Assert( bool condition, string reason= NULL ){
   if (condition) return ;
   Alert ( StringFormat ( "Assert in line %i, function %s.\nReason: %s." ,line,function,reason== NULL ||reason== "" ? "Unknow" :reason));
   int a= 0 ;
   int b= 1 /a;}

void OnStart ()
{
   Test();
}

void Test(){
   ASSERT( 2 == 3 , "Some reason" );
}
 
Igor Makanu :

bu yüzden ona çok ihtiyacı var!

geliştiriciler normal bir çıkış/iptal verdiyse, örneğin TF - OHLC verileri hazır değilse, verilerin işlenmesini doğru bir şekilde kesmek mümkün olacaktır, ayrıca sunucuya bir sipariş göndermeyi işlemek de yararlı olacaktır. ... OnTick()'ten çıkmak için sonsuz dönüşü () çözmeden kodu herhangi bir yerde kesmek ve bir sonraki tıklamadan önce çıkmak uygundur

Yani bir koltuk değneği tasvir etmek mümkün, ancak orada kullanılabilirlik tamamen kötü, çalışması gerekmesine rağmen göstermeyeceğim bile.
 

Kullanılabilirlik geliştirilmiş gibi görünse de. Genel olarak, iç içe geçmiş işlevler de dahil olmak üzere olası bir çıkışa sahip her işlev veya yöntem çağrısı bir _call makrosuna sarılmalıdır. Kimin umurunda, o zaman tüm işleyiciler için kendiniz yazın. Fikrin bir testi olarak diz üzerine yazılmıştır, böylece kelimeden test edilmemiştir - hiç.

 #ifdef _DEBUG
   #define DELETE(dObj) do if ( CheckPointer (dObj)!= POINTER_INVALID ) { delete dObj; dObj= NULL ;} while ( false )
#else
   #define DELETE(dObj) do { delete dObj; dObj= NULL ;} while ( false )
#endif

#define START   class STD_CStart; void OnStart (){std_start= new STD_CStart; std_start.Main(); DELETE(std_start);}
#define ON_START  START\
static STD_CStart* std_start= NULL ;  \
class STD_CStart{   \
public : void Main();   \
};                \
void STD_CStart::Main

#define DELETE_EVENTS do if (std_start!= NULL ) DELETE(std_start); while ( false )
#define EXIT(out) do {DELETE_EVENTS; return out;} while ( false )
#define CHECK(out) do if (!std_start) EXIT(out); while ( false )
#define _call(funk,out) do {funk;CHECK(out);} while ( false )

ON_START()
{
   int x= 0 ;
   Print ( "Start" );
   _call(TestInt( 4 ),);
   Print (++x);
   _call(TestInt( 1 ),);
   Print (++x);
   _call(TestInt( 6 ),);
   Print (++x);
   TestVoid();   
}

int TestInt( int a){
   static int x= 0 ;
   Print ( "Func call " ,++x);
   if (a< 3 ) EXIT( NULL );
   return 0 ;
}

void TestVoid(){
   Print ( "Error" );}
 

MT5'te Terminalin yanlışlıkla kapanmasına karşı koruma yoktur. Son zamanlarda böyle bir senaryo vardı.

  • Terminal ve tarayıcı tam pencereye genişletildi. tarayıcıdayım.
  • Tarayıcı donuyor, sağ üst köşedeki çarpı işaretine tıklıyorum.
  • Kapanmıyor, birkaç kez daha basıyorum.
  • Tıklamalar sırasında belirli bir noktada tarayıcı kapanır - pencere kaybolur. Ve bu sırada, Terminal, soktuğu yer olan imlecin altından geçer.
  • Terminal kapanıyor ve o kadar hızlı ki fark edilmiyor. Özellikle çok sayıda Terminal açıkken.

Bu, örneğin Toplu Optimizasyon sırasında çok can sıkıcı bir durumdur. Ama daha da kötüsü - bir savaş danışmanı için. Savaş Terminalini bitirdiğini aptalca fark edemezsiniz.


Böyle bir koruma koyun.

 void OnDeinit ( const int Reason )
{
   if (Reason == REASON_CLOSE )
     MessageBox ( "Terminal is being closed!" );
}

Kapatırken, beş saniye boyunca bir mesaj görünür. Böylece gerçekte ne olduğunu anlayabilirsiniz. Terminalde koruma olmaması garip.

 
fxsaber :

MT5'te Terminalin yanlışlıkla kapanmasına karşı herhangi bir koruma yoktur. Son zamanlarda böyle bir senaryo vardı.

  • Terminal ve tarayıcı tam pencereye genişletildi. tarayıcıdayım.
  • Tarayıcı donuyor, sağ üst köşedeki çarpı işaretine tıklıyorum.
  • Kapanmıyor, birkaç kez daha basıyorum.
  • Tıklamalar sırasında belirli bir noktada tarayıcı kapanır - pencere kaybolur. Ve bu sırada, Terminal, soktuğu yer olan imlecin altından geçer.
  • Terminal kapanıyor ve o kadar hızlı ki fark edilmiyor. Özellikle çok sayıda Terminal açıkken.

Bu, örneğin Toplu Optimizasyon sırasında çok can sıkıcı bir durumdur. Ama daha da kötüsü - bir savaş danışmanı için. Savaş Terminalini bitirdiğini aptalca fark edemezsiniz.


Böyle bir koruma koyun.

Kapatırken, beş saniye boyunca bir mesaj görünür. Böylece gerçekte ne olduğunu anlayabilirsiniz. Terminalde koruma olmaması garip.

Birkaç daha hızlı seçenek var.

  1. Savaş terminalini kapalı tutun.
  2. VPS'ye devam etmek için savaş terminali
  3. Eğlenceli kalemleri bağlayın ve bilgisayardan uzak durun. )))
  4. Düşünmelisiniz, belki bir şey çıkar ...)))
 
Alexey Viktorov :

Birkaç daha hızlı seçenek var.

  1. Savaş terminalini kapalı tutun.
  2. VPS'ye devam etmek için savaş terminali
  3. Eğlenceli kalemleri bağlayın ve bilgisayardan uzak durun. )))
  4. Düşünmelisiniz, belki bir şey çıkar ...)))

VPS'de de kapanabilir. Push gönderen uzmanlarım var.

Ve Windows arayüzünü frenlerken yanlış çarpı işaretine tıklamak gerçekten çok kolay. Koştum, şimdi bağlam menüsündeki görev çubuğunda kapatıyorum.

[Silindi]  
Alexey Viktorov :

Birkaç daha hızlı seçenek var.

Bir masaüstü yöneticisi kurun ve tarayıcı ve her türlü çöp için bir masaüstü seçin ve terminaller için başka bir masaüstü seçin.

Veya Linux'u kurun (masaüstü yöneticisi dahildir :))

 
Vladimir Simakov :

Bu arada, Assert analogu

İfadelerin mql'deki herhangi bir uygulaması için, hata ayıklama modu için DebugBreak işlevini kullanmak mantıklıdır. Hata ayıklama sırasında hayatı çok daha kolaylaştırır ve acil bir uçuştan çok daha faydalıdır.
 

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

Kitaplıklar: MT4Orders

fxsaber , 2020.04.07 18:47

MT5'te kısmi yürütme bulmak çok kolaydır.
 // true - сделка в результате частичного исполнения.
bool IsPartial( const ulong TicketDeal )
{
   const ulong TicketOrder = HistoryDealGetInteger (TicketDeal, DEAL_ORDER );
  
   return (( HistoryDealGetInteger (TicketDeal, DEAL_TYPE ) <= DEAL_TYPE_SELL ) &&
         (!TicketOrder ||
          ( HistoryDealGetDouble (TicketDeal, DEAL_VOLUME ) != HistoryOrderGetDouble (TicketOrder, ORDER_VOLUME_INITIAL ))));
}
 

Bir hedge üzerinde, bir pozisyon birkaç IN işlemlerinden oluşabilir. Bu, kısmi yürütme ile olur.

Aynı zamanda, kısmen uygulanan bir emir, ORDER_TIME_SETUP (_MSC) değerini ilk (muhtemelen sondan bir önceki) anlaşmanın yürütülme zamanına değiştirir. Onlar. örneğin BuyLimit'in ne zaman ayarlandığını geçmişten belirlemek mümkün olmayacaktır.


Sonuç olarak, bir hedge pozisyonu, netleştirmede sıklıkla görüldüğü gibi, kısmi bir açık fiyata sahip olabilir.