Moins de code, plus d'action... l'écriture d'un EA - page 2

 
Maxim Kuznetsov:

le style cas d'utilisation est fondamentalement procédural, car c'est le plus courant. Les utilisateurs potentiels(programmeurs novices) écrivent de cette manière.

Ce que je veux dire, c'est que votre style est procédural par essence. C'est-à-dire qu'il est procédural à l'intérieur comme à l'extérieur, avec tous les problèmes qui en découlent. Au niveau de l'utilisateur, vous ne pouvez pas, par principe, divulguer les détails de la mise en œuvre. Et vous avez une chose très spécifique qui se passe dans votre code au niveau de l'utilisateur :

double GetData(EA *ea,int id,int shift,double &data[])
{
#ifdef __MQL4__
   // для 4-ки всё просто - по идентификаторам серии и бара получить данные
   switch ((ENUM_SERIES)id) {
      case FAST_MA:
         return data[shift]=iMA(ea.Symbol,ea.Period,FAST_MA_PERIOD,0,FAST_MA_METHOD,FAST_MA_PRICE,shift);
      case SLOW_MA:
         return data[shift]=iMA(ea.Symbol,ea.Period,SLOW_MA_PERIOD,0,SLOW_MA_METHOD,SLOW_MA_PRICE,shift);
   }
   return EMPTY_VALUE;
#else
   ...
#endif
}

Macros de compilation conditionnelle, appels d'implémentations spécifiques de fonctions MA, etc. C'est-à-dire pas OOP, pas FP, mais ce genre de programmation procédurale mate. Et comme cerise sur le gâteau : ea.Symbol, c'est-à-dire formellement, c'est toujours OOP.

 
Maxim Kuznetsov:

J'essaie (ou j'essaierai, si cela vous intéresse) de créer une base pour les EA.

Le résultat sera aussi inutile (pour la plupart des gens) que tous ceux mentionnés dans le fil de discussion.

parce que vous essayez immédiatement d'écrire à votre façon plutôt que bien. tout comme les auteurs de tous ceux mentionnés.

 
Vasiliy Sokolov:

Je veux dire que votre style est procédural par nature. C'est-à-dire qu'il est procédural, tant sur le plan interne qu'externe, avec tous les problèmes que cela comporte. Au niveau de l'utilisateur, les détails de la mise en œuvre ne peuvent être divulgués par principe. Et vous avez une chose très spécifique qui se passe dans votre code au niveau de l'utilisateur :

Macros de compilation conditionnelle, appels d'implémentations spécifiques de fonctions MA, etc. C'est-à-dire pas OOP, pas FP, mais ce genre de programmation procédurale mate. Et comme cerise sur le gâteau : ea.Symbol, c'est-à-dire formellement c'est toujours OOP.

Une fois encore, le cas d'utilisation est rédigé du point de vue présumé des utilisateurs potentiels.

Mais dans une mesure suffisante pour pouvoir passer à la bibliothèque sans toucher au cas d'utilisation lui-même.

Nous devons utiliser la compilation conditionnelle, car 4 et 5 sont tous deux dans le forum.


 
Maxim Kuznetsov:

Une fois encore, le cas d'utilisation est rédigé du point de vue présumé des utilisateurs potentiels.

Pour reformuler : où est l'exigence de style procédural pour insérer des appels de fonctions spécifiques dépendant de la plate-forme comme iMA(...) ?

Maxim Kuznetsov:

Mais en quantité suffisante pour permettre de se rendre à la bibliothèque sans toucher au cas d'utilisation lui-même.

Comment faire lorsque le cas d'utilisation est rempli d'appels spécifiques de fonctions dépendantes de la plate-forme ?

Maxim Kuznetsov:

Vous devez utiliser la compilation conditionnelle car il y a à la fois 4 et 5 dans le forum.

Le "code universel" au niveau du cas de l'utilisateur ne peut donc même pas être indépendant de la plate-forme ?

 
Maxim Kuznetsov:

...

Si nous parlons de cas d'utilisateur - commandement numéro un : pas d'implémentations spécifiques à ce niveau. Mais au niveau du cas de l'utilisateur, vous dépendez déjà totalement : 1) de la plate-forme, 2) de l'API du terminal. C'est-à-dire que la mise en œuvre proposée est totalement incompatible avec le concept énoncé.

 
Vasiliy Sokolov:

Si nous parlons de cas d'utilisateur - commandement numéro un : pas d'implémentations spécifiques à ce niveau. Au niveau du cas de l'utilisateur, vous êtes déjà totalement dépendant : 1) de la plate-forme, 2) de l'API du terminal. C'est-à-dire que la mise en œuvre proposée ne correspond pas du tout au concept énoncé.

