Le problème du transfert de MT4 à MT5. Ou, plus précisément, l'impossibilité d'exécuter certains algorithmes dans MT5 sans "err". - page 11

 

Informations pour la réflexion.

Observer certains des développements de l'EA publiés sur le marché. Ou des articles.

Ils spécifient souvent un petit écart dans les exigences de sélection du courtier pour l'EA.

Et, à mon avis, MT5 a largement été réglé pour réagir rapidement aux changements du marché. Cela explique pourquoi tous les freins à l'attente de la mise à jour des devis sont désactivés.

Cela signifie que s'il y a une mise à jour des cotations, le terminal refusera l'accès aux séries chronologiques. Pour ne pas interférer avec certains algorithmes rapides.

Ce paradigme a le droit d'exister. Dans ce cas, la négociation est courte. Elle est saisie rapidement. Collectez quelques points. Sortez rapidement.

Mais il existe un autre paradigme.

Il existe des situations extrêmes sur le marché où des retournements de marché se sont formés.

Ces extrémités peuvent s'être formées il y a plusieurs années déjà. Mais ils continuent d'influencer la situation actuelle du marché.

Dans ce cas, les changements momentanés sur l'historique des tics ou des minutes peuvent être pris en compte. Mais ils ne sont pas décisifs.

Dans ce cas, il est possible d'attendre la mise à jour des citations sans sortir du gestionnaire suite à l'interruption de l'accès. Et cela fonctionne uniquement dans MT4.

Quelques photos avec des explications de ce qui a été dit.

Nous prenons le tf mensuel. Les extrêmes de mars 1995, octobre 2000 et juillet 2007 continuent d'influencer le marché.

Même l'extremum de février 1985 a un effet :


On peut constater que les lignes construites avec ces extrema sont remarquées par le marché.

Passons à d'autres horizons temporels. Approximativement dans un rapport tel que si nous faisions des marges sur les vagues. Ce choix peut entraîner le développement d'un niveau d'onde dans chaque TF.

Tf hebdomadaire :

D1 :

H4 :

M30 :

M5 :

M1 :

Nous constatons que les extrema formés loin dans l'histoire ont un impact sur la dynamique actuelle du marché.

----------------------------------

Il devrait y avoir un accès continu aux devis pour de telles constructions.

Je vais continuer. En gros, tout ce qui figure sur les photos est utilisé pour le trading manuel.

Mais. Il est possible d'alimenter les cotations de différentes échéances aux entrées de plusieurs réseaux neuronaux, par exemple représentés dans les images. Chaque SN traitera ses propres données. Et donner sur sa sortie sa propre compréhension de ce qui se passe. Les sorties des réseaux neuronaux seront synchronisées en fonction de l'heure de réception des barres.

Dans ce cas, les signaux provenant des SN d'une priorité supérieure à ceux d'une priorité inférieure.

Les signaux reçus des réseaux neuronaux sont transmis à l'entrée du NS suivant en tenant compte de la priorité. Il peut y avoir des variantes ici.

La première couche des réseaux neuronaux, par exemple, peut être de type LSTM. Dans ce cas, nous entendons par couche les réseaux neuronaux qui obtiennent des cotations, chacune à partir de sa période de temps. Chaque réseau neuronal de la première couche peut comporter plusieurs couches de neurones.

Le réseau neuronal de sommation peut avoir sa propre architecture. Il s'agit plutôt d'une tâche d'ingénierie.

Il est possible de s'entraîner, par exemple, avec un certain algorithme d'ouverture de commerce. Dans la première couche des réseaux neuronaux. C'est-à-dire que chaque réseau neuronal de la première couche est formé séparément. Nous ouvrons des transactions, par exemple, à la fin d'une barre dans la couche correspondante. Vous pouvez même ouvrir des transactions dans différentes directions. Les échanges sont conditionnels. À la fin de ces accords, un signal est envoyé pour former le SN.

Ainsi, le réseau neuronal agrégé a le droit de choisir le meilleur mode de négociation.

Nous obtenons donc un algorithme quelque peu similaire à celui mis en œuvre dans Alfa Zero par l'équipe de DeepMinde.

Vous devez entraîner un tel réseau sur l'ensemble de l'historique pour toutes les périodes sélectionnées. La seule chose à prendre en compte est que toutes les séries temporelles dans MT5 sont basées sur les minutes. Ce n'est pas vrai. Les fichiers CCN sur les eurodollars jusqu'en 1993 sont constitués de séries chronologiques. Il doit y avoir un algorithme qui reconstruit la véritable chronologie de la série chronologique.

Vous pouvez vous entraîner sur une seule paire de devises. Et testez-le sur un autre.

------------------------------

Résumé. Pourquoi, dans cette approche, est-il nécessaire de réagir rapidement à ce qui se passe sur le marché ?

 
Eugeni Neumoin:


Désolé pour le hors-sujet, mais tant que le sujet est intéressant, je ne peux pas abandonner.


Vict :

Eh bien, je veux dire comme ça :

MQL a typename() - il retourne le nom du type de chaîne de caractères, fonctionne même

void OnStart()
  {
   Print(typename(Txt()));      // в логе будет       string
  }
string Txt()
{
return(" Txt ");
}

connaissant le type MyFunc() - écrire une macro ((, ...) Bien sûr, je peux écrire toutes les macros de type _Try_helper ... en général, je ne suis probablement pas aventureux, car je ne sais pas comment faire

 
Igor Makanu:

Désolé pour les hors-sujets, mais tant que c'est un sujet intéressant, je ne peux pas m'arrêter.


C'est bon.

 
Igor Makanu:

MQL a typename() - il retourne le nom du type de chaîne de caractères, fonctionne même

connaissant le type MyFunc() - écrire une macro ((, ...) Bien sûr, je peux écrire toutes les macros de type _Try_helper ... Je suppose que je ne suis pas un joueur, car je ne sais pas comment...

typename() dans µl n'aidera pas, il ne donnera pas au moment de la compilation un type approprié pour la déclaration d'une variable, il l'imprimera seulement. Cela nous laisse avec Try_d(), Try_i(), ... . Je ne sais pas comment obtenir la fonctionnalité decltype dans µl.

 
Vict:

typename() dans µl ne vous aidera pas, il ne vous donnera pas au moment de la compilation un type approprié pour la déclaration d'une variable, il l'imprimera simplement. Cela ne nous laisse que Try_d(), Try_i(), ... . Je ne sais pas comment obtenir la fonctionnalité decltype dans µl.

Hmm, je n'ai pas du tout l'impression d'être un joueur ! Je dirai même absolument pas un joueur ! ))) - Je ne sais pas comment, c'est comme ça que quelque chose fonctionnera (je ne comprends vraiment pas comment, au niveau de la machine, tout tourne - je pense que nous avons un langage strictement typé ?)

void OnStart()
{
  int i = func(1);
  double d = func(1.123);
  string s = func("s");
  Print("i = ",i);
  Print("d = ",d);
  Print("s = ",s);
}

template<typename T>
T func(T invalue)
{
   string s = typename(T);
   if(s=="int") return(invalue);
   if(s=="double") return(invalue);
   if(s=="string") return("Hello word!!!");
return(NULL);
}

31.07.2019 21:07:05.304 tst2 (EURUSD,H1) i = 1

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) d = 1.123

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) s = Bonjour le mot !!!


vous pouvez également décrire un pointeur vers la fonction

typedef void(*TFuncvoidPTR)(void);

et l'utilisation ultérieure

TFuncvoidPTR      func[];
....
func[0]();
 
Vict:

typename() dans µl n'aidera pas, il ne donnera pas au moment de la compilation le type approprié pour la déclaration de variable, il l'imprimera seulement. Il ne nous reste plus qu'à multiplier Try_d(), Try_i(), ... . Je ne sais pas comment obtenir la fonctionnalité decltype dans µl.

Une fonction modèle avec une variable statique de type T.

 
Igor Makanu:

Merci !

J'ai lu vos posts, malheureusement vous avez raison à bien des égards, hier j'ai beaucoup correspondu avec le modérateur Artem dans ce fil, le résultat de la conversation : si c'est implémenté de cette façon, alors ça devrait fonctionner de cette façon.... En général, comme dans les anciennes publicités "Vous ne savez tout simplement pas comment les cuisiner !

Je pense que les résultats du compilateur MQL5 sont vraiment fantastiques (il est très productif !), mais son utilisation comme terminal de trading... Eh bien, disons-le ainsi : cela nécessite une très, très bonne formation technique et le désir d'écrire ~30% de code en plus que "dans l'ancien terminal" ( - même cette phrase est une expression bien établie sur le forum)

Ay-yi-yi... Je n'ai pas dit ça :)

Je disais - utiliser ce que nous avons pour obtenir le résultat que nous voulons.

Je garde le reste de mes émotions pour moi.

 
Igor Makanu:

Je n'ai pas dit que le modérateur Artem avait dit une telle chose, j'ai seulement écrit le résultat de la conversation - je pense que c'est mon jugement, que je ne peux former que sur la base de mes émotions et de l'analyse de la conversation ..... ))))

c'est-à-dire que je ne sais pas ce qui s'est passé dans la tête de quelqu'un, je ne peux voir que ma propre tête... heureusement dans le miroir pour le moment ;)))

Je l'aurais cru si au lieu de

le résultat de la conversation: si c'est implémenté de cette façon, alors ça devrait fonctionner... comme dans les vieilles pubs "vous ne savez juste pas comment les cuisiner !"

était

ma conclusion est : si c'est implémenté de cette façon, alors c'est comme ça que ça devrait fonctionner... c'est comme la vieille pub, "Je ne sais juste pas comment les cuisiner !"

Et il s'avère qu'une tête du miroir citée comme étant le modérateur Artem...

Et bien, si c'était une conversation en privé. Mais tirer des conclusions publiques sur des mots que je n'ai pas prononcés, c'est m'accuser publiquement d'avoir une opinion complètement erronée - j'en ai une complètement différente de celle qui est prétendument exprimée dans la citation.

Je peux exprimer mon opinion :

Tirons le meilleur parti de ce que nous avons pour le moment, ne vous plaignez pas, aidez à trouver les bogues et demandez des corrections avec anticipation - elles sont corrigées et de nouvelles fonctionnalités intéressantes apparaissent.

 
Artyom Trishkin:

Je le croirais si au lieu de

c'était

Mais il s'avère qu'une tête du miroir citée comme étant le modérateur Artem...

Et bien, si c'était une conversation en privé. Mais tirer des conclusions publiques sur des mots que je n'ai pas prononcés, c'est m'accuser publiquement d'avoir une opinion complètement erronée - j'en ai une complètement différente de celle qui est prétendument exprimée dans la citation.

Je peux exprimer mon opinion :

Je ne me plains pas, j'aide à trouver les bugs et à demander des corrections - ils sont corrigés et de nouvelles fonctionnalités intéressantes apparaissent.

hmm, comme les choses sont devenues compliquées.... j'ai nettoyé après mon passage, mon avis... qui s'en soucie ? qu'est-ce qui va changer ? les développeurs ont leur propre vision de leurs produits, c'est leur affaire et mon opinion ... si vous ne mettez pas à jour le fil de discussion dans 2 jours, il ne sera plus en tête de liste.


... Comment cela va changer ... Eh bien, aujourd'hui, un brave homme@Vict- m'a montré quelques techniques de débogage faciles, et le plus important - je peux obtenir la lisibilité de mon code - cela a changé mon opinion de MQL5, et en général, les membres du forum.

Je vais me taire maintenant, heureusement qu'il y a un forum avec une longue histoire, vous ne pouvez pas revenir en arrière et lire trop de réponses à mes questions dans la recherche de ce forum.

 
Igor Makanu:

fxsaber a raison - il y a une option.

 template <typename T> T Try_helper(T val, bool assign) {
   static T sval;
   if (assign)
      sval = val;
   return sval;
}
#define  Try(EXPR, MES)                    \
   Try_helper(EXPR, true);                \
   if (Try_helper(EXPR, false) <= 0.0) {  \
     printf("Error: %s ", MES);           \
     return;                              \
   }

double f(double) {return DBL_MAX;}
ulong f(ulong) {return ULONG_MAX;}

void OnStart()
{

   double d = Try(f(0.), "double error");
   ulong u = Try(f(0), "ulong error");
}

C'est un peu kitsch - EXPR sera calculé deux fois, mais c'est quand même plus flexible. On ne peut pas dire que ce soit universel (seulement pour les types arithmétiques). La valeur de l'erreur doit être égale, ce qui est désagréable. J'ai essayé de l'éviter par une spécialisation explicite de la structure/fonction, mais ce n'est peut-être pas possible.

template <typename T> bool Try_helper_is_valid(T val);
template <> bool Try_helper_is_valid<string>(string val) {val==""?false:true;}  // compile-time error

template <typename T>
struct S;
template <>
struct S<string> {...};      // compile-time error

Eh bien, il semble que peu importe où vous creusez dans le µl, vous trouverez des pièges partout. Il est probablement préférable de se limiter à une petite macro hautement spécialisée avec un type fixe.