Testando 'CopyTicks'. - página 22

 
fxsaber:
Não, infelizmente. Renat argumentou que o vidro é permanentemente transmitido para todo o relógio de mercado. Mas esta não é uma solução expedita (esbanjadora) para a maioria das situações.

É a única opção possível. As estacas em fluxo é um fluxo nativo e inseparável de carrapatos.

Tudo na plataforma está interligado e requer uma sincronização global de dados. E o fluxo de carrapatos desempenha um papel crucial nisto.

 
Renat Fatkhullin:

É a única opção possível. As taxas de fluxo é um fluxo nativo e inseparável de carrapatos.

Tudo na plataforma está interligado e requer uma sincronização global de dados. E o fluxo de carrapatos desempenha um papel fundamental neste contexto.

Bem, e se nenhuma EA for subscrita pelo BookEvent?

Você recomenda o corte MarketWatch para melhorar o desempenho?

 
Renat Fatkhullin:

Mas o mais importante, os cálculos da taxa de amostragem acima são irrelevantes. Elas são feitas de forma tão desajeitada (medindo tudo menos o tempo do CopyTicks), que é até surpreendente.

Não olhei para os cálculos de velocidade, vou me medir usando o método que você descreveu acima.
 
fxsaber:

Bem, e se nenhuma EA for subscrita pelo BookEvent?

Você recomenda o corte do relógio Marketwatch para melhorar o desempenho?

Corte-o se quiser.

 
Renat Fatkhullin:

É assim que você testa o CopyTicks:

MqlTick ExtArr[2048];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   ulong from   =(TimeTradeServer()-1200)*1000;
   ulong ticks  =GetMicrosecondCount();
   int   records=CopyTicks(_Symbol,ExtArr,COPY_TICKS_INFO,from,2048);

   ticks=GetMicrosecondCount()-ticks;
   Print("Time: ",ticks," msc for ",records," records");
  }

Aqui está a saída em microssegundos: 95 microssegundos por amostra de carrapatos 2048 INFO durante os últimos 20 minutos

2016.10.18 14:15:38.673 TEST (USDCHF,M1)        Time: 95 msc for 1206 records
Isto é radicalmente diferente das dezenas de milissegundos que você alegou. Isso é porque você não mediu o CopyTicks.

Eu já comi o olho do meu gato sobre isso. Eu já fiz muitos testes com o CopyTicks. Desta vez, decidi que é suficiente executar o indicador.

Sua variante.

Network 'xxx': authorized on MetaQuotes-Demo through Access Point EU Amsterdam (ping: 54.84 ms)

2016.10.18 14:29:11.966 Test14 (GBPUSD,M1)      Time: 20263 msc for 2048 records
2016.10.18 14:29:10.841 Test14 (GBPUSD,M1)      Time: 13190 msc for 2048 records
2016.10.18 14:29:07.788 Test14 (GBPUSD,M1)      Time: 13344 msc for 2048 records
2016.10.18 14:29:07.738 Test14 (GBPUSD,M1)      Time: 12751 msc for 2048 records
 

Trata-se de entrar em um esconderijo próximo para as últimas 4096 citações.

Qualquer coisa que entre nele leva microssegundos, e qualquer coisa mais longa requer acesso ao histórico (incluindo disco).

Por isso, meu exemplo de buscar carrapatos por 20 minutos em USDCHF, que raramente é atualizado, estava em cache, mas em GBPUSD, já ultrapassou os últimos 4096 carrapatos e teve que ir para o banco de dados distante.

Se eu definir ulong de =(TimeTradeServer()-600)*1000, então ele também caberá em GBPUSD.

 
Renat Fatkhullin:

Trata-se de entrar em um esconderijo próximo para as últimas 4096 citações.

Qualquer coisa que entre nele leva microssegundos, e qualquer coisa mais requer acesso ao histórico (incluindo disco).

Em sua demonstração, este é de fato o caso. Na BCS, não.

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 46.66 ms)


2016.10.18 15:12:32.949 Test14 (Si-12.16,M1)    Time: 29089 msc for 1503 records
2016.10.18 15:12:32.822 Test14 (Si-12.16,M1)    Time: 33207 msc for 1501 records
2016.10.18 15:12:32.639 Test14 (Si-12.16,M1)    Time: 21389 msc for 1500 records
2016.10.18 15:12:31.959 Test14 (Si-12.16,M1)    Time: 21926 msc for 1500 records

E na Alpari não é nada bom.

Network 'xxx': authorized on Alpari-MT5 through mt5.nl.3 (ping: 61.87 ms)

2016.10.18 15:14:47.159 Test14 (GBPUSD,M1)      Time: 31086 msc for 1836 records
2016.10.18 15:14:46.999 Test14 (GBPUSD,M1)      Time: 30698 msc for 1836 records
2016.10.18 15:14:46.779 Test14 (GBPUSD,M1)      Time: 46306 msc for 1836 records
2016.10.18 15:14:46.612 Test14 (GBPUSD,M1)      Time: 30440 msc for 1836 records
2016.10.18 15:14:46.532 Test14 (GBPUSD,M1)      Time: 36227 msc for 1836 records

Portanto, meu exemplo de buscar carrapatos por 20 minutos em USDCHF raramente atualizado cabe no cache, mas para GBPUSD já ultrapassou os últimos 4096 carrapatos e me força a ir a um banco de dados distante.

Comentado acima sobre o inconveniente do copytix. O indicador apresentado está desacelerando devido ao fato de ser obrigado a chamar copyix várias vezes. E todos os atrasos são por causa disso. Aqui está a razão

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

Testando 'CopyTicks'.

fxsaber, 2016.10.11 19:23

Qual é o algoritmo ideal (mais rápido) para obter os carrapatos de_tempo_a_tempo?

Uma solução foi proposta

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

Testando 'CopyTicks'.

fxsaber, 2016.10.12 08:44

Quando o CopyTicks não é zero De dentro do CopyTicks está procurando (provavelmente uma busca binária) um lugar para começar - um índice na base interna.

Favor adicionar uma função que retorna o índice no banco de dados por tempo. Então esta tarefa será possível para resolver de forma ótima

Agora, para fazer o download de ticks entre datas, devemos fazer pedidos de número de ticks UNKNOWN, a partir da data de início. E depois verificar cada vez, se chegou à data final. E, levando em conta o fato de que cada pedido copytix é muito caro, e você recebe tais freios.

 
fxsaber:

E na Alpari não é nada bom

A Alpari parece ter sido corrigida. A BCS não o fez.

Seria bom ter um cache dos dados copiados solicitados anteriormente. E se a cópia é feita em várias etapas (de[i] a[i+ 1]), seria lógico fazer o cache de muito depois da primeira solicitação.

Em suma, não está claro como a função é organizada internamente. Mas é difícil trabalhar com ele - 100%.

 
Conselheiro
long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_INFO, const uint count = 2000 )
{
  int Res = 0;

  MqlTick NewTicks[];
  const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);

  if ((NewAmount > 0) && (Count < NewAmount))
  {
    Res = ArrayCopy(Ticks, NewTicks, 0, Count);

    // Взяли крайнее время из текущей истории
    LastTime = NewTicks[NewAmount - 1].time_msc;
    Count = 1;

    // Находим (Count) в текущей истории количество тиков со временем LastTime
    for (int i = NewAmount - 2; i >= 0; i--)
    {
      if (NewTicks[i].time_msc < LastTime)
        break;

      Count++;
    }
  }

  return(Res);
}

#define TOSTRING(A) " " + #A + " = " + (string)(A)

void OnTick( void )
{
  // возьмем тики с начала утренней сессии
  LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;
  
  MqlTick Ticks[];

  int i = 0;
  int Sum = 0;

  const ulong StartTime  =GetMicrosecondCount();
  
  // Взяли свеженькие тики
  int Amount = GetFreshTicks(Ticks);
    
  while (Amount > 0)
  {
    Sum += Amount;
    i++;
    
    Print(TOSTRING(i) + TOSTRING(Amount) + TOSTRING(Sum) + TOSTRING(GetMicrosecondCount() - StartTime));
    
    // Взяли свеженькие тики  
    Amount = GetFreshTicks(Ticks);    
  }  
}
Resultado em Metaquotes-demo
2016.10.18 16:06:18.744 Test15 (GBPUSD,M1)       i = 40 Amount = 1453 Sum = 79414 GetMicrosecondCount()-StartTime = 584393
2016.10.18 16:06:18.744 Test15 (GBPUSD,M1)       i = 39 Amount = 1999 Sum = 77961 GetMicrosecondCount()-StartTime = 584314
2016.10.18 16:06:18.729 Test15 (GBPUSD,M1)       i = 38 Amount = 1999 Sum = 75962 GetMicrosecondCount()-StartTime = 568509
2016.10.18 16:06:18.714 Test15 (GBPUSD,M1)       i = 37 Amount = 1999 Sum = 73963 GetMicrosecondCount()-StartTime = 552582
2016.10.18 16:06:18.696 Test15 (GBPUSD,M1)       i = 36 Amount = 1999 Sum = 71964 GetMicrosecondCount()-StartTime = 536790
2016.10.18 16:06:18.681 Test15 (GBPUSD,M1)       i = 35 Amount = 1999 Sum = 69965 GetMicrosecondCount()-StartTime = 520432
2016.10.18 16:06:18.666 Test15 (GBPUSD,M1)       i = 34 Amount = 1999 Sum = 67966 GetMicrosecondCount()-StartTime = 504725
2016.10.18 16:06:18.649 Test15 (GBPUSD,M1)       i = 33 Amount = 1999 Sum = 65967 GetMicrosecondCount()-StartTime = 488911
2016.10.18 16:06:18.634 Test15 (GBPUSD,M1)       i = 32 Amount = 1999 Sum = 63968 GetMicrosecondCount()-StartTime = 473372
2016.10.18 16:06:18.619 Test15 (GBPUSD,M1)       i = 31 Amount = 1999 Sum = 61969 GetMicrosecondCount()-StartTime = 458022
2016.10.18 16:06:18.604 Test15 (GBPUSD,M1)       i = 30 Amount = 1999 Sum = 59970 GetMicrosecondCount()-StartTime = 442557
2016.10.18 16:06:18.589 Test15 (GBPUSD,M1)       i = 29 Amount = 1999 Sum = 57971 GetMicrosecondCount()-StartTime = 427044
2016.10.18 16:06:18.571 Test15 (GBPUSD,M1)       i = 28 Amount = 1999 Sum = 55972 GetMicrosecondCount()-StartTime = 411524
2016.10.18 16:06:18.556 Test15 (GBPUSD,M1)       i = 27 Amount = 1999 Sum = 53973 GetMicrosecondCount()-StartTime = 396539
2016.10.18 16:06:18.541 Test15 (GBPUSD,M1)       i = 26 Amount = 1999 Sum = 51974 GetMicrosecondCount()-StartTime = 381185
2016.10.18 16:06:18.526 Test15 (GBPUSD,M1)       i = 25 Amount = 1999 Sum = 49975 GetMicrosecondCount()-StartTime = 366146
2016.10.18 16:06:18.511 Test15 (GBPUSD,M1)       i = 24 Amount = 1999 Sum = 47976 GetMicrosecondCount()-StartTime = 351066
2016.10.18 16:06:18.496 Test15 (GBPUSD,M1)       i = 23 Amount = 1999 Sum = 45977 GetMicrosecondCount()-StartTime = 336183
2016.10.18 16:06:18.481 Test15 (GBPUSD,M1)       i = 22 Amount = 1999 Sum = 43978 GetMicrosecondCount()-StartTime = 321109
2016.10.18 16:06:18.466 Test15 (GBPUSD,M1)       i = 21 Amount = 1999 Sum = 41979 GetMicrosecondCount()-StartTime = 306119
2016.10.18 16:06:18.449 Test15 (GBPUSD,M1)       i = 20 Amount = 1999 Sum = 39980 GetMicrosecondCount()-StartTime = 288558
2016.10.18 16:06:18.434 Test15 (GBPUSD,M1)       i = 19 Amount = 1999 Sum = 37981 GetMicrosecondCount()-StartTime = 273758
2016.10.18 16:06:18.419 Test15 (GBPUSD,M1)       i = 18 Amount = 1999 Sum = 35982 GetMicrosecondCount()-StartTime = 259255
2016.10.18 16:06:18.406 Test15 (GBPUSD,M1)       i = 17 Amount = 1999 Sum = 33983 GetMicrosecondCount()-StartTime = 244750
2016.10.18 16:06:18.391 Test15 (GBPUSD,M1)       i = 16 Amount = 1999 Sum = 31984 GetMicrosecondCount()-StartTime = 230100
2016.10.18 16:06:18.371 Test15 (GBPUSD,M1)       i = 15 Amount = 1999 Sum = 29985 GetMicrosecondCount()-StartTime = 216143
2016.10.18 16:06:18.361 Test15 (GBPUSD,M1)       i = 14 Amount = 1999 Sum = 27986 GetMicrosecondCount()-StartTime = 201830
2016.10.18 16:06:18.346 Test15 (GBPUSD,M1)       i = 13 Amount = 1999 Sum = 25987 GetMicrosecondCount()-StartTime = 186887
2016.10.18 16:06:18.331 Test15 (GBPUSD,M1)       i = 12 Amount = 1999 Sum = 23988 GetMicrosecondCount()-StartTime = 172667
2016.10.18 16:06:18.311 Test15 (GBPUSD,M1)       i = 11 Amount = 1999 Sum = 21989 GetMicrosecondCount()-StartTime = 158356
2016.10.18 16:06:18.299 Test15 (GBPUSD,M1)       i = 10 Amount = 1999 Sum = 19990 GetMicrosecondCount()-StartTime = 143450
2016.10.18 16:06:18.289 Test15 (GBPUSD,M1)       i = 9 Amount = 1999 Sum = 17991 GetMicrosecondCount()-StartTime = 128520
2016.10.18 16:06:18.269 Test15 (GBPUSD,M1)       i = 8 Amount = 1999 Sum = 15992 GetMicrosecondCount()-StartTime = 114209
2016.10.18 16:06:18.256 Test15 (GBPUSD,M1)       i = 7 Amount = 1999 Sum = 13993 GetMicrosecondCount()-StartTime = 100016
2016.10.18 16:06:18.246 Test15 (GBPUSD,M1)       i = 6 Amount = 1999 Sum = 11994 GetMicrosecondCount()-StartTime = 85745
2016.10.18 16:06:18.231 Test15 (GBPUSD,M1)       i = 5 Amount = 1999 Sum = 9995 GetMicrosecondCount()-StartTime = 71438
2016.10.18 16:06:18.219 Test15 (GBPUSD,M1)       i = 4 Amount = 1999 Sum = 7996 GetMicrosecondCount()-StartTime = 57293
2016.10.18 16:06:18.204 Test15 (GBPUSD,M1)       i = 3 Amount = 1999 Sum = 5997 GetMicrosecondCount()-StartTime = 43192
2016.10.18 16:06:18.181 Test15 (GBPUSD,M1)       i = 2 Amount = 1999 Sum = 3998 GetMicrosecondCount()-StartTime = 28943
2016.10.18 16:06:18.171 Test15 (GBPUSD,M1)       i = 1 Amount = 1999 Sum = 1999 GetMicrosecondCount()-StartTime = 15160
80K carrapatos em meio segundo - devagar! Dizer que deveríamos ter solicitado mais carrapatos em vez de 2000 carrapatos de cada vez é, naturalmente, possível. Qual é então o valor ideal de solicitação?
 
fxsaber:
80K carrapatos em meio segundo é lento! Dizer que era necessário solicitar não 2000 carrapatos de cada vez, mas mais, é claro, é possível. Que valor de solicitação é ótimo então?

É ideal fazer o download do que você precisa no fundo para si mesmo uma vez, e depois só fazer o download de novos a partir do cache próximo em microssegundos.

Se cada vez que você fizer perguntas profundas com a queda para o disco, então é claro que a culpa é sua.

Razão: