Características del lenguaje mql5, sutilezas y técnicas - página 169

 

Por cierto, el análogo de 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:

¡no puedo estar seguro de necesitarlo!

Si los desarrolladores hubieran dado exit / abort como estándar, entonces sería posible terminar correctamente el procesamiento de datos, si, por ejemplo, TF no está listo - datos OHLC, también sería útil para el procesamiento de envío de órdenes al servidor... sería conveniente interrumpir el código en cualquier lugar y salir antes del siguiente tick sin necesidad de un interminable return() para salir de OnTick()

En realidad es posible implementar una muleta, pero la usabilidad es mala ahí, ni siquiera te la voy a mostrar aunque debería funcionar.
 

Aunque la usabilidad parece haber mejorado. En general, toda función o llamada a un método con posible salida, incluidas las funciones anidadas, debe estar envuelta en la macro _call. Para los interesados, siéntanse libres de escribir el resto para todos los manipuladores. Se escribió sobre una manivela, como prueba de una idea, por lo que no se probó, desde la palabra - en absoluto.

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

En MT5 no hay protección contra el cierre accidental del terminal. Hace poco hubo un escenario de este tipo.

  • El terminal y el navegador están abiertos a toda la ventana. Estoy en el navegador.
  • El navegador está congelado, hago clic en la cruz de la esquina superior derecha.
  • No se cierra, lo presiono unas cuantas veces más.
  • En algún momento durante la pulsación, el navegador se cierra - la ventana desaparece. Y en este momento la cruz de la terminal bajo el cursor, donde presioné.
  • El terminal se cierra, tan rápidamente que simplemente no se nota. Especialmente cuando muchas terminales están abiertas.

Esta es una situación muy desagradable durante, por ejemplo, la optimización de lotes. Pero es aún peor para el Asesor de Batalla. Puedes ser estúpido si no te das cuenta de que has matado tu terminal de batalla.


Has puesto una protección así.

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

Al cerrarlo, aparece un mensaje durante cinco segundos. Para que puedas averiguar lo que realmente sucedió. Es extraño que no haya protección en la Terminal.

 
fxsaber:

En MT5 no hay protección contra el cierre accidental del terminal. Hace poco hubo un escenario de este tipo.

  • El terminal y el navegador están abiertos a toda la ventana. Estoy en el navegador.
  • El navegador está congelado, hago clic en la cruz de la esquina superior derecha.
  • No se cierra, lo presiono unas cuantas veces más.
  • En algún momento durante la pulsación, el navegador se cierra - la ventana desaparece. Y en este momento la cruz de la terminal bajo el cursor, donde presioné.
  • El terminal se cierra, tan rápidamente que simplemente no se nota. Especialmente cuando muchas terminales están abiertas.

Esta es una situación muy desagradable durante, por ejemplo, la optimización de lotes. Pero es aún peor para el Asesor de Batalla. Puedes ser estúpido si no te das cuenta de que has matado tu terminal de batalla.


Has puesto una protección así.

Al cerrarlo, aparece un mensaje durante cinco segundos. Para que puedas averiguar lo que realmente sucedió. Es extraño que la Terminal no tenga protección.

Hay algunas opciones más sencillas.

  1. Mantén el Terminal de Combate minimizado.
  2. Mantener el terminal de batalla en el VPS
  3. Ata las manos traviesas y aléjate del ordenador. )))
  4. Tendré que pensar, tal vez surja algo...))
 
Alexey Viktorov:

Hay algunas opciones más sencillas.

  1. Mantén el terminal de batalla minimizado.
  2. Mantener el terminal de batalla en un VPS
  3. Ata tus manos traviesas y aléjate del ordenador. )))
  4. Tengo que pensar, tal vez surja algo...))

En VPS puede cerrar también. Tengo expertos allí enviando Push.

Y es muy fácil equivocarse de cruz cuando la interfaz del viento se ralentiza. Lo he hecho, ahora lo cierro en la barra de tareas en el menú contextual.

 
Alexey Viktorov:

Hay algunas opciones más fáciles.

Instala un gestor de escritorios y dedica un escritorio al navegador y demás, y dedica otro escritorio a los terminales.

O instalar Linux (el gestor de escritorio viene con él :) )

 
Vladimir Simakov:

Por cierto, el análogo de Assert

Para cualquier implementación de una sentencia mql, tiene sentido utilizar la función DebugBreak para el modo de depuración. Facilita mucho la vida a la hora de depurar y es mucho más útil que el hecho de que se cuelgue.
 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: MT4Orders

fxsaber, 2020.04.07 18:47

La ejecución parcial es muy fácil de encontrar en 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))));
}
 

En una cobertura, una posición puede consistir en varias operaciones IN. Esto se hace mediante la ejecución parcial.

En este caso la orden que se ejecuta parcialmente cambiará su ORDER_TIME_SETUP(_MSC) a la hora de la primera (posiblemente penúltima) operación. En otras palabras, sería imposible determinar a partir del historial cuándo, por ejemplo, se colocó BuyLimit.


Como consecuencia, la posición en la cobertura puede tener un precio de apertura fraccionario, como se puede ver a menudo en la compensación.