Test des "CopyTicks". - page 14

 
Rashid Umarov:

Par exemple

Légèrement remanié

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";
     
  return(flag);
}

Résultat

2016.09.14 13:52:33.925 Test (Si-9.16,M1)       Tick23: time = 2016.09.13 18:52:35.505 bid = 0.0 ask = 0.0 last = 65253.0 volume = 35  TICK_FLAG_BID TICK_FLAG_ASK

Il s'avère que les deux prix passent à zéro à partir de valeurs non nulles. Et après les zéros, on revient aux non-zéros.

 
fxsaber:

L'indicateur montre que CopyTicks ne donne pas forcément les derniers ticks.

Encore plus intéressant

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 )
{
  static int i = 0;
  
  i++;
  
  return("Tick" + (string)i + ":" + TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

bool MySymbolInfoTick( const string Symb, MqlTick &Tick, const uint Type = COPY_TICKS_ALL )
{
  MqlTick Ticks[];
  const int Amount = ::CopyTicks(Symb, Ticks, Type, 0, 1);
  const bool Res = (Amount > 0);
  
  if (Res)
    Tick = Ticks[Amount - 1];
  
  return(Res);
}

#define  INDICATOR // Переключение между индикатором и экспертом

#ifdef  INDICATOR
  #define  NAME "Indicator: "

  #property indicator_chart_window
  #property indicator_buffers 0
  #property indicator_plots   0

  int OnCalculate( const int rates_total,
                   const int prev_calculated,
                   const datetime &time[],
                   const double &open[],
                   const double &high[],
                   const double &low[],
                   const double &close[],
                   const long &tick_volume[],
                   const long &volume[],
                   const int &spread[] )
#else
  #define  NAME "Expert: "

  void OnTick( void )
#endif
{
  MqlTick Tick1, Tick2;
  
  if (SymbolInfoTick(_Symbol, Tick1) && MySymbolInfoTick(_Symbol, Tick2))
    if (Tick1.time_msc != Tick2.time_msc)
      Print(NAME + ((Tick1.time_msc > Tick2.time_msc) ? "EventTime > CopyTicks_Time" : "EventTime < CopyTicks_Time") +
            "\nFrom Event: " + TickToString(Tick1) + "\nFrom CopyTicks: " + TickToString(Tick2) + "\n");

#ifdef  INDICATOR 
  return(rates_total);
#endif
}
Résultat
2016.09.14 14:25:24.533 Test2 (Si-9.16,M1)      From CopyTicks: Tick16: time = 2016.09.14 14:25:06.62 bid = 65013.0 ask = 65015.0 last = 65014.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.14 14:25:24.533 Test2 (Si-9.16,M1)      From Event: Tick15: time = 2016.09.14 14:25:06.68 bid = 65013.0 ask = 65015.0 last = 65014.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.14 14:25:24.533 Test2 (Si-9.16,M1)      Indicator: EventTime > CopyTicks_Time
2016.09.14 14:25:24.533 Test2 (Si-9.16,M1)      
2016.09.14 14:25:24.533 Test2 (Si-9.16,M1)      From CopyTicks: Tick14: time = 2016.09.14 14:25:06.62 bid = 65013.0 ask = 65015.0 last = 65014.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.14 14:25:24.533 Test2 (Si-9.16,M1)      From Event: Tick13: time = 2016.09.14 14:25:06.68 bid = 65013.0 ask = 65015.0 last = 65014.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.14 14:25:24.533 Test2 (Si-9.16,M1)      Indicator: EventTime > CopyTicks_Time
2016.09.14 14:25:18.974 Test2 (Si-9.16,M1)      
2016.09.14 14:25:18.974 Test2 (Si-9.16,M1)      From CopyTicks: Tick12: time = 2016.09.14 14:25:00.519 bid = 65011.0 ask = 65012.0 last = 65012.0 volume = 8 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY
2016.09.14 14:25:18.974 Test2 (Si-9.16,M1)      From Event: Tick11: time = 2016.09.14 14:25:00.510 bid = 65011.0 ask = 65012.0 last = 65012.0 volume = 8 FLAG_UNKNOWN (0)
2016.09.14 14:25:18.974 Test2 (Si-9.16,M1)      Indicator: EventTime < CopyTicks_Time

Les CopyTicks peuvent à la fois être à la traîne et en avance sur l'Event-tick. Event-tick a souvent un drapeau zéro.

ZZY Corriger le drapeau MqlTick aux drapeaux de l'aide MqlTick.

 

Je ne sais pas comment les autres utilisent CopyTicks. Pas de confiance, malheureusement. Très brut.

EA

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

void OnTick( void )
{
  static MqlTick PrevTick;  
  static int Amount = 0;
  
  MqlTick Ticks[];
  
  if (Amount > 0)
  {
    Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, PrevTick.time_msc);
    
    int i;
    
    for (i = 0; i < Amount; i++)
      if (_R(Ticks[i]) == PrevTick) // https://www.mql5.com/ru/code/16280
        break;
        
    if (i == Amount)
      Print("В истории (length = " + (string)Amount + ") нет тика, что был на предыдущем Event.");
  }
  else
    Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, TimeCurrent() * 1000);
    
  if (Amount > 0)
    PrevTick = Ticks[Amount - 1];  
}

Résultat

2016.09.15 11:04:02.810 Test2 (RTS-9.16,M1)     В истории (length = 2) нет тика, что был на предыдущем Event.
2016.09.15 11:03:59.312 Test2 (RTS-9.16,M1)     В истории (length = 13) нет тика, что был на предыдущем Event.
2016.09.15 11:03:59.290 Test2 (RTS-9.16,M1)     В истории (length = 1) нет тика, что был на предыдущем Event.

Un tick qui était dans l'historique, lors du prochain Tick-event est déjà absent de l'historique !

Chers développeurs, mettez CopyTicks en état de marche. Même les tests simples échouent.

 
Pour le moment, CopyTicks est un peu étiré, mais il fonctionne en temps réel avec un paramètre d'entrée de == 0.
 

J'ai besoin d'ajouter de nouveaux ticks historiques au tableau à chaque OnTick. Quelqu'un l'a-t-il mis en œuvre ?

J'ai du mal - ça ne marche pas. Je n'arrive pas à contourner la courbure des CopyTicks.

 
fxsaber:
Pour le moment, CopyTicks est un peu étiré, mais il fonctionne en temps réel avec un paramètre d'entrée de == 0.
Voici l'un des étirements
void OnTick( void )
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks);
  
  if ((Amount > 1) && (Ticks[Amount - 1].time_msc < Ticks[Amount - 2].time_msc))
    Print("Некорректная история!");
}
Résultat
2016.09.15 13:11:13.231 Test4 (RTS-9.16,M1)     Некорректная история!
2016.09.15 13:10:48.954 Test4 (RTS-9.16,M1)     Некорректная история!
Nous prenons des ticks extrêmes, et constatons que le tick le plus récent a moins de temps que le précédent.
 
fxsaber:
Voici l'un des étirementsRecevoir les ticks extrêmes, et constater que le tick le plus récent a un temps plus court que le précédent.

Consultez le code de cet indicateur

https://www.mql5.com/ru/forum/94399/page6#comment_2776784

Таблица всех сделок. Доступ через MQL5
Таблица всех сделок. Доступ через MQL5
  • avis : 1
  • www.mql5.com
Как организовать получение таблицы сделок? Пока не важно из индикатора или из советника...
 
fxsaber:
Nous prenons les ticks extrêmes, et constatons que le tick le plus récent a un temps plus court que le précédent.
Ceci s'applique uniquement à COPY_TICKS_ALL. Avec les autres modes, l'EA suggérée n'a pas détecté d'erreurs.
 
Dois-je écrire au Service Desk à propos des rapports de ce fil de discussion ou les développeurs le surveillent-ils eux-mêmes ?
 
fxsaber:
Dois-je écrire au Service Desk à propos des rapports de ce fil de discussion ou les développeurs le surveillent-ils eux-mêmes ?
Vous feriez mieux de leur écrire. Ce ne sera pas superflu.
Raison: