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

 
Maxim Dmitrievsky:

Parce que les modèles craignent toujours ^) avec de grosses erreurs, il faut des modèles qui fonctionnent plus longtemps

par exemple 2 mois d'apprentissage et 1 semaine de négociation

Vous avez peut-être raison, mais je ne pense pas que de tels modèles seront un jour découverts par RDF, qui pourraient fonctionner ne serait-ce qu'un jour complet, jusqu'à ce que nous puissions faire des simulations illimitées de bougies aléatoires semblables à l'algo "ALPHA ZERO".

En effet, les marchés changent presque toutes les heures et un modèle échouera terriblement si une nouvelle survient soudainement ou si le marché change de comportement pour une raison quelconque. Mais si nous avons effectué des millions de simulations de bougies, il est probable que le système puisse se rétablir avec une perte minimale en cas de changement de marché et qu'il puisse rapidement récupérer sa perte par la suite. Cela semble être possible.

Je vais essayer à la fois votre méthode de sélection de modèles et ma méthode de simulation de bougies pour voir comment tout se passe :))

Au fait, j'ai essayé un jour d'entraînement, cinq jours d'entraînement, etc. et ça a échoué le jour suivant : )))))))))))))))).

Un modèle peut donc ne pas fonctionner... mais je peux me tromper...

 

Aussi, j'ai une autre requête Maxim...

Lorsque vous publiez votre article, essayez de commenter le code autant que possible afin que les autres puissent comprendre rapidement et facilement le code et que nous puissions progresser plus rapidement...

Sinon, s'il me faut beaucoup de temps pour comprendre le code, il me faudra encore plus de temps pour le modifier.

Je vous demande donc d'ajouter autant de commentaires et d'explications du code que possible. Pour l'instant, je vais essayer de comprendre rapidement et je vous demanderai si je ne comprends pas quelque chose :))

 
FxTrader562:

Aussi, j'ai une autre requête Maxim...

Lorsque vous publiez votre article, essayez de commenter le code autant que possible afin que les autres puissent comprendre le code rapidement et facilement et que nous puissions progresser plus rapidement...

Sinon, s'il me faut beaucoup de temps pour comprendre le code, il me faudra encore plus de temps pour le modifier.

Je vous demande donc d'ajouter autant de commentaires et d'explications du code que possible. Pour l'instant, je vais essayer de comprendre rapidement et je vous demanderai si je ne comprends pas quelque chose :))

Ok, maintenant je change constamment beaucoup de choses et ça n'a pas de sens de le commenter.

vous pouvez aussi réfléchir à la façon de changer les sorties... peut-être utiliser le zigzag avec différents paramètres au lieu de la fonction de récompense ou autre chose.
 
Maxim Dmitrievsky:

Ok, maintenant je change constamment beaucoup de choses et ça n'a pas de sens de le commenter.

vous pouvez aussi réfléchir à la façon de changer les sorties... peut-être utiliser le zigzag avec différents paramètres au lieu de la fonction de récompense ou autre chose.

J'ai juste eu un aperçu rapide du code. Mais jusqu'à présent, je n'ai pas encore compris où se trouvent exactement les indicateurs ni comment ils décident des entrées de transaction. Je ne suis donc pas sûr de ce que je dois faire avec la sortie. Vous voulez dire la sortie en utilisant GDMH ?

Je viens de lancer le test avec différents paramètres, mais il semble placer des transactions complètement aléatoires.

En outre, dans la phase de test, il ne crée pas les fichiers texte "Mtrees", n'est-ce pas ?

Je veux dire que le code que vous avez fourni n'est pas complet, n'est-ce pas ? Ou est-il capable de placer des transactions s'il est attaché directement au graphique sans optimisation.

 
FxTrader562:

J'ai juste eu un aperçu rapide du code. Mais jusqu'à présent, je n'ai pas compris où se trouvent exactement les indicateurs ni comment ils décident des entrées de transaction. Je ne suis donc pas sûr de ce que je dois faire avec la sortie.

Je viens d'exécuter le test avec différents paramètres, mais il semble placer des transactions complètement aléatoires, car il a montré un comportement étrange et donc, j'ai juste redémarré mon serveur. Est-ce que cela a quelque chose à voir avec les noyaux réels du VPS ?

En outre, dans la phase de test, il ne crée pas les fichiers texte "Mtrees", n'est-ce pas ?

Lors de la première exécution dans le testeur, choisissez "true".

Il fera des échanges aléatoires et apprendra ensuite et sauvera les modèles.

2ème course choisir faux. C'est tout. Et il télécharge des modèles et les échange en +.

Ensuite, dans EA vous pouvez ajouter des agents, maintenant vous avez 5 agents, 100 caractéristiques pour chaque agent, 50 arbres.

CRLAgents *ag1=new CRLAgents("RlExp1iter",5,100,50,regularize,learn);

Dans cette fonction, nous ajoutons 100 prix de clôture pour chaque agent (100 prédicteurs). Et ensuite normaliser les données. Vous pouvez ajouter différents indicateurs, par exemple les 50 premières caractéristiques - prix de clôture, les 25 suivantes rsi, les 25 suivantes adx, ou changer le nombre de prédicteurs lorsque vous déclarez l'agent.

void calcSignal()
  {
   sig1=0;
       
   for(int i=0;i<ArraySize(ag1.agent);i++) - the agents are stored in "ag1.agent" array. We have 5 agents, so array size is 5
     {   
      CopyClose(_Symbol,0,0,100,ag1.agent[i].inpVector); - for each agent from array (now we have 5 agents) fill predictors (100 close prices). For each feature we fill a single value
      normalizeArrays(ag1.agent[i].inpVector);
     }
   sig1=ag1.getTradeSignal(); this function return averaged signal for all agents
  }

Après chaque transaction, il met à jour les politiques, lorsque la transaction est conclue, il met à jour la récompense (TD, différence temporelle RL).

void placeOrders()
  {
   if(countOrders(0)!=0 || countOrders(1)!=0)
     {
      for(int b=OrdersTotal()-1; b>=0; b--)
         if(OrderSelect(b,SELECT_BY_POS)==true)
            switch(OrderType())
              {
               case OP_BUY:
                  if(sig1>0.5)
                  if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red))
                     ag1.updateRewards();

                  break;

               case OP_SELL:
                  if(sig1<0.5)
                  if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red))
                     ag1.updateRewards();

                  break;
              }
      return;
     }

   if(sig1<0.5 && (OrderSend(Symbol(),OP_BUY,lotsOptimized(),SymbolInfoDouble(_Symbol,SYMBOL_ASK),0,0,0,NULL,OrderMagic,INT_MIN)>0))
     {
      ag1.updatePolicies(sig1);
     }

   else if(sig1>0.5 && (OrderSend(Symbol(),OP_SELL,lotsOptimized(),SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0,0,NULL,OrderMagic,INT_MIN)>0))
     {
      ag1.updatePolicies(sig1);
     }

Utilisation très simple de la bibliothèque

En mode train il vous montrera les logs avec les erreurs pour chaque itération

2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 40 passed with errors: 0.2422178988326848  0.5097276264591439
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 41 passed with errors: 0.2295719844357977  0.4824902723735409
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 42 passed with errors: 0.2558365758754864  0.4961089494163424
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 43 passed with errors: 0.2422178988326848  0.4863813229571984
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 44 passed with errors: 0.2422178988326848  0.4766536964980545
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 45 passed with errors: 0.245136186770428  0.5379377431906615
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 46 passed with errors: 0.2587548638132296  0.4912451361867704
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 47 passed with errors: 0.2480544747081712  0.4776264591439689
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 48 passed with errors: 0.2636186770428016  0.5009727626459144
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 49 passed with errors: 0.2616731517509728  0.490272373540856

En mode commerce, le testeur affiche les erreurs finales sur les sous-ensembles de formation et de test pour chaque agent.

2018.09.16 01:34:18.107 2018.09.13 23:59:59   RlExp1iter TRAIN LOGLOSS
2018.09.16 01:34:18.107 2018.09.13 23:59:59   0.23249 0.22763 0.24222 0.24125 0.24416
2018.09.16 01:34:18.107 2018.09.13 23:59:59   RlExp1iter OOB LOGLOSS
2018.09.16 01:34:18.107 2018.09.13 23:59:59   0.46790 0.46887 0.46498 0.46790 0.47471

Résultat pour 100 prix de clôture :


 
Maxim Dmitrievsky:

Lors de la première exécution dans le testeur, choisissez "true".

Il fera des échanges aléatoires et apprendra ensuite et sauvera les modèles.

La 2e manche a choisi faux. C'est tout. Et il télécharge des modèles et en échange +

Ensuite, dans EA vous pouvez ajouter des agents, maintenant vous avez 5 agents, 100 caractéristiques pour chaque agent, 50 arbres.

Dans cette fonction, nous ajoutons 100 prix de clôture pour chaque agent (100 prédicteurs). Et ensuite normaliser les données. Vous pouvez ajouter différents indicateurs, par exemple les 50 premières caractéristiques - prix de clôture, les 25 suivantes rsi, les 25 suivantes adx, ou changer le nombre de prédicteurs lorsque vous déclarez l'agent.

Après chaque transaction, il met à jour les politiques, lorsque la transaction est conclue, il met à jour la récompense (TD, différence temporelle RL).

Utilisation très simple de la bibliothèque

Oui, cela semble très simple et robuste à la fois... expérimentons et voyons... Bon travail !!!!!

Alors où est l'utilité du GDMH ?

Je pensais écrire mon code GDMH. Vous pouvez simplement me montrer le code où l'entrée et la sortie RDF se produisent ou où exactement vous essayez d'implémenter GDMH afin que j'essaie d'écrire mon morceau de code et ensuite, nous pouvons comparer les résultats à la fois de votre code et de mon code et évaluer.

 
FxTrader562:

Oui, cela semble très simple et robuste à la fois... expérimentons et voyons... Bon travail !!!!!

Alors où est l'utilité du GDMH ?

Je pensais écrire mon code GDMH. Vous pouvez simplement me montrer le code où l'entrée et la sortie RDF se produisent ou où exactement vous essayez d'implémenter GDMH afin que j'essaie d'écrire mon morceau de code et ensuite, nous pouvons comparer les résultats à la fois de votre code et de mon code et évaluer.

Ici, j'utilise le noyau simple CRLAgent::kernelizedMatrix(void) (dans la bibliothèque), il faut donc modifier cette fonction pour gdmh.

 
Maxim Dmitrievsky:

Ici, j'utilise le noyau simple CRLAgent::kernelizedMatrix(void) (dans la bibliothèque), il faut donc modifier cette fonction pour gdmh.

Ok, voyons si je peux écrire mon propre code....

S'il ne s'agit que de la logique GDMH, je peux facilement traduire ou convertir l'algo GDMH en code MQL5, mais s'il s'agit d'autres fonctions ou bibliothèques du noyau, j'ai besoin de temps pour étudier et convertir...

 
FxTrader562:

Autre fonctionnalité : vous pouvez configurer chaque agent en comité

CRLAgents *ag1=new CRLAgents("RlExp1iter",5,100,50,regularize,learn);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ag1.setAgentSettings(0,100,50,0.1); for each agent you can set number of features, number of trees and r setting, individually
   ag1.setAgentSettings(1,50,50,0.2);
   ag1.setAgentSettings(2,30,50,0.05);
   ag1.setAgentSettings(3,20,50,0.1);
   ag1.setAgentSettings(4,10,50,0.05);
//---
   return(INIT_SUCCEEDED);
  }

Quand on remplit les valeurs des prédicteurs, il suffit de changer ici :

void calcSignal()
  {
   sig1=0;
       
   for(int i=0;i<ArraySize(ag1.agent);i++)
     {   
      CopyClose(_Symbol,0,0,ArraySize(ag1.agent[i].inpVector),ag1.agent[i].inpVector);
      Print(ArraySize(ag1.agent[i].inpVector));
      normalizeArrays(ag1.agent[i].inpVector);
     }
   sig1=ag1.getTradeSignal();
  }

Vous pouvez également ajouter différents groupes d'agents

CRLAgents *ag1=new CRLAgents("RlExp1iter1",5,100,50,regularize,learn);
CRLAgents *ag2=new CRLAgents("RlExp1iter2",1,20,50,regularize,learn);
CRLAgents *ag3=new CRLAgents("RlExp1iter3",18,5,50,regularize,learn);

 
FxTrader562:

Ok, voyons si je peux écrire mon propre code....

s'il s'agit juste de la logique GDMH, alors je peux facilement traduire ou convertir l'algo GDMH en code MQL5, mais si cela concerne d'autres fonctions ou bibliothèques du noyau, alors j'ai besoin de temps pour étudier et convertir...

Si vous pouvez convertir la logique gmdh, ce sera très utile, je pourrai alors la modifier pour ma bibliothèque.