Projet ouvert - tester-optimiser en interne - page 2

 
Cependant, je ne connais pas la réaction du compilateur à l'avance, laissera-t-il passer les constantes de trading dans le corps de l'indicateur ou non ? <br / translate="no">Il est fort probable que ce soit le cas.

Bien sûr qu'il devrait, ce sont tous des entiers, pas un type séparé.

Un petit conseil.

Bien entendu, il est souhaitable de ne pas réécrire la stratégie pour le testeur. Une fois écrite, la stratégie doit fonctionner dans le testeur et sans lui (dans le monde réel).

Cela peut être fait avec l'aide des bibliothèques.
1. Toutes les fonctions liées au commerce, changer un peu leurs noms (mon... - pas très bon, peut-être mieux _....).
2. Créez 2 bibliothèques. Le premier contient du code pour les tests (sans envoyer réellement des ordres), le second ne fait que dupliquer les paramètres dans les appels de fonctions standard. Le changement de travail/essai se fait simplement en remplaçant la bibliothèque.

Bien sûr, nous pourrions tout mettre dans une seule bibliothèque et introduire un paramètre global pour le changement, mais c'est probablement inutile.

Et il serait merveilleux d'introduire dans MT une fonction supplémentaire, qui, à mon avis, simplifierait radicalement l'écriture d'un tel testeur - la fonction de réglage de la dernière barre actuelle.

Supposons que nous ayons 1000 barres dans l'historique sur lequel nous effectuons le test.
Définissons la barre 200 comme la dernière et utilisons Close[200] au lieu de Close[0]. Cette fonctionnalité devrait fonctionner dans toutes les fonctions intégrées.

Le testeur ressemblera alors à une boucle sur le numéro de la barre dans laquelle cette valeur est définie (la dernière barre du test) et l'appel de la fonction start dans la stratégie.

En fait, ce n'est pas si simple :))
J'ai besoin de plus de points ...
 
Je ne comprends pas, expliquez-moi.
2. Nous créons 2 bibliothèques. La première bibliothèque contient du code pour les tests (sans envoyer réellement des ordres), la seconde ne fait que dupliquer les paramètres dans les appels de fonction standard. Pour passer de la phase de travail à celle de test, il suffit de remplacer la bibliothèque
.
L'expression "code pour le test" est-elle un code pour le testeur ou pour l'EA ? Soyez plus précis.

Cela aussi
C'est-à-dire que nous avons 1000 barres dans l'historique sur lequel nous testons.
Nous définissons 200 barres comme la dernière, alors au lieu de Close[0] Close[200] est utilisé partout.
Et cette fic devrait fonctionner (affecter) dans toutes les fonctions en ligne.


Tout code EA est facilement converti en code pour un indicateur :
Nous prenons le bloc start() de l'EA, ajoutons une construction for (testerconter=Bars;testerconter>=0;testerconter--)
{
le fermer avec une parenthèse à la fin
}
Remplacez tous les endroits qui utilisent des références par [testerconter+reference].

Voici un exemple tiré de l'Expert Advisor MACD_sample.mq4 intégré.
Code source :
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1);


Modifié

   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+1);


Comme vous pouvez le constater, il n'y a aucun problème. Si vous le souhaitez, vous pouvez toujours redéfinir testerconter=0 si
est exécuté dans le corps de l'Expert Advisor, et non dans le corps de l'Expert Advisor .

 
L'expression "code pour le test" est-elle un code pour le testeur ou pour l'EA ? Soyez plus précis.

Dans la première bibliothèque, la fonction
_OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid + Stop * Point, Bid - Take * Point);


émule l'exécution de l'ordre dans le testeur, c'est-à-dire qu'il l'ajoute à la liste des ordres dans le testeur et n'envoie pas l'ordre au serveur.

Dans la deuxième bibliothèque, cette fonction appelle simplement la fonction embarquée

int _OrderSend( string symbol, int cmd, double volume, double price, int slippage, 
                double stoploss, double takeprofit, string comment=NULL, int magic=0, 
                datetime expiration=0, color arrow_color=CLR_NONE) 
{
   return (OrderSend(symbol, cmd, volume, price, slippage, stoploss, 
                        takeprofit, comment, magic, expiration, arrow_color) );
}


Tout code de l'Expert Advisor peut être facilement retravaillé dans le code de l'indicateur :
Nous prenons le bloc start() de l'EA, ajoutons une construction for(testerconter=Bars;testerconter>=0;testerconter--)
{
le fermer avec une parenthèse à la fin
}
Remplacer tous les endroits qui utilisent des références par [testerconter+reference].

