Testando 'CopyTicks'. - página 40

 
Copytix não consegue tirar o tick existente
struct MQLTICK
{
  uchar Data[sizeof(MqlTick)];
};

union UNION
{
  MQLTICK Tick1;
  MqlTick Tick2;  
  
  UNION()
  {
    ArrayInitialize(this.Tick1.Data, 1);
  }
};

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

void OnStart()
{  
  const string Name = "A1234";

  if (CustomSymbolCreate(Name) || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
  {    
    UNION Union;
    
    MqlTick Ticks[] = {{0}};
    Ticks[0] = Union.Tick2;
    
    Ticks[0].time = TimeCurrent();
    Ticks[0].time_msc = Ticks[0].time * 1000;
    
    Print(TOSTRING(CustomTicksReplace(Name, Ticks[0].time_msc, Ticks[0].time_msc, Ticks))); // Тик записали без проблем
    
    MqlTick Ticks2[];
    
    SymbolSelect(Name, true);            
    
    // Прочесть тик не можем
    Print(TOSTRING(CopyTicksRange(Name, Ticks2)));
    Print(TOSTRING(CopyTicks(Name, Ticks2)));
    
    SymbolSelect(Name, false);            
    CustomSymbolDelete(Name);    
  }
}

Resultado

CustomTicksReplace(Name,Ticks[0].time_msc,Ticks[0].time_msc,Ticks) = 1
CopyTicksRange(Name,Ticks2) = 0
CopyTicks(Name,Ticks2) = 0
 

Copytix muda os dados brutos

struct MQLTICK
{
  uchar Data[sizeof(MqlTick)];
};

union UNION
{
  MQLTICK Tick1;
  MqlTick Tick2;  
  
  UNION()
  {
    ArrayInitialize(this.Tick1.Data, 1);
  }
};

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

void OnStart()
{  
  const string Name = "A1234";

  if (CustomSymbolCreate(Name) || SymbolInfoInteger(Name, SYMBOL_CUSTOM))
  {    
    UNION Union;
    
    MqlTick Ticks[] = {{0}};
    Ticks[0] = Union.Tick2;
    
    Ticks[0].time = 0;
    Ticks[0].time_msc = 0;

    Print(TOSTRING(Ticks[0].ask));
    
    Print(TOSTRING(CustomTicksReplace(Name, Ticks[0].time_msc, Ticks[0].time_msc, Ticks)));
    
    MqlTick Ticks2[];
    
    SymbolSelect(Name, true);            
    
    // Прочесть тик не можем
    Print(TOSTRING(CopyTicksRange(Name, Ticks2)));

    Print(TOSTRING(Ticks2[0].ask));
    
    SymbolSelect(Name, false);            
    CustomSymbolDelete(Name);    
  }
}


Resultado

Ticks[0].ask = 7.748604185489348 e-304
CustomTicksReplace(Name,Ticks[0].time_msc,Ticks[0].time_msc,Ticks) = 1
CopyTicksRange(Name,Ticks2) = 1
Ticks2[0].ask = 0.0
 

Por que estão sendo gerados tiques desnecessários?


O roteiro produz carrapatos excessivos

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

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " 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 (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
     
  return(flag);
}

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

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

struct MQLTICK : public MqlTick
{
  bool operator ==( const MqlTick &Tick ) const
  {
    return((!Tick.ask || (Tick.ask == this.ask)) &&
           (!Tick.bid || (Tick.bid == this.bid)));
  }
  
  void operator =( const MqlTick &Tick )
  {
    this.ask = Tick.ask ? Tick.ask : this.ask;
    this.bid = Tick.bid ? Tick.bid : this.bid;
  }
};

void OnStart()
{
  MqlTick Ticks[];
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 1 e4);

  MQLTICK Tick = {0};  
  
  for (int i = 0; i < Amount; i++)
    if (Tick == Ticks[i])
      Print(TickToString(Ticks[i]));
    else
      Tick = Ticks[i];
}


Resultado em EURUSD Metaquotes-Demo

 time = 2017.11.14 02:27:14.352 bid = 1.16679 ask = 1.16682 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 02:29:11.325 bid = 1.16685 ask = 1.16687 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:04:02.402 bid = 1.16715 ask = 1.16717 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:41:09.453 bid = 1.16707 ask = 1.1671 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 03:42:53.101 bid = 1.16718 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 04:51:22.072 bid = 1.16719 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 04:53:55.649 bid = 1.16714 ask = 1.16717 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 04:56:12.254 bid = 1.16713 ask = 1.16716 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 04:57:12.497 bid = 1.16713 ask = 1.16716 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 04:58:28.934 bid = 1.16719 ask = 1.16722 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:18:44.717 bid = 1.16728 ask = 1.16731 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:25:39.559 bid = 1.16725 ask = 1.16728 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:27:54.243 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 05:29:38.909 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:31:40.868 bid = 1.16719 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 05:38:29.393 bid = 1.16709 ask = 1.16712 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:39:29.429 bid = 1.16709 ask = 1.16712 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 05:47:36.539 bid = 1.16718 ask = 1.1672 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:19:44.287 bid = 1.16726 ask = 1.16729 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:21:11.941 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:22:22.686 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:23:11.019 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:23:24.926 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:24:22.060 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:24:26.871 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:25:26.704 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:25:27.401 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:42:16.087 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:44:00.557 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:44:36.362 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 06:45:00.577 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 06:51:36.472 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:52:37.091 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:53:38.025 bid = 1.16734 ask = 1.16737 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 06:56:11.389 bid = 1.16729 ask = 1.16732 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:03:22.022 bid = 1.16708 ask = 1.16711 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:08:35.305 bid = 1.16718 ask = 1.16721 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 07:24:15.039 bid = 1.16755 ask = 1.16758 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:27:16.339 bid = 1.16751 ask = 1.16754 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:39:26.342 bid = 1.16739 ask = 1.16742 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 07:43:33.909 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:45:25.462 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:47:05.824 bid = 1.16741 ask = 1.16744 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 07:48:19.985 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:49:57.642 bid = 1.16744 ask = 1.16747 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 07:52:39.036 bid = 1.16738 ask = 1.16741 last = 0.0 volume = 0 TICK_FLAG_ASK
 time = 2017.11.14 08:04:47.750 bid = 1.16739 ask = 1.16741 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 08:23:23.778 bid = 1.16705 ask = 1.16707 last = 0.0 volume = 0 TICK_FLAG_BID TICK_FLAG_ASK
 time = 2017.11.14 08:28:22.233 bid = 1.16706 ask = 1.16708 last = 0.0 volume = 0 TICK_FLAG_BID
 time = 2017.11.14 08:28:37.245 bid = 1.16706 ask = 1.16708 last = 0.0 volume = 0 TICK_FLAG_ASK
 

Copitix no modo COPY_TICKS_ALL está preenchendo amadoramente os campos zero Bid/Ask.

void OnStart()
{
  MqlTick Ticks[];
  const int Amount = CopyTicks(_Symbol, Ticks);
  
  ArrayPrint(Ticks);
}
[1986] 2017.11.14 10:12:11 1.16873 1.16873 0.0000        0 1510654331879       6
[1987] 2017.11.14 10:12:12 1.16871 1.16873 0.0000        0 1510654332026       2
[1988] 2017.11.14 10:12:12 1.16871 1.16871 0.0000        0 1510654332947       4
[1989] 2017.11.14 10:12:16 1.16869 1.16870 0.0000        0 1510654336930       6
[1990] 2017.11.14 10:12:17 1.16867 1.16868 0.0000        0 1510654337028       6
[1991] 2017.11.14 10:12:20 1.16866 1.16868 0.0000        0 1510654340943       2
[1992] 2017.11.14 10:12:22 1.16868 1.16869 0.0000        0 1510654342728       6
[1993] 2017.11.14 10:12:22 1.16868 1.16870 0.0000        0 1510654342834       4
[1994] 2017.11.14 10:12:22 1.16868 1.16869 0.0000        0 1510654342954       4
[1995] 2017.11.14 10:12:23 1.16867 1.16869 0.0000        0 1510654343339       2
[1996] 2017.11.14 10:12:27 1.16867 1.16868 0.0000        0 1510654347042       4
[1997] 2017.11.14 10:12:31 1.16867 1.16869 0.0000        0 1510654351428       4
[1998] 2017.11.14 10:12:31 1.16868 1.16869 0.0000        0 1510654351832       2
[1999] 2017.11.14 10:12:31 1.16869 1.16871 0.0000        0 1510654351942       6


Para que serve isto? Em INFO-mode este comportamento é útil, mas em TODOS você espera para obter os dados brutos e somente a GUI os mostra.



Se o preço não mudou, ele é nulo. Como está, as bandeiras parecem ser uma entidade desnecessária. Em vez de mostrar preços nulos, aumentou o MqlTick-estrutura por esta bandeira.

A tkc armazena apenas (sem preços nulos) bandeiras, armazena apenas (sem bandeiras) preços, ou é irracional ter tanto bandeiras como preços lá?


E por que uma bandeira é introduzida?

  • TICK_FLAG_VOLUME – тик изменил объем

Se o volume mudou ou não, é completamente irrelevante. Ou estou entendendo mal alguma coisa?


ZS Raw ALL dados são necessários especialmente para caracteres personalizados, já que estão diretamente relacionados com a questão do canal de intercâmbio de dados através de caracteres personalizados.

 
fxsaber:

Copitix no modo COPY_TICKS_ALL está preenchendo amadoramente os campos zero Bid/Ask.


Para que é feito? No modo INFO, este comportamento é útil, mas no modo TODOS esperamos os dados brutos, mas eles são mostrados apenas na GUI.



Se o preço não mudou, ele é nulo. Como está, as bandeiras parecem ser uma entidade desnecessária. Em vez de mostrar preços nulos, aumentou o MqlTick-estrutura por esta bandeira.

A tkc armazena apenas (sem preços nulos) bandeiras, armazena apenas (sem bandeiras) preços, ou é irracional ter tanto bandeiras como preços lá?


E por que uma bandeira é introduzida?

Se o volume mudou ou não, é totalmente irrelevante. Ou estou entendendo mal alguma coisa?


SZY Raw TODOS os dados são necessários especialmente para caracteres personalizados, pois aborda diretamente a questão do canal de intercâmbio de dados através de caracteres personalizados.


Você escreve para o servicedeck sobre as deficiências que você identificou?

Parece que tudo vai para o lixo.


E por que a bandeira?

  • TICK_FLAG_VOLUME - tick volume alterado.

Acho que este é um indicador muito importante. De que outra forma podemos saber que o negócio foi executado, e não apenas mudado, moveu o lance perguntar?

 
Sergey Chalyshev:

Você escreve para a central de serviço sobre alguma deficiência que tenha identificado?

O SD responde prontamente a todas as solicitações. Outras discussões são realizadas lá.

Acho que este é um indicador muito importante. De que outra forma você saberia que o negócio foi feito e não apenas licitar e perguntar se mudou?

Apenas a bandeira é suficiente.

  • TICK_FLAG_LAST - o tick mudou o preço do último negócio
Ao mudá-lo para "o comércio passou". O fato de que o último preçomudou - ninguém se importa. Pode haver vários negócios seguidos com exatamente o mesmo preço e volume. Portanto, deveria haver apenas uma bandeira - o acordo.
 

TICK_FLAG_VOLUME - volume alterado

De alguma forma, não pensei no que está escrito na ajuda antes.

O volume do que mudou?

O que significa mesmo o que está escrito acima?)

 
fxsaber:

O RS responde prontamente a todas as solicitações. Outras discussões são realizadas lá.

Tudo o que é necessário é uma bandeira.

Ao mudá-lo para "o comércio passou". O fato de o preço ter mudado não é motivo de preocupação para ninguém. Pode haver vários negócios seguidos com exatamente o mesmo preço e volume. Portanto, deveria haver apenas uma bandeira - o acordo.

Se for responsivo, isso é bom.

Quanto às bandeiras:

Também tive este pensamento, em Expert Advisors, para analisar a situação, para combinar negócios correspondentes, é meio que o suficiente.

Esta situação - tempo de troca, tempo do servidor e tempo do computador não coincidem. Como sei que MarketClosed, se houver um negócio mesmo ao último preço, significa que o comércio está em andamento.

E se você combinar todos os negócios em um nível, não está claro a que horas o nível foi negociado?

P.S. As bandeiras extras não afetam o volume de bandeiras transmitidas.

 
Sergey Chalyshev:

Se ele responde, isso é bom.

Sobre as bandeiras:

Eu também tive esta idéia, em EAs para análise de situação, de combinar negócios coincidentes, é meio que o suficiente.

Tal situação - tempo de troca, tempo do servidor, tempo do computador não coincidem. Como sei que MarketClosed, se houver um negócio mesmo ao último preço, significa que o comércio está em andamento.

E se você combinar todos os negócios em um nível, não ficará claro por quanto tempo o nível foi negociado?

Por que combinar em um nível? Eu não me fundiria, e deixaria a fita como está agora - o que veio da troca.

P.S. bandeiras desnecessárias não afetam o volume de bandeiras transferidas.
As bandeiras são medidas forçadas, porque a MQ não devolve dados brutos. Eles os modificam dentro do CopyTicks.
 

Os arquivos tkc são discriminados por mês. Perguntas por causa disso

  1. Se o terminal ainda não tem os dados do tkc carregados, quando você liga para o CopyTicks, como o terminal sabe quais arquivos tkc devem ser puxados?
  2. O CopyTicksRange é implementado com base no CopyTicks ou de forma independente?
  3. Entendo corretamente que obter os ticks para setembro, por exemplo, será sempre mais rápido através do CopyTicksRange, do que através do CopyTicks, porque o CopyTicks não sabe através dos parâmetros de entrada, para qual mês ele deve puxar os dados?
  4. Precisamos colocar o histórico no indicador o mais rápido possível. É possível consultar através do CopyTicksRange e obter um salto como -1, até que tudo seja baixado. E se você solicitar por mês: mês atual, depois mês anterior, etc. Não será mais lento, mas o indicador estará pronto para trabalhar com pelo menos algum histórico. Certo?