Programmation OOP vs programmation procédurale - page 5

 
Petros Shatakhtsyan:

Voici une tâche simple (il faudrait beaucoup d'écriture pour l'expliquer en détail).

Tout se passe dans OnTick(). Supposons que nous vérifions certaines conditions et que nous ouvrions un ordre. La condition n'a pas d'importance, supposons qu'il s'agisse d'un maximum ou d'un minimum.

Le robot se place naturellement sur un graphique et obtient les cotations de ce symbole. Il est clair que nous n'avons pas seulement une fonction OnTick, mais aussi d'autres fonctions : OnTrade, OnTimer, des fonctions personnalisées, etc.

Par conséquent, toutes les variables qui sont partagées doivent être déclarées en dehors de ces fonctions au début du code. Par exemple, le nom du symbole, la demande, l'offre, l'écart, le nombre de chiffres de la cotation, etc. Il y en aura des dizaines.

Ce robot ne négociera que sur un seul symbole, c'est-à-dire là où il se trouve. Supposons qu'il y ait 20 graphiques de ce type et que nous installions le même robot sur chacun d'entre eux pour trader simultanément sur les 20 paires.

Mais il ne s'agit pas d'un robot de trading multi-devises, comme l'ont souligné certains traders du marché.


Ici, nous devons le transformer en un robot multi-devises. C'est-à-dire que nous le mettons sur n'importe quel graphique (seulement sur 1 graphique) et il ouvre des transactions pour 20 paires. Ainsi, nous le lançons dans le testeur en mode simple, et il négociera avec les paires qui sont dans Market Watch.

Voici comment vous allez l'implémenter sans OOP. Allez-vous transformer toutes les variables communes en tableaux de 20 éléments ?

Et qu'en est-il des fonctions qui seront appelées simultanément pour toutes les paires ?

Vous ne pouvez pas vous passer de la POO. :)


P.S. Je tiens à noter que je n'ai pas fait d'études russes, et c'est pourquoi j'ai écrit longtemps et n'ai pas eu le temps de lire plusieurs pages.

Pour créer un moteur multi-devises, vous devez initialement écrire un moteur multi-devises, et non pas redessiner un robot qui est personnalisé pour une seule paire.

La méthode de création d'un multi-collecteur ne nécessite pas l'utilisation de la POO. Nous pouvons écrire un bloc de code prenant les ticks de toutes les paires de devises et appliquant partout les mêmes fonctions d'analyse et de placement d'ordres. Les fonctions de commande elles-mêmes contiennent des variables dont les valeurs changent en fonction de la paire. Ces valeurs seront modifiées par le bloc qui reçoit les ticks.

 
Реter Konow:
Il serait souhaitable de déboucher sur une tâche concrète. Cette description n'est pas très claire. Dans ma pratique, l'algorithme ne change pas lorsque les paramètres externes changent. Il est rendu universel par avance pour toute valeur de ces paramètres. Par conséquent, ce que vous voulez dire n'est pas tout à fait clair. Décrivez-la à l'aide d'un exemple précis.

Par exemple, 100 variantes d'arrêts suiveurs doivent être entassées dans un seul conseiller expert. Lorsque l'on programme de manière procédurale, on obtient un désordre comme celui-ci :

if(Trailing_01_ON){
    Trailing1();
}

if(Trailing_02_ON){ Trailing2(); } ...

...

...

if(Trailing_99_ON){ Trailing99(); }

100 fragments de code identiques. Lorsque le programme est en cours d'exécution, il ne comprendra généralement qu'un seul stop suiveur, les 99 ifs restants ne faisant que consommer des ressources.

Maintenant pour la variante OOP. Pendant l'initialisation d'Expert Advisor, nous mettons à l'échelle le tableau avec des pointeurs en fonction du nombre de pistes, nous créons des objets uniquement pour les pistes incluses. Par conséquent, le code suivant fonctionnera tout le temps :

for(int i=0;i<cnt;i++){
   p[i].Main();
} 

Si un seul trailing stop est activé, alors cnt=1, c'est-à-dire qu'il n'y a rien d'inutile.

 
Dmitry Fedoseev:

La question la plus pertinente ici n'est pas "comment" mais "pourquoi" ? Pourquoi coder quelque chose qui est déjà implémenté dans le terminal - il suffit d'ouvrir le nombre requis de graphiques et de leur attribuer un EA ? En outre, les paramètres doivent être différents pour les différents symboles et les différentes échéances.


Rien n'a été mis en œuvre dans le terminal. Premièrement, un seul graphique est ouvert au lieu de 20 ; deuxièmement, dans le testeur, vous ne pourrez pas tester plusieurs paires simultanément, en tenant compte de toutes les positions ouvertes.

Ne me dites pas qu'il existe un mode "Tous les symboles sélectionnés dans MarketWatch".

 

Un programmeur qui ne comprend pas comment est décrit le concept d'"objet" peut être considéré comme un programmeur amateur, et ne connaît pas l'art de la programmation moderne.

 
Dmitry Fedoseev:

Par exemple, 100 variantes d'arrêts suiveurs doivent être entassées dans un seul conseiller expert. Lorsque l'on programme de manière procédurale, on obtient un désordre comme celui-ci :

100 fragments de code identiques. Lorsque le programme est en cours d'exécution, un seul des stops suiveurs sera activé, et les 99 ifs restants ne feront que consommer des ressources.

Maintenant pour la variante OOP. Pendant l'initialisation d'Expert Advisor, nous mettons à l'échelle le tableau avec des pointeurs en fonction du nombre de pistes, nous créons des objets uniquement pour les pistes incluses. Par conséquent, le code suivant fonctionnera tout le temps :

Si une barre arrière est activée, alors cnt=1, c'est-à-dire qu'il n'y a rien d'inutile.

Il s'agit là d'une approche très, très étrange de la résolution du problème des traînages en général. Une telle tâche ne devrait pas exister - 100 types de trailing stops différents et une fonction différente pour chacun.

Vous devez comprimer ces types dans une ou plusieurs formules, pour en faire une fonction commune de stop suiveur. C'est tout. Bien sûr, vous devrez travailler avec de la matière grise, mais la POO n'a rien à voir avec ça...

 
Реter Konow:

Une approche très, très étrange du problème du trailing stop dans son ensemble. Il ne devrait pas y avoir une centaine de types de trailing stops différents et une fonction différente pour chacun.

Ces types doivent être comprimés en une ou plusieurs formules, et une fonction de fin commune. C'est tout. Bien sûr, vous devrez travailler avec de la matière grise, mais cela n'a rien à voir avec la POO...


Supposons un stop suiveur sur MA, et il en existe des dizaines.

Et pourquoi comprimer quelque chose quand on peut vivre facilement ?
 
Dmitry Fedoseev:

Supposons des MAs de suivi, et il y en a plusieurs dizaines.

Et pourquoi faut-il compresser quelque chose quand on peut vivre avec facilité ?


Il s'avère que l'essence de votre argument en faveur de la POO est basée sur la facilitation d'une décision intrinsèquement ridicule. C'est un argument douteux...


Pourquoi des dizaines de fonctions de queue différentes ? Est-il difficile pour un programmeur OOP sérieux d'en écrire un universel ?

 
Реter Konow:


Il s'avère que l'essence de votre argument en faveur de la POO est basée sur la facilitation d'une solution intrinsèquement ridicule. Argument douteux...

Pourquoi c'est ridicule tout d'un coup ?

A quel point serait-il ridicule d'utiliser 100 "si" ?

 
Dmitry Fedoseev:

Pourquoi c'est ridicule tout d'un coup ?

Il serait ridicule d'utiliser 100 iffos.

Vous n'avez pas besoin d'utiliser 100 iffos. Vous devez résoudre le problème de manière plus efficace et créer une seule fonction avec des ajustements en aval pour différents paramètres.
 
Реter Konow:
Vous n'avez pas besoin d'utiliser 100 ifofs. Vous devez résoudre la tâche de manière plus efficace et créer une seule fonction avec une queue qui s'adapte à différents paramètres.

Et comment allez-vous faire pour que le trailing stop s'adapte à différents paramètres ? Il y aura toujours des branches de l'algorithme qui, avec certaines combinaisons de paramètres, ne seront jamais exécutées.

Raison: