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. 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 ?
Примечание
Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов,
назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит
исполняющая подсистема терминала.
Общее число элементов в массиве не может превышать 2147483647.
Le script sort des tics lorsque les meilleurs gangs ont changé dans la même milliseconde
#property script_show_inputssinputint Count = 10000; // Количество тиков на проверку#define TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( constMqlTick &Tick )
{
staticint i = 0;
i++;
return("Tick" + (string)i + ":" + TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume));
}
voidOnStart()
{
MqlTick Ticks[];
constint 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.1311:58:46.861 Test (RTS-9.16,M1) Tick14: time = 2016.09.1310:12:55.819 bid = 98220.0 ask = 98240.0 last = 98240.0 volume = 22016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick13: time = 2016.09.1310: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.1311:58:46.861 Test (RTS-9.16,M1) Tick4: time = 2016.09.1310:00:00.235 bid = 98490.0 ask = 99040.0 last = 98500.0 volume = 82016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick3: time = 2016.09.1310:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 82016.09.1311:58:46.861 Test (RTS-9.16,M1)
2016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick2: time = 2016.09.1310:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 82016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick1: time = 2016.09.1310: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) ?
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
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.
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
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 ?
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.
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 ? :-)
Le script sort des tics lorsque les meilleurs gangs ont changé dans la même milliseconde
Une partie du résultat :
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 :
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) ?
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.