Características da linguagem mql5, subtilezas e técnicas - página 169

 

A propósito, o 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:

ou seja, é exactamente o que eu preciso!

Se os programadores tivessem dado saída / abortar como padrão, então seria possível terminar correctamente o processamento de dados, se, por exemplo, a TF não estiver pronta - dados OHLC, também seria útil para o processamento de ordens de envio para o servidor... seria conveniente interromper o código em qualquer lugar e sair antes do próximo tick sem retorno infinito() para sair de OnTick()

Na verdade é possível implementar uma muleta, mas a usabilidade é má lá, nem sequer a vou mostrar, embora deva funcionar.
 

Embora a usabilidade pareça ter sido melhorada. Em geral, cada chamada de função ou método com saída possível, incluindo funções aninhadas, deve ser envolvida em _call macro. Para os interessados, sinta-se à vontade para escrever o resto para todos os manipuladores. Foi escrito numa manivela, como um teste de uma ideia, por isso não foi testado, a partir da palavra - de todo.

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

Não existe protecção em MT5 contra o encerramento acidental do terminal. Recentemente, houve um tal cenário.

  • O terminal e o navegador estão abertos a toda a janela. Estou no browser.
  • O navegador está congelado, clico na cruz no canto superior direito.
  • Não fecha, pressiono-a mais algumas vezes.
  • A dada altura, durante a prensagem, o navegador fecha - a janela desaparece. E neste momento, a cruz do terminal sob o cursor, onde carreguei.
  • O terminal fecha tão rapidamente que simplesmente não é perceptível. Especialmente quando muitos Terminais estão abertos.

Esta é uma situação muito desagradável durante, por exemplo, a Optimização de Lotes. Mas é ainda pior para o Conselheiro de Batalha. Poderá ser estúpido não reparar que matou o seu terminal de batalha.


Colocou uma tal protecção.

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

Quando a fecha, aparece uma mensagem durante cinco segundos. Para que se possa descobrir o que realmente aconteceu. É estranho que não haja protecção no Terminal.

 
fxsaber:

Não existe protecção em MT5 contra o encerramento acidental do terminal. Recentemente, houve um tal cenário.

  • O terminal e o navegador estão abertos a toda a janela. Estou no browser.
  • O navegador está congelado, clico na cruz no canto superior direito.
  • Não fecha, pressiono-a mais algumas vezes.
  • A dada altura, durante a prensagem, o navegador fecha - a janela desaparece. E neste momento, a cruz do terminal sob o cursor, onde carreguei.
  • O terminal fecha tão rapidamente que simplesmente não é perceptível. Especialmente quando muitos Terminais estão abertos.

Esta é uma situação muito desagradável durante, por exemplo, a Optimização de Lotes. Mas é ainda pior para o Conselheiro de Batalha. Poderá ser estúpido não reparar que matou o seu terminal de batalha.


Colocou uma tal protecção.

Quando a fecha, aparece uma mensagem durante cinco segundos. Para que se possa descobrir o que realmente aconteceu. É estranho que o Terminal não tenha uma protecção.

Há algumas opções mais simples.

  1. Manter o Terminal de Combate minimizado.
  2. Manter o terminal de batalha no VPS
  3. Amarre as mãos malandrecas e afaste-se do computador. )))
  4. Tenho de pensar, talvez surja alguma coisa...)))
 
Alexey Viktorov:

Há algumas opções mais simples.

  1. Manter o terminal de batalha minimizado.
  2. Manter o terminal de batalha num VPS
  3. Amarre as mãos malandrecas e afaste-se do computador. )))
  4. Tenho de pensar, talvez surja alguma coisa...)))

Em VPS também pode fechar. Tenho lá peritos que enviam o Push.

E é realmente fácil bater na cruz errada quando a interface do vento abranda. Já o fiz, agora fecho-o na barra de tarefas no menu de contexto.

 
Alexey Viktorov:

Há algumas opções mais fáceis.

Instalar um gestor de desktop e dedicar um desktop ao browser e outras coisas, e dedicar outro desktop aos terminais.

Ou instalar Linux (o gestor do ambiente de trabalho vem com ele :) )

 
Vladimir Simakov:

A propósito, o análogo de Assert

Para qualquer implementação de declaração mql, faz sentido usar a função DebugBreak para o modo de depuração. Torna a vida muito fácil quando se depura e muito mais útil do que simplesmente cair para fora.
 

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Bibliotecas: MT4Orders

fxsaber, 2020.04.07 18:47

A execução parcial é muito fácil de encontrar em 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))));
}
 

Numa sebe, uma posição pode consistir em várias IN trades. Isto é feito por execução parcial.

Neste caso a ordem que é parcialmente executada alterará a sua ORDER_TIME_SETUP(_MSC) para a altura da primeira (possivelmente penúltima) transacção. Por outras palavras, seria impossível determinar a partir da história quando, por exemplo, o BuyLimit foi colocado.


Como consequência, a posição na sebe pode ter um preço de abertura fracionário, como se pode ver frequentemente na rede.

Razão: