Qualquer pergunta de um PROFI para um SUPER PROFI - 1. - página 42

 
swanhearts:

Olá, foi-me enviado um indicador de MA com todos os níveis que preciso. O problema é que quando eu passo o mouse sobre o indicador (cada MA), ele não mostra o período desse MA. Como consertá-lo? Há um erro de sintaxe constante ao mudar o nomeIndicatorShortName("MASHKI =)"); Por favor, ajude.

o nome do buffer indicador é definido usando SetIndexLabel

 

1. Qual é a maneira mais barata de saber que a chamada de função está no mesmo tique que a chamada anterior?

bool tick_already_processed()
{
   return( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return;

   // recalculate only once on each tick
}

void OnTick()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

O tempo (TimeCurrent) pode permanecer o mesmo, tempo em ms de SymbolInfoTick, teoricamente também.

Comparar a licitação, perguntar e ms vezes é bastante caro.

Não sugiro organizar o controle no próprio Expert Advisor, eu quero ter uma função universal independente.


A mesma questão diz respeito às operações comerciais. Como sabemos que algo mudou na lista de pedidos/posições (incluindo os níveis abertos, SL e TP) desde a última execução?

Eu precisaria colocar alguma bandeira no OnTrade (e reinicializá-la quando pronta), é a maneira mais barata de fazer isso.

Mas, mais uma vez, eu gostaria de uma solução universal.


Quem tem alguma idéia?

 

Andrey Khatimlianskii: 

Exemplo https://www.mql5.com/ru/code/16997

Recursos.mqh arquivo.

Função IsNewPeriod


A idéia básica é usar uma função com estática interna.

Você pode armazená-lo em ID = GetMicroSecondsCount para lembrar e checar carrapatos

Para o mesmo com os pedidos - verifique a magia

Eu não verifiquei o pseudo código abaixo :)

bool IsNewTick(ulong newId) // GetMicrosecondCount() or magic
{
  static ulong id = 0;
  
  if (id != newId) 
  {
    id = newId;
    return true;
  }
  
  return false; 
}
 
Andrey Khatimlianskii:

2. Pergunta semelhante para o comércio. Como saber se algo mudou na lista de pedidos/posições (incluindo níveis abertos, SL e TP) desde a última execução?

Em A, precisamos colocar algum tipo de bandeira no OnTrade (e reinicializá-la após a execução), é a maneira mais barata.

Mas, mais uma vez, eu gostaria de uma solução universal.


Quem tem alguma idéia?

Adicione suas condições (SL/TP etc.) aqui.

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

Organização de um ciclo de transbordo de pedidos

fxsaber, 2017.10.18 12:29

struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}
 
Andrey Khatimlianskii:

1. Qual é a maneira mais barata de saber que a chamada de função está no mesmo tique que a chamada anterior?

O tempo (TimeCurrent) pode permanecer o mesmo, tempo em ms de SymbolInfoTick, teoricamente também.

A comparação de lances, perguntas e ms vezes é muito cara.

Não sugiro organizar o controle na própria EA, eu quero ter uma função universal independente.

A questão aqui não é a barateza, mas a confiabilidade da numeração dos carrapatos. Eu faço as seguintes coisas em minha EA.

#ifdef __MQL5__
#else // __MQL5__
  // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
  static bool IsNotChange( const bool bInit = false )
  {
    static bool IsChange = false;
     
    if (bInit)
      IsChange = false;
      
  #ifdef  HISTORYTICKS_ISCHANGE
    if (bInit)
      HISTORYTICKS::IsChange();
    else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
  #endif // HISTORYTICKS_ISCHANGE
    
    return(!IsChange);
  }
#endif // __MQL5__

Esta é a versão da função para o MT4. Numeração através de indicador de espionagem.


Não estou incluindo a versão da mesma função para o MT5, pois coisas desnecessárias devem ser removidas. Mas se baseia nesta função.

  // Свежие тики с последнего вызова
  static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
    static long LastTime = 0;
    static int LastAmount = 0;

    if (dFrom)
    {
     ::Comment("Waiting Ticks from " + ::TimeToString(dFrom, TIME_DATE) + "...");

      LastAmount = 0;
    }
    
    ::ArrayFree(Ticks);
  
    int Size = (dFrom || LastTime) ? ::CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, dFrom ? (long)dFrom * 1000 : LastTime) : 0;
    
    if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1].time_msc;
      int NewLastAmount = 1;
      
      for (int i = Size - 2; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
      if (::ArrayRemove(Ticks, 0, LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
    else
      Size = ::ArrayResize(Ticks, 0);
    
    return(Size);
  }


Se ele retornar sem zero - novo tique.

 
...:

A idéia básica é usar uma função com estática interna.

Para lembrar e reconciliar carrapatos que você pode armazenar em ID = GetMicroSecondsCount

Obrigado!

A questão toda é apenas esta identificação única (número do tick), que não existe.

GetMicroSecondsCount não vai ajudar, porque vai mudar entre chamadas (é para isso que foi projetado), enquanto GetTickCount, teoricamente, pode não mudar em 2 carrapatos adjacentes.

 
fxsaber:

O problema aqui não é a barateza, mas a confiabilidade da numeração de tick. Em uma EA de combate, eu o faço desta maneira.

Não, será definitivamente mais lento que uma comparação lance/pesquisa/ms.

Qual é o problema com a confiabilidade? O que importa é apenas o fato de mudar algo.

 
fxsaber:

Adicione suas condições (SL/TP etc.) aqui.

Imediatamente lembrado deste código.

Mas a questão é apenas para evitar a enumeração desnecessária de todos os pedidos.

É claro que podemos fazer deste loop um loop único para toda a EA. Mas neste caso, devemos passar para a função um sinal de mudanças (podemos muito bem não chamá-la).

 
Andrey Khatimlianskii:

Não, será definitivamente mais lento que uma comparação lance/pesquisa/ms.

Qual é o problema com a confiabilidade? O que importa é que algo muda.

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

Qualquer pergunta do PROFi ao SUPER PROFi - 1.

Andrey Khatimlianskii, 2020.03.05 23:46

O tempo (TimeCurrent) pode permanecer o mesmo, tempo em ms da SymbolInfoTick, teoricamente, também.

Comparar lances, pedidos e tempo na msc é caro.

Especialmente relevante para o MT4, onde a mudança de etapa time_msc é de 1000ms.

 
Andrey Khatimlianskii:

Mas o objetivo é precisamente evitar a sobreposição desnecessária de todas as ordens.

É claro que podemos fazer deste ciclo um único para toda a EA. Mas então temos que passar para a função um sinal de mudanças (podemos muito bem não chamá-la).

Eu não entendo. Se algo mudou no banco de dados, a única maneira de descobrir é compará-lo com o estado anterior do banco de dados.

Você pode comparar cada elemento correspondente do banco de dados. Ou você pode calcular o hash a partir deles e comparar os hashes.

Razão: