MetaTrader 5 Python User Group - Comment utiliser Python dans Metatrader - page 83

 

Bien - mal préparé....

Où puis-je trouver des informations à ce sujet ? Je prépare les données pour le SN en fonction de ma perception de ce qui est important et de ce qui ne l'est pas.

Une chose qui m'intrigue est de savoir si le même type de données doit être collecté "en tas" ou ajouté au fur et à mesure qu'il arrive ?

De quel côté les données doivent-elles être collectées : auprès des "anciens" ou des "nouveaux" ?

 
Сергей Таболин:

Bien - mal préparé....

Où puis-je trouver des informations à ce sujet ? Je prépare les données pour le SN en fonction de ma perception de ce qui est important et de ce qui ne l'est pas.

Une chose qui m'intrigue est de savoir si le même type de données doit être collecté "en tas" ou ajouté au fur et à mesure qu'il arrive ?

De quel côté les données doivent-elles être recueillies : du côté des "anciens" ou des "nouveaux" ?

Dans le fil de discussion MoD, demandez, quelqu'un vous répondra. C'est le sujet du connecteur

 
Сергей Таболин:

Le problème est que la normalisation est une cause perdue d'avance !

Laissez-moi vous expliquer. Il y a quelques données A, B, C...

Ils sont différents en termes d'importance, etc. Tout le monde (google) dit que la normalisation doit être faite par colonnes (A-A-A, B-B-B, C-C-C) et non par lignes. C'est logiquement compréhensible.

Mais lorsque de nouvelles données apparaissent pour la "prédiction", comment les normaliser s'il ne s'agit que d'une seule ligne ? Et tout terme de cette ligne peut aller au-delà de la normalisation sur les données de formation et de test ?

Et la normalisation par les chaînes de caractères n'a aucun effet !

En fait, après avoir vérifié ces nuances, j'ai eu ce "cri de l'âme" )))).

Pendant la normalisation, les coefficients sont sauvegardés. Pour éviter les écarts, nous devons normaliser une grande partie de l'historique, puis appliquer ces coefficients aux nouvelles données.

sur des données non normalisées, la grille n'apprendra pas, ou mal. C'est leur nature.
 
Maxim Dmitrievsky:

les coefficients sont conservés lors de la normalisation. Pour éviter les écarts, nous devons normaliser une grande partie de l'historique, puis appliquer ces coefficients aux nouvelles données.

Il n'apprendra pas à partir de données non normalisées, ou il apprendra mal. C'est leur particularité.

Tout cela est logique et compréhensible, mais la grille est en cours de formation ! En outre, il existe des informations selon lesquelles l'utilisation de données non normalisées est plus compliquée pour l'apprentissage, mais ce n'est pas essentiel.

Et comment ne pas sortir des gammes ? Par exemple, il y a un prix. Il y a une gamme de prix sur les données de formation et de test - prendre 123-324. Mais le prix passe à 421. Comment se situe-t-elle dans cette même fourchette ?

Mais nous nous éloignons du cœur du problème : pourquoi, dans le cadre d'une formation et de tests normaux, la prédiction est-elle quelque chose ?

 

Chers amis, une fois de plus, mes skis ne bougent pas... Je demande de l'aide.

J'ai décidé d'esquisser un petit testeur pour tester la prédiction du réseau formé.

# Загрузка данных
df_full = pd.read_csv(flname_csv, header=None)
r, c = df_full.shape
border = c - row_signal
test_data = np.array(df_full.values[:, :border])
test_verification = np.array(df_full.values[:, border:])
print(test_data[2], 'len =', len(test_data[2]))
print(test_verification[2], 'len =', len(test_verification[2]))

Tout va bien ici.

[3.00000 e+00 7.00000 e+00 1.14656 e+00 1.14758 e+00 1.14656 e+00 1.14758 e+00
 3.00000 e+00 7.00000 e+00 1.27800 e+03 1.27800 e+03 3.00000 e+00 7.00000 e+00
 1.14758 e+00 1.14857 e+00 1.14758 e+00 1.14857 e+00 3.00000 e+00 8.00000 e+00
 2.93000 e+02 6.20000 e+02 3.00000 e+00 8.00000 e+00 1.14857 e+00 1.14960 e+00
 1.14821 e+00 1.14960 e+00 3.00000 e+00 8.00000 e+00 4.78000 e+02 7.23000 e+02
 3.00000 e+00 8.00000 e+00 1.14960 e+00 1.14966 e+00 1.14860 e+00 1.14860 e+00
 3.00000 e+00 8.00000 e+00 2.32100 e+03 2.41100 e+03] len = 40
[1. 0.] len = 2

Et la prochaine chose que vous savez...

if num_check_rows > r or num_check_rows == 0:
    num_check_rows = r

model = tf.keras.models.Sequential()
model = tf.keras.models.load_model(flname)
model.summary()

for i in range(num_check_rows):
    b = model.predict(test_data[i])
    a = b[0]
    x = a[0]
    y = a[1]
    x = format(x, '.5f')
    y = format(y, '.5f')
    print(f'ожидалось {test_verification[i]} >>> получили [{x} {y}]')

jurer

Model: "sequential_16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 20)                820       
_________________________________________________________________
dropout (Dropout)            (None, 20)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                210       
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 22        
=================================================================
Total params: 1,052
Trainable params: 1,052
Non-trainable params: 0
_________________________________________________________________

Traceback (most recent call last):
  File "M:/PythonProgs/PycharmProjects/NNets/ТестерНС.py", line 79, in <module>
    b = model.predict(test_data[i])
.....
ValueError: Error when checking input: expected dense_input to have shape (40,) but got array with shape (1,)

Qu'est-ce qu'il y a ?

 

Après avoir cherché sur le web et regardé l'article sur la base duquel j'ai écrit mon code, je suis arrivé à une conclusion décevante : tout auteur d'un article "pour débutants" oublie forcément de mentionner quelque chose d'important...

Et là, il s'est avéré queStandardScaler est utilisé dans la formation du réseau.Mais l'article ne dit pas un mot sur ce qu'il est et pourquoi il est nécessaire.

De plus,StandardScaler est la normalisation. De plus, je veux savoir comment je peux mettre en œuvre la même normalisation pour un seul vecteur d'entrée et même moins.

Pire encore, la "normalisation" est effectuée par les colonnes de l'ensemble de données ! Non, pour les statistiques, c'est bien. Mais pour les prévisions, c'est "***hole" ! Lorsque de nouvelles données arrivent, dois-je réentraîner le réseau juste pour que les nouvelles données se situent dans la plage de "normalisation" ?

Conneries !

Au moment où ce "nouveau réseau" est formé, la situation peut déjà avoir radicalement changé. Alors, quel est le but de tout ça ?

Autant pour Python avec un tas de bibliothèques "aiguisées"....

Je vous serais très reconnaissant si vous pouviez me faire changer d'avis.


P.S. Je veux juste croire que je n'ai pas perdu mon temps sur Python pour rien.
 
Сергей Таболин:

Après avoir cherché sur le web et regardé l'article sur la base duquel j'ai écrit mon code, je suis arrivé à une conclusion décevante : tout auteur d'un article "pour débutants" oublie forcément de mentionner quelque chose d'important...

Et là, il s'est avéré queStandardScaler est utilisé dans la formation du réseau.Mais l'article ne dit pas un mot sur ce qu'il est et pourquoi il est nécessaire.

De plus,StandardScaler est la normalisation. De plus, je veux savoir comment je peux mettre en œuvre la même normalisation pour un seul vecteur d'entrée et même moins.

Pire encore, la "normalisation" est effectuée par les colonnes de l'ensemble de données ! Non, pour les simples statistiques, c'est bien. Mais pour les prévisions, c'est "***hole" ! Lorsque de nouvelles données arrivent, dois-je réentraîner le réseau juste pour que les nouvelles données se situent dans la plage de "normalisation" ?

Conneries !

Au moment où ce "nouveau réseau" est formé, la situation peut déjà avoir radicalement changé. Alors, quel est le but de tout ça ?

Autant pour Python avec un tas de bibliothèques "aiguisées"....

Je vous serais très reconnaissant si vous me faisiez changer d'avis.


P.S. Je veux juste croire que je n'ai pas perdu mon temps sur Python pour rien.
Peut-être parce que c'est juste le début.
Mais je me suis récemment intéressé aux capacités de python pour mt. Et personne n'a répondu à la question de savoir s'il est possible de le faire. En plus de cela, il ne fonctionnera pas dans mql4. J'ai décidé de ne pas perdre mon temps (peut-être la situation s'améliorera-t-elle avec le temps).
 

(Je peux à peine le comprendre. )))

Mais j'ai maintenant une autre question (pour laquelle j'ai commencé tout cela) :

Lorsque j'ai entraîné le réseau, j'ai obtenu les résultats suivants

Score on train data     Score on test data      Test loss       Test acc
0.970960                0.968266                0.199544        0.981424

En d'autres termes, le résultat est une bonne affaire !

J'ai démarré mon testeur. J'ai obtenu de tels résultats

Model: "sequential_16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 15)                465       
_________________________________________________________________
dropout (Dropout)            (None, 15)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 7)                 112       
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 16        
=================================================================
Total params: 593
Trainable params: 593
Non-trainable params: 0
_________________________________________________________________
2021-01-18 17:59:04.495645: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_10.dll
ожидалось [0. 1.] >>> получили [0.08348 0.08859]
ожидалось [0. 1.] >>> получили [0.08324 0.08838]
ожидалось [0. 0.] >>> получили [0.08667 0.09141]
ожидалось [0. 0.] >>> получили [0.08263 0.08784]
ожидалось [0. 0.] >>> получили [0.09200 0.09218]
ожидалось [0. 0.] >>> получили [0.08351 0.08861]
ожидалось [0. 0.] >>> получили [0.08944 0.09384]
ожидалось [1. 0.] >>> получили [0.08313 0.08828]
ожидалось [1. 0.] >>> получили [0.08432 0.08933]

Process finished with exit code 0

Eh bien, dites-moi exactement où vous pouvez voir que le réseau est entraîné à 98% de résultats corrects ????.

 

Bonjour, en lisant quelques pages de la discussion je n'ai rien trouvé de concret sur la question suivante :


- Y a-t-il quelque chose qui fonctionne actuellement comme des paquets MetaTraderR ou MetaTrader5 pour l'intégration de MT et R ?


Cheers

 

Désolé, je vais continuer mon épopée... )))

Après avoir acquis un peu plus de connaissances sur le même google, j'en suis arrivé à des conclusions :

  1. Les données doivent être "équilibrées". Par exemple, si sur 1000 données d'entrée, les signaux n'apparaissent que sur 100, il nous faut au moins 1000 - ((1000 - 100) /3) = 700 données "vides" (qui ne forment pas de signaux) à éliminer.
  2. Le reste doit de préférence être "normalisé". Amenez-le dans l'intervalle 0-1. Mais il y a une difficulté évidente à choisir la "gamme" de normalisation. Que faut-il considérer comme un minimum et que faut-il considérer comme un maximum ? Je ne sais pas encore. Je normalise chaque tableau d'entrée par son étendue seulement...

En remplissant ces deux conditions, j'ai obtenu une réduction notable de la courbe d'apprentissage du réseau. En outre, j'ai constaté que

  1. Certaines fonctions de perte écartées précédemment sont plus performantes.
  2. Les résultats avec moins de couches cachées sont devenus dominants.
  3. Il reste à vérifier le nombre d'époques d'apprentissage.

En outre, une autre question se posait : quelle devait être la réponse du réseau ?

  1. Un neurone (0-1-2) (pas de signal-achat-vente)
  2. Deux neurones [0-0], [1-0], [0-1]
  3. Trois neurones [0-0-1], [1-0-0], [0-1-0]
? ??

Raison: