Testare 'CopyTicks'. - pagina 40

 
Copytix non riesce a far uscire la zecca esistente
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);    
  }
}

Risultato

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

Copytix cambia i dati grezzi

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);    
  }
}


Risultato

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
 

Perché vengono generati dei tic inutili?


Lo script emette ticchettii eccessivi

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];
}


Risultato su 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 in modalità COPY_TICKS_ALL sta riempiendo amatorialmente i campi Bid/Ask a zero.

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


A cosa serve questo? In modalità INFO questo comportamento è comodo, ma in ALL si aspetta di ottenere i dati grezzi e solo la GUI li mostra.



Se il prezzo non è cambiato, è nullo. Così com'è, le bandiere sembrano essere un'entità inutile. Invece di mostrare prezzi nulli, aumenta la struttura di MqlTick con questa bandiera.

Tkc memorizza solo (senza prezzi nulli) le bandiere, memorizza solo (senza bandiere) i prezzi, o è irrazionale avere sia le bandiere che i prezzi?


E perché viene introdotta una bandiera?

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

Che il volume sia cambiato o meno è completamente irrilevante. O sto fraintendendo qualcosa?


ZS Raw ALL data è necessario soprattutto per i caratteri personalizzati, in quanto si riferisce direttamente alla questione del canale di scambio dati attraverso i caratteri personalizzati.

 
fxsaber:

Copitix in modalità COPY_TICKS_ALL sta riempiendo amatorialmente i campi Bid/Ask a zero.


Per cosa è fatto? In modalità INFO questo comportamento è utile, ma in modalità ALL stiamo aspettando i dati grezzi, ma vengono mostrati solo nella GUI.



Se il prezzo non è cambiato, è nullo. Così com'è, le bandiere sembrano essere un'entità inutile. Invece di mostrare prezzi nulli, aumenta la struttura di MqlTick con questa bandiera.

Tkc memorizza solo (senza prezzi nulli) le bandiere, memorizza solo (senza bandiere) i prezzi, o è irrazionale avere sia le bandiere che i prezzi?


E perché viene introdotta una bandiera?

Che il volume sia cambiato o meno è completamente irrilevante. O sto fraintendendo qualcosa?


SZY Raw ALL data è necessario soprattutto per i caratteri personalizzati, poiché affronta direttamente il problema del canale di scambio di dati attraverso i caratteri personalizzati.


Scrivete a servicedeck delle carenze che avete individuato?

Sembra che tutto vada sprecato.


E perché la bandiera?

  • TICK_FLAG_VOLUME - tick ha cambiato volume.

Penso che questo sia un indicatore molto importante. Come altro possiamo sapere che l'affare è stato eseguito, e non solo cambiato, spostato bid ask?

 
Sergey Chalyshev:

Scrivete al service desk su eventuali carenze che avete individuato?

La SD risponde prontamente a tutte le richieste. Lì si tengono ulteriori discussioni.

Penso che questo sia un indicatore molto importante. In quale altro modo sapreste che l'affare è stato fatto e non solo l'offerta e la domanda sono cambiate?

Solo la bandiera è sufficiente.

  • TICK_FLAG_LAST - il tick ha cambiato il prezzo dell'ultima operazione
Cambiandolo in "commercio passato". Il fatto che l'ultimo prezzo siacambiato - non importa a nessuno. Ci possono essere diverse offerte di fila con lo stesso prezzo e volume. Pertanto, ci dovrebbe essere solo una bandiera - l'accordo.
 

TICK_FLAG_VOLUME - tick ha cambiato volume

In qualche modo non ho pensato a ciò che è scritto nella guida prima.

Il volume di cosa ha cambiato?

Cosa significa ciò che è scritto sopra?).

 
fxsaber:

La SR risponde prontamente a tutte le richieste. Lì si tengono ulteriori discussioni.

Tutto ciò che serve è una bandiera.

Cambiandolo in "commercio passato". Il fatto che il prezzo sia cambiato non interessa a nessuno. Ci possono essere diverse offerte di fila con lo stesso prezzo e volume. Pertanto, ci dovrebbe essere solo una bandiera - un accordo.

Se è reattivo è un bene.

Per quanto riguarda le bandiere:

Ho anche avuto questo pensiero, in Expert Advisors per analizzare la situazione, per combinare i trade corrispondenti, è abbastanza.

Questa situazione - l'ora dello scambio, l'ora del server e l'ora del computer non coincidono. Come faccio a sapere che MarketClosed, se c'è un accordo anche all'ultimo prezzo, significa che lo scambio è in corso.

E se si combinano tutti gli accordi ad un livello, non è chiaro a che ora il livello è stato scambiato?

P.S. Le bandiere extra non influiscono sul volume delle bandiere trasmesse.

 
Sergey Chalyshev:

Se risponde, è un bene.

Sulle bandiere:

Ho anche avuto questa idea, negli EAs per l'analisi della situazione, di combinare trade coincidenti, è abbastanza.

Una tale situazione - il tempo di scambio, il tempo del server, il tempo del computer non coincidono. Come faccio a sapere che MarketClosed, se c'è un accordo anche all'ultimo prezzo, significa che lo scambio è in corso.

E se si combinano tutti gli accordi ad un livello, non sarà chiaro per quanto tempo il livello è stato scambiato?

Perché combinare a un livello? Non farei la fusione e lascerei il nastro com'è ora - quello che è venuto dallo scambio.

P.S. Le bandiere non necessarie non influiscono sul volume delle bandiere trasmesse.
Le bandiere sono una misura forzata, perché MQ non restituisce dati grezzi. Li modificano all'interno di CopyTicks.
 

I file tkc sono suddivisi per mese. Domande a causa di questo

  1. Se il terminale non ha ancora caricato i dati dei tick, quando chiamate CopyTicks, come farà il terminale a sapere quali file tkc tirare?
  2. CopyTicksRange è implementato sulla base di CopyTicks o indipendentemente?
  3. Ho capito bene che ottenere i tick per settembre, per esempio, sarà sempre più veloce attraverso CopyTicksRange, che attraverso CopyTicks, perché CopyTicks non sa, attraverso i parametri di input, per quale mese deve estrarre i dati?
  4. Dobbiamo mettere la storia nell'indicatore il più rapidamente possibile. È possibile interrogare tramite CopyTicksRange e ottenere un rimbalzo come -1, fino a quando tutto viene scaricato. E se si richiede per mese: mese corrente, poi mese precedente, ecc. Non sarà più lento, ma l'indicatore sarà pronto a lavorare con almeno un po' di storia. Giusto?