Rejoignez notre page de fans
TickCompressor - avec compression d'un tick en 2-3 octets en moyenne - bibliothèque pour MetaTrader 5
- Vues:
- 59
- Note:
- Publié:
- Mise à jour:
-
Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance
Compression des données de tic-tac pour un stockage sous une forme compacte jusqu'à 3,5 fois plus compacte que les fichiers MQ .tcs. Et pour travailler rapidement avec eux, car il faut moins de temps pour lire 3 octets que 60 octets de la structure MqlTick.
La taille du fichier pour 2023 avec Ask, Bid, time avec une compression ZIP supplémentaire des blocs de données est visible sur la capture d'écran :

Taille du fichier au format .tcs pour 2023 :

3,56 fois la compression.
Pour enregistrer les ticks, on utilise les différences entre les cours acheteur et vendeur et le cours précédent. Souvent (jusqu'à 50...70% de tous les ticks) elle ne dépasse pas (-8...7) points, et elle peut être enregistrée avec 4 bits. Le cours vendeur et le cours acheteur sont combinés en un seul octet.
Plus 1 octet pour stocker la différence de temps de 0 à 255 millisecondes (dans le code jusqu'à 229, les valeurs supérieures à 229 sont utilisées pour encoder les ticks qui sont au-delà de -8...7 points).
Si les prix ou les heures diffèrent par des valeurs plus importantes, ils sont regroupés dans un plus grand nombre d'octets.
Pour une compression supplémentaire, vous pouvez appliquer l'archivage ZIP. La taille des données est alors réduite jusqu'à deux fois.
Il est également possible d'effectuer une compression sur 3 octets, les valeurs Ask et Bid de -129 à 128 étant comprimées sur 8 bits ou 1 octet chacune. Plus 1 octet pour l'heure, soit un total de 3 octets pour la plupart des ticks.
Parfois(https://www.mql5.com/ru/forum/499639/page6#comment_58544810), s'il y a plus de ticks compressés en 2 octets qu'en 4 octets, il est plus efficace de compresser en 3 octets. Il faut regarder les statistiques de l'instrument.
Vous pouvez passer à une compression maximale de 3 octets à l'aide de la commande :
#define compressTo3Bytes // compresser les ticks en 3 octets au lieu de 2.
Éléments d'affichage à stocker sous forme comprimée
3 variantes d'éléments de tic-tac à stocker sont programmées :
- Ask, Bid, time_msc
- Ask, Bid, time_msc, volume_real
- Tous les éléments Ask, Bid, Last, time_msc, volume_real, flags (le volume int est calculé à partir du volume_real).
Ils peuvent également être compressés en ZIP. Il y aura 6 variantes au total
method=1;//1...6 BidAsk_=1, BidAskVolume_=2, All_=3, BidAsk_Zipped=4, BidAskVolume_Zipped=5, All_Zipped=6
Avant de commencer la compression, vous devez transmettre à la classe la variante de stockage des ticks et certains paramètres standard utilisés pour les calculs et la normalisation des prix.
TickCompressor Compressor2; double VolumeStep_=SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); Compressor2.Start(method,_Point,VolumeStep_,_Digits);
Si le Conseiller Expert utilise des drapeaux, ils peuvent être restaurés à partir des changements de prix par la commande
#define RestoreFlags // restaurer les drapeaux de tick à partir des changements de ask, bid, volume - ajoutera 7% au temps de génération du tick 931 au lieu de 869ms
Le Conseiller Expert pour le test de compression est joint, il donnera des statistiques sur la vitesse et le taux de compression. Vous pouvez y voir un exemple de compression et de décompression de ticks.
Un exemple de l'Expert Advisor pour le trading peut être visualisé ici https://www.mql5.com/fr/code/65821.
Statistiques pour la compression à 2 et 3 octets :
| Compression à 2 octets : | Compression à 3 octets |
| Ticks : 47707712 Taille compressée : 135718404 Compression de 2862666420 octets en 135718404 octets ==> 4,74% Performance de compression : 764 MB/s Performance de compression : 13,4 Ticks (millions)/sec. Critère de performance de compression : 281.7 Performance de décompression : 3550 MB/s Performance de décompression : 62.0 Ticks (millions)/sec. Critère de performance de décompression : 1308.8 Statistiques de l'expert https://www.mql5.com/en/code/65821 pour BTCUSDT -------------------- Statistiques : -------------------- 2 octets : 70.1%, 50705359 ticks 4 octets : 17.1%, 12350966 ticks 5 octets : 12.7%, 9185484 ticks 6 octets : 0.0%, 15274 ticks 11 bytes : 0.1%, 46214 ticks 12 bytes : 0.0%, 1 ticks 24 bytes : 0.0%, 1 ticks Total : 72303299 ticks, 197342036 bytes. Moyenne : 2.729 bytes par tick Taille non zippée : 197342036. Taille zippée : 108302550. Compression ZIP : 54.9% Moyenne : 1.498 bytes par tick Pour EURUSD -------------------- Statistiques : -------------------- 2 bytes : 66.2%, 29694779 ticks 4 bytes : 2.3%, 1022937 ticks 5 bytes : 31.5%, 14106637 ticks 6 bytes : 0.0%, 25 ticks 7 octets : 0.0%, 8 ticks 11 octets : 0.0%, 800 ticks 12 octets : 0.0%, 3 ticks 13 octets : 0.0%, 4 ticks 24 octets : 0.0%, 1 ticks Total : 44825194 ticks, 134023609 bytes. Moyenne : 2.99 bytes par tick Taille non zippée : 134023609. Taille zippée : 95495454. Compression ZIP : 71.3 % Moyenne : 2.13 bytes par tick | Ticks : 47707712 Taille compressée : 169378137 Compression de 2862462720 octets en 169378137 octets ==> 5.92% Performance de compression : 623 MB/s Performance de compression : 10.9 Ticks (millions)/sec. Critère de performance de compression : 183.9 Performance de décompression : 3225 MB/s Performance de décompression : 56.4 Ticks (millions)/sec. Critère de performance de décompression : 952.6 Correct = true Statistiques de l'expert https://www.mql5.com/en/code/65821 pour BTCUSDT -------------------- Statistiques : -------------------- 3 octets : 86.6%, 62644158 ticks 4 octets : 0.6%, 412167 ticks 5 octets : 12.7%, 9185484 ticks 6 octets : 0.0%, 15274 ticks 11 bytes : 0.1%, 46214 ticks 12 bytes : 0.0%, 1 ticks 24 bytes : 0.0%, 1 ticks Total : 72303299 ticks, 236108596 bytes. Moyenne : 3.266 bytes par tick Taille non zippée : 236108596. Taille zippée : 105802525. Compression ZIP : 44.8% Moyenne : 1.463 bytes par tick Pour EURUSD 3 bytes : 66.5%, 29801633 ticks 4 bytes : 2.0%, 916083 ticks 5 bytes : 31.5%, 14106637 ticks 6 bytes : 0.0%, 25 ticks 7 bytes : 0.0%, 8 ticks 11 octets : 0.0%, 800 ticks 12 octets : 0.0%, 3 ticks 13 octets : 0.0%, 4 ticks 24 octets : 0.0%, 1 ticks Total : 44825194 ticks, 163611534 bytes. Moyenne : 3.65 bytes par tick Taille non zippée : 163611534. Taille zippée : 96541155. Compression ZIP : 59.0% Moyenne : 2.154 bytes par tick |
Exemples de code
Compression de tic-tac
Bloc par bloc :
int ZIPpos=0;//compteur d'octets compressés if(Amount>ticks_per_block){// > 1 bloc - collage des blocs de tmp à Ticks2 for(int start=0; start<Amount; start+=ticks_per_block){ Compressor2.Compress(Ticks, tmp, start, (Amount > start + ticks_per_block ? ticks_per_block : Amount - start)); ZIPpos+=ArrayCopy(Ticks2,tmp,ZIPpos); //copier à la fin de Ticks2 } }else{//1 bloc - déballage direct dans Ticks2 Compressor2.Compress(Ticks, Ticks2, 0, Amount); }
Si le nombre de ticks dans un bloc est supérieur au nombre total de ticks dans le tableau, il sera compressé en un seul bloc.
Si vous avez toujours besoin d'une compression en 1 bloc, vous pouvez utiliser
Compressor2.Compress(Ticks,Ticks2);
Mais la vitesse de décompression d'un bloc aussi grand ou très grand peut être deux fois plus lente. De plus, la consommation de mémoire sera importante pour un bloc de grande taille.
Décompression des ticks
Lors de la décompression, il est souhaitable de connaître le nombre de ticks emballés. Le tableau récepteur doit avoir cette taille.
ArrayResize(Ticks3,Amount); La taille peut être sauvegardée dans un fichier, par exemple. Elle sera ensuite utilisée lors du déballage.
Si la taille est inconnue, vous pouvez changer la taille à l'intérieur de la boucle par le nombre de ticks dans le bloc
// ralentir ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //redimensionnement d'un grand tableau - plus lent que l'écrasement d'un petit bloc
Ce code récupère les ticks bloc par bloc. S'il n'y a qu'un seul grand bloc, il le compte aussi correctement. Les ticks ne sont pas rassemblés dans un grand tableau, mais peuvent être traités immédiatement par votre stratégie Strategy(Ticks3[j]) ;
while (ZIPpos<ArraySize(Ticks2)){ nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//taille du bloc suivant, augmentation du ZIPpos de 4 uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // copie le nouveau bloc dans tmp avec la taille nextSize /plus lent d'un facteur 3 ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000) ; //redimensionnement d'un grand tableau - plus lent que l'écrasement d'un petit bloc //total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//déballez le bloc et ajoutez-le à Ticks3. total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //déballe le bloc et l'écrase dans Ticks3 ZIPpos+=nextSize; for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}//stratégie };
Rassemble les ticks de tous les blocs dans un grand tableau :
while (ZIPpos<ArraySize(Ticks2)){ nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//taille du bloc suivant, augmentation du ZIPpos de 4 uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // copie le nouveau bloc dans tmp avec la taille nextSize /plus lent ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000) ; //redimensionne un grand tableau - plus lent que l'écrasement d'un petit bloc total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//déballe le bloc et l'ajoute à Ticks3 //total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0) ; //déballe le bloc et l'écrase dans Ticks3 ZIPpos+=nextSize; //for (int j = 0 ; j < ticks ; j++){ Strategy(Ticks3[j]);}//strategy };
Ou une seule ligne. Un seul bloc doit être enregistré. S'il y en a plus, utilisez les deux variantes de code ci-dessus.
total_ticks=Compressor3.DeCompress(Ticks2,Ticks3);
Traduit du russe par MetaQuotes Ltd.
Code original : https://www.mql5.com/ru/code/66201
MARSICD
Indicateur de tendance basé sur deux indicateurs RSI.
MA_NRTR
Indicateur de tendance simple sous forme de NRTR
Titik Impas Breakeven
Alors que l'ajustement manuel du stop-loss d'une seule transaction pour correspondre à son prix d'ouverture est une tâche relativement simple, la gestion de plusieurs positions individuellement peut être lourde et prendre beaucoup de temps. Le script Titik Impas Breakeven pour MT4/MT5 rationalise ce processus, offrant efficacité et commodité aux traders qui gèrent plusieurs positions.
Inter
Indicateur multidevises multitimeframe.