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

 
Vladislav Andruschenko:

Agora encontrei um problema quando o histórico contém mais de 1000 negócios e quando chamo a função de processamento do histórico, por exemplo, para calcular o lucro do histórico. + A informação no gráfico começa a desacelerar e o terminal fica pendurado. Isto é, as citações vêm com um atraso.

Sem o código, só se pode adivinhar.

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Peculiaridades de mql5, dicas e truques

Alexey Navoykov, 2017.07.21 17:04

É decepcionante que não haja herança múltipla na MQL. No entanto, podemos fazê-lo funcionar de todas as formas possíveis - com modelos e macros - como podemos evitá-los?)

Aqui está o que eu fiz.Todas as classes de origem devem ser declaradas como modelos que definem a classe pai.

class CBase { };  // базовый класс

// Макросы, задающие список наследования:

#define  INHERIT1(T)  T<CBase>

#define  INHERIT2(T1, T2)  T2<INHERIT1(T1)>

#define  INHERIT3(T1, T2, T3)  T3<INHERIT2(T1,T2)>

#define  INHERIT4(T1, T2, T3, T4)  T4<INHERIT3(T1,T2,T3)>


// Различные пользовательские классы:

template<typename TParent>
class A : public TParent { public: void a() { Print("A"); } };

template<typename TParent>
class B : public TParent { public: void b() { Print("B"); } };

template<typename TParent>
class C : public TParent { public: void c() { Print("C"); } };


class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C


template<typename T>
void SomeFunc(B<T>& obj)  { obj.b(); }   // Проверочная функция, принимающая класс B


void OnInit()
{
  X x;
  x.a();
  x.b();
  x.c();
  
  SomeFunc(x);
}

Claro que existem algumas subtilezas, relacionadas com o facto de as classes serem herdadas sequencialmente (na ordem que estabelecemos), em vez de concomitantemente (como em herança múltipla verdadeira). Em particular, eles terão prioridades diferentes quando ocorrer uma sobrecarga. Além disso, se uma mesma classe template participar várias vezes na cadeia de herança, serão classes completamente diferentes, não relacionadas uma com a outra de forma alguma. Por isso temos de ter cuidado aqui. Mas não há problemas com as interfaces, você pode herdar sem restrições.

Mas e sem uma declaração sob a forma de modelos?

Por exemplo, temos duas bibliotecas prontas e auto-suficientes:

classe CLib1 : público CClass1 { };e
classe CLib2 : público CClass2 { };

Precisamos de fazer com que haja tal herança na classe do programa:

CLib1--> CLib2 --> CProgram para que ambas as bibliotecas estejam disponíveis na classe CProgram. E a biblioteca CLib1 estará disponível no CLib2.

Isto evita que ambas as bibliotecas sejam modificadas de qualquer forma.

É possível?

Com herança múltipla, seria provavelmente assim.
classe CProgram : público CLib1,CLib2 { };

 
Artyom Trishkin:

Que tal sem um modelo de declaração?

Por exemplo, temos duas bibliotecas prontas e auto-suficientes:

classe CLib1 : público CClass1 { };e
classe CLib2 : público CClass2 { };

Precisamos de fazer tal herança na classe do programa:

CLib1--> CLib2 --> CProgram para que ambas as bibliotecas estejam disponíveis na classe CProgram. E a biblioteca CLib1 estará disponível no CLib2.

Isto evita que ambas as bibliotecas sejam modificadas de qualquer forma.

Isto é possível?

Com herança múltipla, seria provavelmente assim.
classe CProgram : público CLib1,CLib2 { };


Não vais perder nada se fizeres isto:

class CProgram
{
  CLib1 lib1;
  CLib2 lib2;
};
 
Koldun Zloy:

Não vais perder nada se o fizeres:

Sim, eu fiz. Eu só queria evitar objectos desnecessários.
 

Provavelmente a melhor maneira de obter dados de funções de cópia assíncrona (CopyRates, CopyTicks, etc.) é através do EventChartCustom.

Especialmente relevante para os indicadores.

 

É possível saber que o servidor de negociação mudou, não apenas a conta -AccountInfoString (ACCOUNT_SERVER) no OnDeinit (EA, não indicador) irá retornar o novo servidor de negociação.

 

Memorando

Ação/tipo de programaMudança de TF ou símboloMudança de conta
IndicadorExecutar OnDeinit e OnInit, mudanças de objeto de classe global (reinicialização total).Nada acontece excepto que o cálculo_previamente calculado é reiniciado.
EAExecutar OnDeinit e OnInit, objeto de classe global não se modifica.Executar OnDeinit e OnInit, mudanças de objetos de classe global (recarga total).
 
Compressão de arquivos e medição universal do tempo de execução

Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos

Minha insatisfação com o testador de estratégias. para desenvolvedores de MQL

fxsaber, 2017.12.04 09:11

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
} 

void OnStart()
{
  uchar Data[];
  uchar Key[1];
  uchar Result[];
  
  FileLoad("thousands_rubies_galaxy.bmp", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
  
  ArrayFree(Data);
  
  FileLoad("space_wind.wav", Data);  
  BENCH(Print(CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result)))
}

Resultado

826534
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 53334
306648
Time[Print(CryptEncode(CRYPT_ARCH_ZIP,Data,Key,Result))] = 29029
 

Há toda uma classe de indicadores que sobrepõem gráficos de preços de outros símbolos no gráfico de preços. Eles são feitos da mesma forma - através de amortecedores indicadores.

No entanto, no MT5 existe um maravilhoso OBJ_CHART, que lhe permite realizar esta tarefa de forma muito mais bonita e sem buffers indicadores.

Por exemplo, você pode colocar qualquer indicador e ver imediatamente como ele fica em outro símbolo.

Esquema de escravidão - vários gráficos são exibidos como pano de fundo do gráfico principal.

 
fxsaber:

Por exemplo, você pode lançar qualquer indicador e ver imediatamente como ele fica em outro símbolo.

Esquema de escravidão - vários gráficos são exibidos como pano de fundo do gráfico principal.

Há alguma imagem de como isto seria? Não está muito claro, eu ainda não useiOBJ_CHART