En général, les développeurs écrivent en MQL, et pour l'API des terminaux de trading MT4, MT5 :-) Par conséquent, l'utilisation de l'API du terminal est normale.

Le cas d'utilisation doit démontrer/faire les choses typiques de la région. Ne pas se contenter d'ajouter quelques chiffres, mais avoir un objectif compréhensible pour l'utilisateur, celui que nous voulons atteindre. L'objectif minimal possible des conseillers experts est le trading :-) Le conseiller expert le plus simple auquel je peux penser est de trader sur des moyennes croisées. Il est donné dans son intégralité dans le post source.

D'ailleurs, ça marche. En ce moment même, au lieu d'échanger des fonctions, je dessine des stubs et des coches :-) Je suis en train d'écrire/déboguer les données. Dès que la partie avec les données, bien que grossière, mais prête à être discutée - je la posterai.


 
Maxim Kuznetsov:

Vous écrivez généralement en MQL et API des terminaux de trading MT4, MT5 :-) donc faire référence au terminal API est normal.

Le cas d'utilisation doit démontrer/faire les choses typiques du domaine. Ne vous contentez pas d'ajouter quelques chiffres, mais ayez un objectif compréhensible par l'utilisateur, celui que nous voulons atteindre. L'objectif minimal possible des conseillers experts est le trading :-) Le conseiller expert le plus simple auquel je peux penser est de trader sur des moyennes croisées. Il est donné dans son intégralité dans le post source

Et d'ailleurs, ça marche. En ce moment, je suis en train d'écrire/déboguer des données au lieu de trader des fonctions et de dessiner des ticks :-). Dès qu'une partie des données, bien que brutes, seront prêtes à être discutées, je les afficherai également.

Vous l'écrivez correctement. Mais l'utilisateur comprend beaucoup mieux un tel pseudocode :

if(SMA(Close, 12) > SMA(Close, 24))
   BUY();
else
   SELL();

Une autre chose est que le faire fonctionner sous cette forme (procédurale, je note) est très difficile, mais c'est toujours possible. C'est ce que l'on devrait essayer de faire : rendre les instructions au niveau de l'utilisateur aussi simples et abstraites que possible. Mais dans votre code, l'utilisateur doit spécifier des macros de compilation conditionnelle, des fonctions spécifiques pour le calcul des moyennes et d'autres détails techniques qu'il ne peut tout simplement pas gérer.

 
Vasiliy Sokolov:

Pour reformuler : où le style procédural impose-t-il d'insérer des appels à des fonctions spécifiques dépendant de la plate-forme comme iMA(...) ?

Comment intouchable, si le cas d'utilisation est rempli d'appels de fonctions spécifiques à la plate-forme ?

Le "code universel" au niveau du cas de l'utilisateur ne peut donc même pas être indépendant de la plate-forme ?

4/5 plateformes ont des API différentes, il se trouve que c'est le cas.

Je ne suis pas en train d'écrire une autre couche de compatibilité pour tout, ou une bibliothèque universelle. Même si je n'en ai pas envie :-)

seulement la base des EE.

 
Vasiliy Sokolov:

Eh bien, vous l'écrivez correctement. Mais l'utilisateur comprend beaucoup mieux un tel pseudocode :

De plus, il est beaucoup plus difficile de le faire fonctionner sous cette forme particulière (procédurale, je remarque), mais c'est quand même possible. C'est ce que l'on devrait essayer de faire : rendre les instructions au niveau de l'utilisateur aussi simples et abstraites que possible. Mais dans votre code, l'utilisateur doit spécifier des macros de compilation conditionnelle, des fonctions spécifiques pour le calcul des moyennes et d'autres détails techniques qu'il ne peut tout simplement pas gérer.

En principe, vous pouvez utiliser une entrée comme celle que vous avez citée dans GetData OnCrossSignal. Potentiellement, vous pouvez même écrire des scripts :-) Mais chaque chose en son temps... Le traitement des données est construit comme une table électronique.

 
Maxim Kuznetsov:

4/5 plateformes ont des API différentes, c'est comme ça.

Je ne suis pas en train d'écrire une autre couche de compatibilité pour tout, ou une bibliothèque universelle. Même si je n'en ai pas envie :-)

seulement la base des EE.

Regardez le code d'Artem. Son code possède une seule API, qui est indépendante de la plate-forme cible. C'est pourquoi l'argument selon lequel "ça marche comme ça" est étrange à entendre.

Raison: