L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 2333

 


....

 

Facile, bon article sur les possibilités de programmation génétique

https://blog.ephorie.de/symbolic-regression-genetic-programming-or-if-kepler-had-r

 

J'ai trouvé (pour moi) un moyen cool de tester mes scripts mql sur python, ainsi que d'accélérer de manière significative certaines fonctions de celui-ci, en utilisant la dll.

Voici la fonction initiale dans mql5, que je veux mettre en python. Il recherche simplement les minima et maxima d'un prix en utilisant son modèle lissé.

void get_loc_extremum(double &x[],double &x2[],double &loc_max[],double &loc_min[],bool real_price)
  {
   int N = ArraySize(x);
   for(int i=1; i<N-1; i++)
     {
      if(x[i-1]<x[i]&& x[i]>x[i+1])
        {
         ArrayResize(loc_max,ArraySize(loc_max)+1);
         if(real_price)
            loc_max[ArraySize(loc_max)-1]=x2[i];
         else
            loc_max[ArraySize(loc_max)-1]=x[i];
        }

      if(x[i-1]>x[i]&& x[i]<x[i+1])
        {

         ArrayResize(loc_min,ArraySize(loc_min)+1);
         if(real_price)
            loc_min[ArraySize(loc_min)-1]=x2[i];
         else
            loc_min[ArraySize(loc_min)-1]=x[i];
        }

     }

Cela se fait en plusieurs étapes

1. Quelque part, dans visual studio ou dans codeblock compilez votre dll. Dans le fichier .cpp nous écrivons notre fonction, dans le fichier .h nous la déclarons. Un exemple qui a fonctionné pour moi dans la pièce jointe au post. Dans le dossier codeblox project file, fichier main .cpp, fichier main .h, dans le dossier \bin\Debug fichier my_lib.dll. En bref, voici l'en-tête de la fonction en c++ :

void DLL_EXPORT GetLocalMaxMin(double* x_sm[],double* x_rl[], double* loc_max[], double* loc_min[], int N, bool real_price)
{
...
}

2 En python, effectuez les opérations suivantes :

from ctypes import *

my_dll = cdll.LoadLibrary("my_dll/my_lib.dll") 					#загружаем  свою DLL
my_dll.GetLocalMaxMin.argtypes = [POINTER(c_double), 
        POINTER(c_double), POINTER(c_double), POINTER(c_double), c_int, c_bool] #определяем  типы входных аргументов функции через атрибуты ctypes
my_dll.GetLocalMaxMin.restype = None                                            #определяем  типы выходных данных 

...
#  y - список цен
#  y_sm - список сглаженных цен
#  len(y)=len(y_sm) - длина списков одинаковая

x_sm = (c_double * len(y))(*y_sm)    				  #создаем  указатель на массив x_sm размером len(y_sm) предаем туда указатель на массив y_sm
x_rl = (c_double * len(y))(*y)       			       	  #создаем  указатель на массив x_rl размером len(y) предаем туда указатель на массив y
loc_max = (c_double * len(y))()      				  #создаем  указатель на массив loc_max размером len(y) заполный 0.0 
loc_min = (c_double * len(y))()     				  #создаем  указатель на массив loc_min размером len(y) заполный 0.0 
my_dll.GetLocalMaxMin(x_sm, x_rl, loc_max, loc_min, len(y), True) #вызываем  функцию и передаем туда все что насоздавали

print(list(loc_max),list(loc_min)) #смотрим  что получилось

Ce n'est pas la vérité finale, ont des ajouts, ou d'autres options, écrire.

Dossiers :
my_lib.zip  36 kb
 
welimorn:

J'ai trouvé (pour moi) un moyen cool de tester mes scripts mql sur python, ainsi que d'accélérer de manière significative certaines fonctions de celui-ci, en utilisant la dll.

Voici la fonction initiale dans mql5, que je veux mettre en python. Il recherche simplement les minima et maxima d'un prix en utilisant son modèle lissé.

Cela se fait en plusieurs étapes

1. Quelque part, dans visual studio ou dans codeblock compilez votre dll. Dans le fichier .cpp nous écrivons notre fonction, dans le fichier .h nous la déclarons. Un exemple qui a fonctionné pour moi dans la pièce jointe au post. Dans le dossier codeblox project file, fichier main .cpp, fichier main .h, dans le dossier \bin\Debug fichier my_lib.dll. En bref, voici l'en-tête de la fonction en c++ :

2 En python, effectuez les opérations suivantes :

Ce n'est pas la vérité finale, tout ajout, ou d'autres options, écrire.

Que voulez-vous atteindre ?
Si la vitesse, alors n'utilisez pas
ArrayResize(loc_max,ArraySize(loc_max)+1);

à l'intérieur de la boucle, et une fois avant d'appeler la fonction, définissez la taille que vous voulez, comme vous l'avez fait en C++ et python, ou réservez-la avec le 3ème paramètre

ArrayResize(loc_max,ArraySize(loc_max)+1, max_size);

Maintenant, chaque appel à ArrayResize, crée un nouveau bloc en mémoire, copie l'ancien dans celui-ci et supprime l'ancien. C'est très, très lent.

И

ArraySize(loc_max)

vous ne devez pas le faire à chaque fois, vous pouvez le stocker dans une variable.


Essayez-le, peut-être ne devrez-vous pas traduire une simple fonction dans 3 langages de programmation différents. Les développeurs affirment que MQL est comparable à C++ en termes de vitesse et même plus rapide sur certains points.

Pourquoi avez-vous besoin de Python si vous pouvez appeler la DLL directement depuis MQL ?

Ou avez-vous un autre but ?
 
elibrarius:
Que voulez-vous atteindre ?
Si la vitesse, n'utilisez pas

à l'intérieur de la boucle, et 1 fois avant d'appeler la fonction, définissez la taille que vous voulez, comme vous l'avez fait en C++ et Python, ou réservez-la avec le 3ème paramètre

Maintenant, chaque appel à ArrayResize crée un nouveau bloc en mémoire, y copie l'ancien bloc et supprime l'ancien. C'est très, très lent.

И

vous ne devez pas le faire à chaque fois, vous pouvez le stocker dans une variable.


Essayez-le, peut-être ne devrez-vous pas traduire une simple fonction dans 3 langages de programmation différents. Les développeurs disent que MQL est comparable en vitesse à C++, et plus rapide dans certains domaines.

Pourquoi avez-vous besoin de Python si vous pouvez appeler la DLL directement depuis MQL ?

Ou avez-vous un autre but ?

La fonction de recherche de l'extremum dans le message est fournie uniquement à titre d'exemple pour montrer le principe qui la sous-tend.

Le but est qu'il est pratique de rechercher les dépendances des caractéristiques et de la cible en Python et de choisir des modèles, tandis que MQL dispose d'un bon testeur qui, s'il ne faut pas vous tromper, vous donnera une estimation claire de vos résultats.

Je suis à l'aise avec Python, mais je suis en train d'apprendre et je ne peux écrire aucune fonction dans mql5 avec des boucles en Python utilisant des calculs vectoriels. Écrire du code sans eux est une perte de temps car python est très lent. Certaines fonctions peuvent être appelées sur chaque barre et cela rend la recherche très difficile. J'ai utilisé algib partout car ils ont des solutions à la fois pour python et mql5. Mais quand il s'agit de mon imagination folle, j'ai quelques problèmes.

Le code pour mql5 peut facilement être converti en c++ et compilé en dll. Par conséquent, j'utilise une seule et même fonction dans le testeur et dans le script python.

 
welimorn:

La fonction de recherche d'extremum dans le message est donnée simplement à titre d'exemple pour en montrer le principe.

L'objectif est que Python soit utile pour rechercher les dépendances des caractéristiques et de la cible et pour ajuster les modèles, tandis que MQL possède un bon testeur qui, s'il ne vous trompe pas vous-même, vous permet d'obtenir une estimation claire de vos résultats.


Vous avez donc trouvé les dépendances en Python, choisi, formé et testé le modèle. Et comment le tester dans un testeur ? Python n'est pas amical avec le testeur ou MKL5.

 
Si le temps moyen de maintien de la position pour un TS est de 10 minutes. Et que la position actuelle est en suspens depuis 10 heures, alors son résultat est une contrepartie (complètement non systématique) ?
 
fxsaber:
Si le temps moyen de maintien de la position pour le TS est de 10 minutes. Et la position actuelle est suspendue depuis 10 heures, puis son résultat est un gambit (complètement non systémique) ?

Cela dépend de la façon dont la logique/les règles du TS sont écrites. Le "peut-être" est un résultat probabiliste, non déterminé par la logique du CT. Si la logique a fonctionné sans problème pendant les 10 heures, il s'agit d'un cas rare.

 
Valeriy Yastremskiy:

Si les 10 heures de logique ont définitivement fonctionné, c'est juste un cas rare.

Ce n'est pas parce que la logique a fonctionné que le résultat est systémique.

 
fxsaber:

Ce n'est pas parce que la logique a fonctionné que le résultat est systématique.

La question ne précise pas à quoi appliquer la contrepartie et la systématicité. S'il s'agit d'une CT, alors cela dépend de la CT, s'il s'agit de conditions externes, alors les cas rares ne sont pas systémiques par nature. Et il peut y avoir des exceptions à la règle. Eurodollar 14 de mai à mars 15. Pas un cas systémique.

Raison: