Test des "CopyTicks". - page 12

 
Dmitriy Skub:

Après un an, nous résumons les résultats intermédiaires :

- la fonction CopyTicks fonctionne correctement (comme décrit) ;

- Les données actuelles du tick du marché à terme obtenues à l'aide de cette fonction coïncident avec les données de la bourse ;

- L'historique des données des tics du marché à terme pour les instruments les plus liquides est correct à partir du 28.07.2016 (évidemment, début de la dernière version du serveur) ;

Tout ce qui précède s'applique au terminal MT5 version 1395 et aux comptes réels du marché des produits dérivés dans Open-Broker. En principe, le sujet est clos.

Avez-vous également vérifié la direction des échanges ?
 

J'ai une question sur le CopyBuffer

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Est-ce que mql5 vous permet d'écrire un indicateur qui dessine des graphiques dans différentes fenêtres ou d'accéder aux tampons de l'indicateur dans d'autres fenêtres ?

fxsaber, 2016.09.09 10:20

J'ai une question. Est-il raisonnable (du point de vue des performances), lorsque l'on utilise CopyBuffer, d'ajouter des tampons par nombre de valeurs modifiées(le nombre de paramètres d'entrée n'est pas égal à zéro) ou de toujours faire une copie complète du tampon ?

mais presque la même question sur les CopyTicks.

Est-il raisonnable (du point de vue des performances), lorsque l'on utilise CopyTicks, d'ajouter de nouvelles valeurs aux ticks déjà collectés ou de toujours faire la demande complète à partir de l'endroit où les ticks sont requis et de ne pas stocker les valeurs précédemment collectées ?

 
Lorsque l'on ajoute des ticks à un tableau dynamique, quelle est la meilleure valeur de reserve_size dans ArrayResize ?
 
fxsaber:
Lorsque l'on ajoute des ticks à un tableau dynamique, quelle est la meilleure valeur de reserve_size dans ArrayResize ?
Un tableau dynamique est limité à INT_MAX, il est donc préférable de définir cette taille dès le départ.
 
prostotrader:
Un tableau dynamique est limité à INT_MAX, il est donc préférable de définir le tableau à cette taille dès le départ.
C'est dommage pour la mémoire de l'oiseau.
 
prostotrader:
Un tableau dynamique est limité à INT_MAX, il est donc préférable de définir le tableau à cette taille dès le départ.
Mikalas, c'est toi ? :-)
 
Dennis Kirichenko:
Mikalas, c'est toi ? :-)
Примечание

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

Общее число элементов в массиве не может превышать 2147483647.
 
prostotrader:
Je vois à votre écriture que vous l'êtes ;-)
 

Le script sort des tics lorsque les meilleurs gangs ont changé dans la même milliseconde

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

Une partie du résultat :

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

Ici, dans la même milliseconde, quelqu'un a réussi à retirer son BuyLimit= 98230. Exactement retiré, il n'a pas été écrasé par le marqueur.

La vérification a montré que toutes ces actions dans un délai d'une milliseconde sont des retraits (et non des exécutions) de la meilleure limite de la coupe.

Une autre partie du résultat :

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

Ici, d'une manière ou d'une autre, à l'ouverture de la session, quelqu'un a réussi à supprimer à la fois SellLimit et BuyLimit en une milliseconde. C'est-à-dire deux actions en une milliseconde !

Comment est-ce possible ? Après tout, même le HFT ne peut pas supprimer un ordre à cours limité en moins de 1 ms.

Ou si, par le biais d'OrderSendAsync, deux ordres à cours limité (BuyLimit1_price < BuyLimit2_price) sont envoyés à l'intérieur du spread, alors la bourse générera deux ticks consécutifs avec une amélioration du prix d'achat au même moment (avec une précision de 1ms) ?

 
fxsaber:


Comment est-ce possible ? Après tout, même les HFT ne peuvent pas supprimer un ordre à cours limité en moins d'une seconde.


D'où tenez-vous ce savoir ?

Outre Plaza II, il existe un protocole FAST/FIX

Il y a des centaines d'opérations en 1ms.