Testando 'CopyTicks'. - página 12

 
Dmitriy Skub:

Após um ano, resumimos os resultados intermediários:

- a função CopyTicks funciona corretamente (como descrito);

- os dados atuais do mercado de derivativos obtidos através desta função coincidem com os dados de intercâmbio;

- O histórico de dados do mercado futuro para os instrumentos mais líquidos está correto a partir de 28.07.2016 (obviamente, início da última versão do servidor);

Todos os itens acima se aplicam ao terminal MT5 versão 1395 e às contas reais do mercado de derivativos em Open-Broker. Em princípio, o assunto está encerrado.

Você já verificou a direção dos negócios também?
 

Eu tinha uma pergunta sobre o CopyBuffer

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

O mql5 lhe permite escrever um indicador que desenha gráficos em diferentes janelas ou buffers indicadores de acesso em outras janelas?

fxsaber, 2016.09.09 10:20

Eu tenho esta pergunta. É razoável (do ponto de vista de desempenho) quando se usa CopyBuffer para adicionar buffers para o número de valores alterados(a contagem dos parâmetros de entrada não é zero) ou sempre fazer uma cópia completa do buffer?

mas quase a mesma pergunta sobre o CopyTicks.

É razoável (do ponto de vista do desempenho) ao usar CopyTicks para adicionar novos valores a carrapatos já coletados ou sempre fazer um pedido completo do local, onde os carrapatos são necessários e não para armazenar valores coletados anteriormente?

 
Ao adicionar carrapatos a uma matriz dinâmica, qual é o melhor tamanho de reserva no ArrayResize?
 
fxsaber:
Ao adicionar carrapatos a uma matriz dinâmica, qual é o melhor tamanho de reserva no ArrayResize?
Uma matriz dinâmica é limitada ao INT_MAX, por isso é melhor definir este tamanho imediatamente.
 
prostotrader:
Uma matriz dinâmica é limitada ao INT_MAX, por isso é melhor definir a matriz para este tamanho imediatamente.
É uma pena a memória do pássaro.
 
prostotrader:
Uma matriz dinâmica é limitada ao INT_MAX, por isso é melhor definir a matriz para este tamanho imediatamente.
Mikalas, é você? :-)
 
Dennis Kirichenko:
Mikalas, é você? :-)
Примечание

Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, 
назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит 
исполняющая подсистема терминала.

Общее число элементов в массиве не может превышать 2147483647.
 
prostotrader:
Posso ver por sua caligrafia que você é ;-)
 

O script sai quando as melhores gangues mudam no mesmo milissegundo.

#property script_show_inputs

sinput int Count = 10000; // Количество тиков на проверку

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

string TickToString( const MqlTick &Tick )
{
  static int i = 0;
  
  i++;
  
  return("Tick" + (string)i + ":" + TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume));
}

void OnStart()
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  for (int i = 1; i < Amount; i++)
    if (Ticks[i].time_msc == Ticks[i - 1].time_msc) // ищем соседние тики с одним временем (с точностью до мс)
//      if ((Ticks[i].bid > Ticks[i - 1].bid) ||(Ticks[i].ask < Ticks[i - 1].ask)) // ищем выставление лимитной заявки внутрь спреда
        Print(TickToString(Ticks[i - 1]) + "\n" + TickToString(Ticks[i]) + "\n");
}

Parte do resultado:

2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick14: time = 2016.09.13 10:12:55.819 bid = 98220.0 ask = 98240.0 last = 98240.0 volume = 2
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick13: time = 2016.09.13 10:12:55.819 bid = 98230.0 ask = 98240.0 last = 98240.0 volume = 2

Aqui, dentro do mesmo milissegundo alguém conseguiu retirar seu BuyLimit= 98230. Exatamente o retirou, e não foi esmagado com o marcador.

A verificação mostrou que todas essas ações dentro de um milissegundo são retiradas (e não execuções) do melhor limite do copo.

Outra parte do resultado:

2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick4: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 99040.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick3: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick2: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick1: time = 2016.09.13 10:00:00.235 bid = 98500.0 ask = 98600.0 last = 98500.0 volume = 8

Aqui, de alguma forma, na abertura da sessão alguém conseguiu remover tanto o SellLimit quanto o BuyLimit em um milissegundo. Ou seja, duas ações em um milissegundo!

Como isso pode ser? Afinal, mesmo o HFT não pode remover uma ordem limite em menos de 1 ms.

Ou se através de OrderSendAsync dois pedidos limite (BuyLimit1_price < BuyLimit2_price) forem enviados dentro do spread, então a troca gerará dois ticks consecutivos com melhoria de preço de oferta ao mesmo tempo (com uma precisão de 1ms)?

 
fxsaber:


Como isso pode ser? Afinal, mesmo HFTs não podem remover uma ordem limite em menos de 1ms de tempo.


Onde você obteve tal conhecimento?

Além do Plaza II, há um protocolo FAST/FIX

Há centenas de operações em 1ms.