MT5 e velocidade em ação - página 80

 
fxsaber:

ZS Seria bom se livrar das pendências que vêm ocorrendo há meses. Execute este script em uma máquina com RAM infinita. Por exemplo, não posso carregar carrapatos de 1 de junho apenas um caractere de cada vez. Ele apenas pendura o CopyTicks com consumo zero de recursos.

b2699 - fixo, Obrigado.

 
Ao porquinho mealheiro de códigos que mostram os freios. Desta vez Testador.
 

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Aceitação de ordens SL/TP

fxsaber, 2020.12.11 09:17

// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.
// Запускать на той же машине, на которой установлен MT5-сервер.

Foram processados 100 carrapatos. O atraso na chegada entre o servidor e o terminal varia de um a oito milissegundos. A média é um pouco mais de quatro milissegundos. Isto é igual à defasagem do acionamento da ordem TP, que é onde este ramo começou.


O próprio atraso está dentro do servidor MT5. O canal Server->Terminal não tem nada a ver com isso.


Um grande pedido aos desenvolvedores para eliminar este atraso. Agora com zero pings temos um atraso constante de ticks que chegam não só ao terminal, mas também ao Servidor. Em particular, a aceitação de pedidos.

 
Para reduzir os atrasos comerciais, recomendo a transferência do terminal de batalha para a unidade RAM.
 

Inesperadamente encontrei um carrapato faltando na história, apesar de ter vindo em Market Watch: SymbolInfoTick.



A impressão do mesmo tick através da MQL mostra uma bandeira interessante.

                         [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
        [0] 2021.01.04 20:52:55 103.16300 103.16500 0.0000        0 1609793575267       4       0.00000
        [1] 2021.01.04 20:52:55 103.16300 103.16400 0.0000        0 1609793575788       4       0.00000
        [2] 2021.01.04 20:52:59 103.16400 103.16400 0.0000        0 1609793579367     130       0.00000
        [3] 2021.01.04 20:53:01 103.16400 103.16400 0.0000        0 1609793581817       2       0.00000
        [4] 2021.01.04 20:53:01 103.16300 103.16400 0.0000        0 1609793581969       2       0.00000

Esta bandeira foi formada no carrapato da história pouco antes do carrapato do relógio do mercado perdido. Talvez isto nos diga onde está o problema.


ZS Infelizmente, isto acontece sistematicamente. O histórico de carrapatos não contém todos os carrapatos que chegam ao Terminal.

 
fxsaber:

Inesperadamente encontrei um carrapato faltando na história, apesar de ter vindo em Market Watch: SymbolInfoTick.



A impressão do mesmo tick através da MQL mostra uma bandeira interessante.

Esta bandeira foi formada no carrapato da história pouco antes do carrapato do relógio do mercado desaparecido. Talvez isto nos diga onde está o problema.


ZS Infelizmente, isto acontece sistematicamente. O histórico de carrapatos não contém todos os carrapatos que entram no Terminal.

É verdade. Digamos que a EA negocia um dia inteiro em uma conta de verdade, lucra.

no dia seguinte, eu faço o teste no dia anterior e tenho uma perda.

Não entendo a razão, ou o corretor dá os carrapatos errados ou outra coisa...

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

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

MT5 e Velocidade em Ação

fxsaber, 2021.01.04 20:51

Inesperadamente encontrei uma falta de carrapato na história, apesar do fato de que estava chegando ao Market Watch: SymbolInfoTick.


Iniciei um terminal paralelo, onde o tkc não foi gerado pelo Terminal, mas carregado a partir do Servidor.

Na captura de tela deste terminal à esquerda - o tick está presente. Mas no outro Terminal (à direita) - não é!


Acontece que o próprio Terminal não coloca todos os carrapatos de entrada na história do carrapato. Se você quiser ter o histórico sem omissões, você deve adicionar o arquivo tkc e puxá-lo do Servidor.

Insecto desagradável.

 
// Попытка поймать тик, который не попал в историю тиков.

// Сравнение двух тиков.
bool IsEqual( const MqlTick &Tick1, const MqlTick &Tick2 )
{
  return((Tick1.time_msc == Tick2.time_msc) &&
         !NormalizeDouble(Tick1.bid - Tick2.bid, _Digits) &&
         !NormalizeDouble(Tick1.ask - Tick2.ask, _Digits));
}

// Проверяет наличие тика в истории.
bool IsHistory( const MqlTick &Tick )
{
  bool Res = false;
  
  MqlTick Ticks[];
  
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, Tick.time_msc, Tick.time_msc + 1);
  
  for (int i = 0; !Res && (i < Size); i++)
    Res = IsEqual(Tick, Ticks[i]);
    
  return(Res);
}