C'est ce que je veux dire.
Il serait plus facile d'appeler la fonction qui fixe la valeur de la variable testerconter dans MT (0 par défaut) au lieu de la remplacer et cette substitution ([testerconter+référence]) serait faite dans MT elle-même.
Nous n'aurions alors pas à effectuer ces substitutions dans la stratégie elle-même.

for(testerconter=Bars;testerconter>=0;testerconter--)
{
   SetTestPoint(testerconter);
      далее текст эксперта без переделки,
      или лучше вызов его функции start (или _start)
}



Veuillez remplacer pre par. pré à citer dans "i.e. disons que nous avons 1000 barres dans ...".
sinon la page disparaît à nouveau.

 
Je l'ai remplacé par quote, il semble que votre texte disparaisse, faites une traduction forcée de la chaîne dans votre exemple
à propos de
int _OrderSend( string symbol,....)


Ma conclusion : il semble que nous parlions de la même chose. Nous pouvons oublier la demande actuelle de la dernière barre pour l'instant -
Je dois essayer de le faire de cette façon.
Pour l'instant, il suffit de redéfinir les fonctions commerciales standard, avec le préfixe _. c'est encore plus respectable :)
 
à avm
Il est possible d'effectuer des tests de cette manière. Et c'est suffisant. Mais, malheureusement, vous n'obtiendrez pas l'universalisme. <br / translate="no">J'ai passé quelques semaines sur de tels tests. À première vue, cela semble simple.


Je soupçonne que vous avez testé "avec beaucoup de sang", c'est-à-dire que vous n'avez pas redéfini les fonctions commerciales. Et chaque nouveau test
Chaque nouveau test nécessite l'écriture d'un nouvel indicateur de test. Mais vous ne devez le faire qu'une seule fois - et aucun problème par la suite.
Si je me trompe - affichez les fonctions - ne soyez pas avare.
 
Un autre point.

Il semble que l'on ne puisse pasappeler directement lafonction de démarrage depuis le Conseiller Expert.
Par conséquent, il serait préférable d'écrire le code de l'Expert Advisor dans une bibliothèque et d'y avoir les fonctions _init, _deinit et _start.

Dans le conseiller expert, nous allons écrire
#include ".....";
   ...............

int init()
{
   return(_init());
}

int deinit()
{
   return(_deinit());
}

int start()
{
   return(_start());
}


Les paramètres ne sont pas très clairs, cependant.

 
A propos, vous pouvez combiner plusieurs EAs/signaux sur un même graphique.
Comme cela se fait dans Omega :
#include "A1.....";
#include "A2.....";
   ...............

int init()
{
   _initA1();
   _initA2();
   return(0);
}

int deinit()
{
   _deinitA1();
   _deinitA2();
   return(0);
}

int start()
{
   _startA1();
   _startA2();
   return(0);
}


Ce n'est pas très joli, mais ça va marcher.
En général, un système de traitement des événements fait maison fonctionnera :))

 
C'est peut-être plus facile ? Vous créez un script d'analyse, qui est appliqué à un fichier mq4 (avec le code de l'Expert Advisor).
Il traite ce code - insère toutes sortes d'inclusions, de tableaux de travail pour le solde, les capitaux propres, etc,
renomme les variables Lots en _Lots (et autres). En général, il fait le gros du travail.
Je n'aurai qu'à classer la sortie et partir. :)
Méthode de convoyage simple.
 
à avm<br / translate="no">
Il est possible d'effectuer des tests de cette manière. Et c'est suffisant. Mais, malheureusement, vous n'obtiendrez pas l'universalisme. J'ai passé quelques semaines sur de tels tests. À première vue, cela semble simple.

Je soupçonne que vous avez testé "avec beaucoup de sang", c'est-à-dire que vous n'avez pas redéfini les fonctions commerciales. Et chaque nouveau test vous obligeait à écrire un nouvel indicateur de test. Mais vous ne devez le faire qu'une fois - et pas de problème. Si je me trompe, vous pouvez poster des fonctions - ne soyez pas avare.

Tout à fait exact. "Gros sang." Il n'y a pas eu de remplacements. J'ai déjà réalisé de tels testeurs dans MT3.x. Le MQL4 est aussi différent du MQL2 que le ciel l'est de la terre. Cependant, je n'ai pas profité de MQL4. Je suis mentalement stupéfait. J'aurais dû réfléchir d'abord, et travailler ensuite.
La femme a reçu le conseil suivant : "Pensez d'abord, parlez ensuite". La femme a répondu : "Comment puis-je penser à ce que je n'ai pas encore dit".
 
Je me suis un peu emballé pour l'analyseur syntaxique, les fonctions doivent être écrites en premier. Mais je me souviens que les développeurs ont dit qu'il n'y aura pas de testeur multi-devises (testeur de portefeuille). Ou est-ce que je confonds quelque chose ? Si je ne suis pas confus - raison de plus pour écrire le vôtre.