Testen von 'CopyTicks' - Seite 40

 
Copytix kann das vorhandene Häkchen nicht herausnehmen
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);    
  }
}

Ergebnis

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

Copytix ändert die Rohdaten

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


Ergebnis

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
 

Warum werden unnötige Tics erzeugt?


Das Skript gibt übermäßige Ticks aus

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


Ergebnis auf 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 im Modus COPY_TICKS_ALL füllt dilettantisch null Bid/Ask-Felder aus.

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


Wozu ist das gut? Im INFO-Modus ist dieses Verhalten praktisch, aber im ALL-Modus warten Sie auf die Rohdaten, und nur die grafische Benutzeroberfläche zeigt sie an.



Wenn sich der Preis nicht geändert hat, ist er null. So wie es aussieht, sind die Flaggen eine unnötige Einrichtung. Anstatt Nullpreise anzuzeigen, wurde die MqlTick-Struktur um dieses Flag erweitert.

Speichert tkc nur (ohne Nullpreise) Flaggen, speichert es nur (ohne Flaggen) Preise, oder ist es irrational, dort sowohl Flaggen als auch Preise zu haben?


Und warum wird eine Flagge eingeführt?

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

Ob sich die Lautstärke verändert hat oder nicht, ist völlig irrelevant. Oder habe ich etwas missverstanden?


ZS Raw ALL-Daten werden vor allem für benutzerdefinierte Zeichen benötigt, da sie direkt mit der Frage des Datenaustauschkanals durch benutzerdefinierte Zeichen zusammenhängen.

 
fxsaber:

Copitix im Modus COPY_TICKS_ALL füllt dilettantisch null Bid/Ask-Felder aus.


Wozu wird es gemacht? Im INFO-Modus ist dieses Verhalten sinnvoll, aber im ALL-Modus warten wir auf die Rohdaten, die aber nur in der GUI angezeigt werden.



Wenn sich der Preis nicht geändert hat, ist er gleich Null. So wie es aussieht, sind die Flaggen eine unnötige Einrichtung. Anstatt Nullpreise anzuzeigen, wurde die MqlTick-Struktur um dieses Flag erweitert.

Speichert tkc nur (ohne Nullpreise) Flaggen, speichert es nur (ohne Flaggen) Preise, oder ist es irrational, sowohl Flaggen als auch Preise dort zu haben?


Und warum wird eine Flagge eingeführt?

Ob sich die Lautstärke verändert hat oder nicht, ist völlig irrelevant. Oder habe ich etwas missverstanden?


Die SZY Raw ALL-Daten werden insbesondere für benutzerdefinierte Zeichen benötigt, da sie das Problem des Datenaustauschkanals durch benutzerdefinierte Zeichen direkt angehen.


Schreiben Sie an Servicedeck über die von Ihnen festgestellten Unzulänglichkeiten?

Ich habe das Gefühl, dass alles vergeudet wird.


Und warum die Flagge?

  • TICK_FLAG_VOLUME - Tick veränderte Lautstärke.

Ich denke, dies ist ein sehr wichtiger Indikator. Wie können wir sonst wissen, dass das Geschäft zustande gekommen ist und nicht nur geändert, das Angebot verschoben wurde?

 
Sergey Chalyshev:

Schreiben Sie dem Servicedesk über die von Ihnen festgestellten Unzulänglichkeiten?

Der SD antwortet umgehend auf alle Anfragen. Dort werden weitere Gespräche geführt.

Ich denke, dies ist ein sehr wichtiger Indikator. Woher sollten Sie sonst wissen, dass das Geschäft zustande gekommen ist und sich nicht nur Angebot und Nachfrage geändert haben?

Nur die Flagge reicht aus.

  • TICK_FLAG_LAST - der Tick hat den Preis des letzten Geschäfts verändert
Indem man es in "Handel bestanden" ändert. Die Tatsache, dasssich der letzte Preisgeändert hat, kümmert niemanden. Es kann sein, dass es mehrere Geschäfte hintereinander gibt, die genau den gleichen Preis und das gleiche Volumen haben. Daher sollte es nur eine Flagge geben - den Deal.
 

TICK_FLAG_VOLUME - Tick veränderte Lautstärke

Irgendwie habe ich vorher nicht daran gedacht, was in der Hilfe steht.

Was hat sich in der Menge verändert?

Was bedeutet das oben Geschriebene überhaupt?)

 
fxsaber:

Die SR antwortet umgehend auf alle Anfragen. Dort werden weitere Gespräche geführt.

Alles, was man braucht, ist eine Flagge.

Indem man es in "Handel bestanden" ändert. Die Tatsache, dass sich der Preis geändert hat, ist für niemanden von Belang. Es kann sein, dass es mehrere Geschäfte hintereinander gibt, die genau den gleichen Preis und das gleiche Volumen haben. Daher sollte es nur eine Flagge geben - den Deal.

Wenn sie ansprechbar ist, ist das gut.

Was die Flaggen betrifft:

Ich hatte auch diesen Gedanken, in Expert Advisors, um die Situation zu analysieren, zu kombinieren passenden Trades, es ist irgendwie genug.

Diese Situation - Börsenzeit, Serverzeit und Computerzeit stimmen nicht überein. Woher weiß ich, dass MarketClosed, wenn es ein Geschäft auch zum letzten Preis gibt, bedeutet, dass der Handel im Gange ist.

Und wenn Sie alle Geschäfte auf einer Ebene zusammenfassen, ist nicht klar, wann die Ebene gehandelt wurde?

P.S. Zusätzliche Flaggen haben keinen Einfluss auf das Volumen der übermittelten Flaggen.

 
Sergey Chalyshev:

Wenn es reagiert, ist das gut.

Über die Flaggen:

Ich hatte auch diese Idee, in EAs für die Situationsanalyse, um zusammenfallende Trades zu kombinieren, es ist irgendwie genug.

Eine solche Situation - Börsenzeit, Serverzeit, Computerzeit stimmen nicht überein. Woher weiß ich, dass MarketClosed, wenn es ein Geschäft auch zum letzten Preis gibt, bedeutet, dass der Handel im Gange ist.

Und wenn Sie alle Geschäfte auf einer Ebene zusammenfassen, wird nicht klar, wie lange die Ebene gehandelt wurde?

Warum eine Kombination auf einer Ebene? Ich würde nicht fusionieren und das Band so belassen, wie es jetzt ist - wie es beim Austausch entstanden ist.

P.S. Unnötige Flaggen haben keinen Einfluss auf das Volumen der übermittelten Flaggen.
Flags sind Zwangsmaßnahmen, da MQ keine Rohdaten zurückliefert. Sie ändern sie innerhalb von CopyTicks.
 

Die tkc-Dateien sind nach Monaten aufgeschlüsselt. Fragen dazu

  1. Wenn das Terminal die Tickdaten noch nicht hochgeladen hat, woher weiß es dann beim Aufruf von CopyTicks, welche tkc-Dateien es holen soll?
  2. Ist CopyTicksRange auf der Grundlage von CopyTicks oder unabhängig davon implementiert?
  3. Verstehe ich das richtig, dass die Abfrage der Ticks für September z.B. über CopyTicksRange immer schneller geht als über CopyTicks, weil CopyTicks über die Eingabeparameter nicht weiß, für welchen Monat es Daten abrufen soll?
  4. Wir müssen die Geschichte so schnell wie möglich in den Indikator bringen. Es ist möglich, über CopyTicksRange abzufragen und einen Bounce als -1 zu erhalten, bis alles heruntergeladen ist. Und wenn Sie nach Monaten anfragen: aktueller Monat, dann Vormonat, usw. Er wird nicht langsamer sein, aber der Indikator wird zumindest mit einer gewissen Historie arbeiten können. Oder?