void OnTick()
{
  static MqlTick Ticks[];
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
  {
    const int Size = ArrayResize(Ticks, ArraySize(Ticks) + 1);
    
    Ticks[Size - 1] = Tick; // Дописали его в массив
    
    MqlTick HistoryTick[1];
    
    if (CopyTicks(_Symbol, HistoryTick, COPY_TICKS_ALL, 0, 1) > 0) // Взяли последний исторический тик
    {
      int i = 0;
      
      while ((i < Size) && (Ticks[i].time_msc < HistoryTick[0].time_msc)) // Если исторический тик пришел позже проверяемого
      {
        if (!IsHistory(Ticks[i]))                                    // Если в истории тиков нет проверяемого тика,
        {
          Alert("!IsHistory(Ticks[i]) == true");
          ArrayPrint(Ticks, _Digits, NULL, i, 1, ARRAYPRINT_HEADER); // выводим его.
        }
          
        i++;
      }
      
      ArrayRemove(Ticks, 0, i); // Удалили тики, что проверили.
    }
  }  
}

Um tal EA não poderia pegar carrapatos perdidos na história. O de combate o fez. Aparentemente, estes carrapatos não iniciam o OnTick.

Os carrapatos perdidos podem ser reais por dezenas de milissegundos.

 
fxsaber:
Havia um post acima com o código fonte. Agora está vazio. A razão?
O posto deve ter sido quando o site foi atualizado (há dois postos desse tipo na parte em inglês).
 
fxsaber:

Executei um terminal paralelo onde o tkc não foi gerado pelo Terminal, mas carregado a partir do Servidor.

Na imagem da tela deste Terminal à esquerda - o tique está presente. Mas no outro terminal (à direita) não é!

Eu fiz este roteiro em ambos os Terminais.

// Сохранение тиковой истории в текстовый файл.

string GetTickFlag( uint tickflag )
{
  string flag = " " + (string)tickflag;

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : ""; \
                        tickflag -= tickflag & TICK_FLAG_##A;
 TICKFLAG_MACRO(BID)
TICKFLAG_MACRO(ASK)
TICKFLAG_MACRO(LAST)
TICKFLAG_MACRO(VOLUME)
TICKFLAG_MACRO(BUY)
TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (tickflag)
    flag += " FLAG_UNKNOWN (" + (string)tickflag + ")";

  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( const MqlTick &Tick, const int FilterFlags = 0xFF )
{
  return(TOSTRING(time) + "." + ::IntegerToString(Tick.time_msc % 1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags & FilterFlags));
}
#undef  TOSTRING


void OnStart()
{  
  MqlTick Ticks[];
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2021.01.05 01:00' * 1000, D'2021.01.05 10:50' * 1000);
  
  string From = (string)Ticks[0].time;
  string To = (string)Ticks[Size - 1].time;
  
  StringReplace(From, ":", ".");
  StringReplace(To, ":", ".");
  
  const int handle = FileOpen(_Symbol + "_" + From + "-" + To + ".txt", FILE_WRITE | FILE_ANSI | FILE_TXT);

  if (handle != INVALID_HANDLE)
  {        
    for (int i = 0; i < Size; i++)
      FileWrite(handle, TickToString(Ticks[i], 0x7F)); // Фильтр флагов, иначе очень много различий.

    FileClose(handle);
  }
  
  Alert("Done.");
}


Dependendo do intervalo solicitado, o tkc pode mudar (sincronizar com o servidor). Assim, alguns carrapatos que estavam faltando antes do pedido podem começar a estar presentes.

Apesar disso, ainda era possível detectar alguns em caracteres diferentes. Tive que aplicar um filtro de bandeiras, porque elas são muito diferentes para carrapatos em Terminais diferentes.

Eis como se apresentam as diferenças.


EURJPY.


USDCHF .


Em geral, ao negociar em tempo real, alguns carrapatos podem não estar presentes na história dos carrapatos, pois estão no Terminal e podem estar no Servidor.

Este bug tem que ser consertado.

Razão: