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

 
Alexey Navoykov:

Outra variante conveniente seria herança protegida, quando a classe base tem todos os métodos, e em uma classe herdada você mostra apenas Get.E quando necessário, você a traz para a classe base.

Eu usei herança protegida, mas estraguei a seleccionada. Obrigado!

Mas o Metaeditor ainda não corrigiu o bug, que todos estes métodos são despejados na lista, mesmo que não estejam disponíveis.

Não o verifiquei agora, mas quando estava a experimentar, estava guardado na memória e não desistiu.

 

Antes de modificar ou apagar uma ordem você tem que fazer uma verificação

OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED 

A SB não tem isto, por isso tem de ser você a fazer.


Não há sentido em fazer esta verificação no Testador - todas as ordens actuais têm sempre este estado.

 

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

Mercado fechado

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

// Текущее время на торговом сервере без учета пинга
long GetCurrenTime( void )
{
  static ulong StartTime = GetMicrosecondCount();
  static long PrevTime = 0;
  
  const long TmpTime = GetMarketWatchTime();
  
  if (TmpTime > PrevTime)
  {
    PrevTime = TmpTime;
    
    StartTime = GetMicrosecondCount();
  }
  
  return(PrevTime + (long)((GetMicrosecondCount() - StartTime) / 1000));
}

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string TimeToString( const long Value )
{
  return((string)(datetime)(Value / 1000) + "." + (string)IntegerToString(Value % 1000, 3, '0'));
}

void OnBookEvent( const string& )
{
  Comment(TimeToString(GetCurrenTime()));
}
 

POSITION_TIME_UPDATE refere-se apenas à mudança do lote de posição. Por exemplo, um fechamento parcial de uma posição em qualquer tipo de conta ou uma compensação de uma posição.

As modificações nos níveis SL/TP não afetam POSITION_TIME_UPDATE.

Parafraseando, POSITION_TIME_UPDATE só é afetado por modificações refletidas no Histórico Comercial - comércios. Os níveis SL/TP não se aplicam a tais modificações, pelo que não as afectam.

 

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

Reiniciando uma EA

fxsaber, 2017.09.26 11:35

// Перезапуск себя
bool ExpertReopen()
{
  return(ChartSaveTemplate(0, __FILE__) && ChartApplyTemplate(0, __FILE__));
}
 

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

Bugs, bugs, perguntas

fxsaber, 2017.09.08 11:11

struct A
{
  int i;
};

struct B : public A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = (B)a; // cannot cast 'A' to 'B'
  
  b = a;    // так без проблем
}
A partir da CBO

Está tudo bem aqui.

No primeiro caso, é um elenco, no segundo, é uma missão.

A derivação do pai para o descendente é inadmissível

A atribuição a um objeto é uma chamada do operador de cópia correspondente, neste caso implícita A::operator=(const A &)

Obrigado, por isso o operador da cópia principal permanece disponível foraapenas em caso de herança pública. Eu verifiquei, é verdade.

struct A
{
  int i;
};

struct B : protected A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a;    // 'A::operator=' - cannot access protected member function
}

É bom?

Com esta construção precisamos declarar uma cópia adicional do construtor B::operator=(const A&) e "jogar" a chamada para A::operator= nela

 

Opções para implementar o cálculo de indicadores padrão sobre dados personalizados (sem criar indicadores adicionais).

Базовые индикаторы, применяемые к кастомному инструменту
Базовые индикаторы, применяемые к кастомному инструменту
  • 2017.09.27
  • www.mql5.com
Здравствуйте. Задавал этот вопрос на английском форуме...
 

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

Mercado fechado

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

É preciso deitar fora os símbolos personalizados do loop, porque no Market Watch eles podem ser ajustados a qualquer momento, até mesmo 3000 anos.

 
Na MQL5 é possível escrevê-lo assim
void OnTick()
{  
  double Buffer[];
  
  CopyBuffer(iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE), 0, 0, 1, Buffer);
}

Isto é, "criar" um cabo em cada carrapato. Novas entidades indicadoras não serão criadas, o tempo será desperdiçado apenas na comparação dos parâmetros de entrada do iMA com aqueles indicadores que foram executados em ticks anteriores. Isto é, exactamente a mesma coisa que é feita no MT4.

 
fxsaber:
Na MQL5 é bastante aceitável escrevê-lo desta forma

Isto é, "criar" um cabo em cada carrapato. Novas entidades indicadoras não serão criadas, o tempo será desperdiçado apenas na comparação dos parâmetros de entrada do iMA com aqueles indicadores que foram iniciados nos ticks anteriores. Ou seja, exactamente a mesma coisa que é feita no MT4.

Já mediste o desempenho? Curioso o quanto isso vai atrasar o desempenho. Especialmente no caso de indicadores personalizados.

Razão: