Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 169

 

A proposito, l'analogo di Assert

#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:

Non vedo perché ne ho bisogno!

Se gli sviluppatori avessero dato exit / abort come standard, allora sarebbe possibile terminare correttamente l'elaborazione dei dati, se, per esempio, TF non è pronto - dati OHLC, sarebbe anche utile per l'elaborazione degli ordini di invio al server... sarebbe conveniente interrompere il codice in qualsiasi punto e uscire prima del prossimo tick senza interminabili return() per uscire da OnTick()

In realtà è possibile implementare una stampella, ma l'usabilità è pessima lì, non ve la mostro nemmeno, anche se dovrebbe funzionare.
 

Anche se l'usabilità sembra essere stata migliorata. In generale, ogni funzione o chiamata di metodo con possibile output, incluse le funzioni annidate, dovrebbe essere avvolta nella macro _call. Per chi è interessato, sentitevi liberi di scrivere il resto per tutti i gestori. È stato scritto su una manovella, come prova di un'idea, in modo che non sia stata provata, dalla parola - per niente.

#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");}
 

Non c'è protezione in MT5 contro la chiusura accidentale del terminale. C'è stato un tale scenario di recente.

  • Il terminale e il browser sono aperti a tutta la finestra. Sono nel browser.
  • Il browser è bloccato, clicco sulla croce nell'angolo in alto a destra.
  • Non si chiude, lo premo ancora qualche volta.
  • A un certo punto durante la pressione, il browser si chiude - la finestra scompare. E in questo momento la croce del terminale sotto il cursore, dove ho premuto.
  • Il terminale si chiude, così rapidamente che semplicemente non si nota. Soprattutto quando molti terminali sono aperti.

Questa è una situazione molto spiacevole durante, ad esempio, l'ottimizzazione dei lotti. Ma è ancora peggio per il Battle Advisor. Potresti essere stupido a non notare che hai ucciso il tuo terminale di battaglia.


Avete messo una tale protezione.

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

Quando si chiude, un messaggio appare per cinque secondi. Così si può capire cosa è successo veramente. È strano che non ci sia una protezione nel Terminale.

 
fxsaber:

Non c'è protezione in MT5 contro la chiusura accidentale del terminale. C'è stato un tale scenario di recente.

  • Il terminale e il browser sono aperti a tutta la finestra. Sono nel browser.
  • Il browser è bloccato, clicco sulla croce nell'angolo in alto a destra.
  • Non si chiude, lo premo ancora qualche volta.
  • A un certo punto durante la pressione, il browser si chiude - la finestra scompare. E in questo momento la croce del terminale sotto il cursore, dove ho premuto.
  • Il terminale si chiude, così rapidamente che semplicemente non si nota. Soprattutto quando molti terminali sono aperti.

Questa è una situazione molto spiacevole durante, ad esempio, l'ottimizzazione dei lotti. Ma è ancora peggio per il Battle Advisor. Potresti essere stupido a non notare che hai ucciso il tuo terminale di battaglia.


Avete messo una tale protezione.

Quando si chiude, un messaggio appare per cinque secondi. Così si può capire cosa è successo veramente. Strano che il terminale non abbia una protezione.

Ci sono alcune opzioni più semplici.

  1. Mantenere il Terminale di combattimento ridotto al minimo.
  2. Mantenere il terminale di battaglia sul VPS
  3. Legare le mani cattive e stare lontano dal computer. )))
  4. Dovrò pensare, forse qualcosa verrà fuori...)))
 
Alexey Viktorov:

Ci sono alcune opzioni più semplici.

  1. Mantenere il terminale di battaglia ridotto al minimo.
  2. Mantenere il terminale di battaglia su un VPS
  3. Legare le mani cattive e stare lontano dal computer. )))
  4. Devo pensare, forse qualcosa verrà fuori...)))

Su VPS può anche chiudere. Ci sono esperti che mandano Push.

Ed è davvero facile colpire la croce sbagliata quando l'interfaccia del vento rallenta. L'ho fatto, ora lo chiudo sulla barra delle applicazioni nel menu contestuale.

 
Alexey Viktorov:

Ci sono alcune opzioni più facili.

Installare un desktop manager e dedicare un desktop al browser e alle altre cose, e dedicare un altro desktop ai terminali.

O installare Linux (il desktop manager viene fornito con esso :) )

 
Vladimir Simakov:

A proposito, l'analogo di Assert

Per qualsiasi implementazione degli statement mql, ha senso usare la funzione DebugBreak per la modalità di debug. Rende la vita molto facile durante il debug e molto più utile del semplice crash.
 

Forum sul trading, sistemi di trading automatico e test di strategia

Biblioteche: MT4Orders

fxsaber, 2020.04.07 18:47

L'esecuzione parziale è molto facile da trovare in MT5.
// 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))));
}
 

Su un hedge una posizione può consistere in diversi trade IN. Questo viene fatto con un'esecuzione parziale.

In questo caso l'ordine parzialmente eseguito cambierà il suo ORDER_TIME_SETUP(_MSC) al tempo della prima (eventualmente penultima) operazione. In altre parole, sarebbe impossibile determinare dalla cronologia quando, per esempio, è stato piazzato BuyLimit.


Di conseguenza, la posizione sulla copertura può avere un prezzo di apertura frazionato, come spesso si può vedere sul netting.

Motivazione: