[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 1069

 
goldtrader:

Effectuons une expérience simple pour prouver que le drawdown d'une (chaque) transaction séparée n'apparaît PAS sur le graphique du solde/des fonds propres.

Écrivons un conseiller expert de deux lignes de code :

Exécutons-le sur le graphique EURUSD D1 du 1er mai 2010 au 1er août 2010. Il devra acheter des EUR à 1.2200 sans stop et clôturer la position à la prise de profit à 1.3000 Nous verrons le drawdown sur le graphique de balance/équité et sur le graphique de visualisation :

Comme vous pouvez le constater, sur le graphique de visualisation (en haut de la capture d'écran), le drawdown est visible, et sur le graphique de la balance/des fonds propres, il ne l'est PAS. Il n'y a qu'un seul métier ici. Regardons le rapport du testeur :

Dans le rapport du testeur, le tirage au sort est FIGURANT.

J'espère que la question est maintenant résolue ?

.

Il y a peut-être une question à se poser : "POURQUOI cela se passe-t-il ainsi ?" Cette question ne s'adresse pas à nous, les utilisateurs, mais aux développeurs de MT4. À mon avis, c'est une erreur, car le graphique de la balance/équité ne montre pas de surenchère.

Alexander, merci beaucoup ! Très détaillé et complet, merci beaucoup pour votre travail. Les développeurs de MT4 ne répondent-ils pas ici ?
 

Chers collègues, peut-être que quelqu'un a déjà vu ça.

Y a-t-il une limite au nombre de fichiers ouverts en même temps ? 4 est OK, 5 est ouvert, mais il n'y a pas d'écriture. Je n'arrive pas à comprendre ce qui ne va pas.

 

Il y a un problème. Une transaction doit être ouverte lors du passage de la limite supérieure (achat) ou inférieure (vente) du corridor de l'indicateur.

double barier = 0.08 ; // limites du couloir.

R() - fonction d'indicateur

Fonction permettant de vérifier la condition de franchissement de la limite supérieure ou inférieure:

int RFilter()

{

si ( R(2)> -barier && R(1) < -barier ) retourner (-1) ;

si ( R(2)< barier && R(1) > barier ) retourner (1) ;

}

Le conseiller expert ouvre une position immédiatement lorsque l'indicateur passe une frontière (quelle qu'elle soit). S'il est en hausse - achetez, s'il est en baisse - vendez.

 
dzhini:

Il y a un problème. La transaction doit être ouverte lors du passage de la limite supérieure (achat) ou inférieure (vente) du corridor de l'indicateur.

...

Il arrive en fait que l'EA ouvre une position immédiatement lorsque l'indicateur passe la frontière (peu importe laquelle). Si ça monte - achetez, si ça descend - vendez.

Augmenter légèrement la valeur de la variable barier
 
costy_:

Question pour les connaisseurs

Puis-je créer mon propre outil de trading pour mon testeur ?

Remplacez EURUSD30_2.fxt par le mien ou quelque chose d'autre.

metaquotes\Tester\history\EURUSD30_2.fxt

J'ai essayé de créer simple_csv2fxt, mais le testeur a remplacé le fichier par son propre fichier.

Peut-être que quelqu'un a une expérience de la création, merci.

Il y a, il y a. Et il y a un bon article sur le sujet.
 
Reshetov:
Augmenter légèrement la valeur de la variable barier
Ça n'a pas aidé. Cela pourrait-il être dû à une erreur d'affectation des signes ?
 
dzhini:
Pas utile. Cela pourrait-il être dû à une erreur d'affectation des signes ?

Vous pouvez lire du marc de café ou autre chose, car il n'y a manifestement pas assez d'informations.

1. un indicateur ou un oscillateur :

2. Si c'est un oscillateur, a-t-il des limites ou non ? Si c'est le cas, quels sont ses hauts et ses bas ?

3. Peut-être le problème n'est-il pas dans le code de la fonction ci-dessus, mais dans le code de son interprétation ?

Comme il n'y a pas de télépathes ici, et que toutes les informations nécessaires dont vous disposez sont classifiées, la question est la réponse. C'est-à-dire que sur la base des informations que vous avez fournies, augmenter la variable aurait dû résoudre le problème.

 
Reshetov:

Vous pouvez lire du marc de café ou autre chose, car les informations sont clairement insuffisantes.

1. un indicateur ou un oscillateur :

2. Si c'est un oscillateur, est-il limité ou non ? Si c'est le cas, quels sont son maximum et son minimum ?

3. Peut-être le problème ne réside-t-il pas dans le code de la fonction ci-dessus, mais dans le code de son interprétation ?

Puisqu'il n'y a pas de télépathes ici et que vous avez toutes les informations dont vous avez besoin marquées comme secrètes, la question est la réponse. C'est-à-dire qu'à première vue, d'après les informations que vous fournissez, l'augmentation de la variable aurait dû résoudre le problème.

Il s'agit d'un indicateur dont la formule est la suivante :

double R(int shift)
{
double coef1 = 100.0 * (iMA(NULL, 0, perfast, 0,MODE_LWMA, PRICE_CLOSE, shift) - iMA(NULL, 0, perslow, 0, MODE_LWMA, PRICE_CLOSE, shift)) * iATR(NULL, 0, perslow, shift) ;
double coef2 = coef1 / iMA(NULL, 0, perslow, 0, MODE_LWMA, PRICE_CLOSE, shift) / iATR(NULL, 0, perslow, shift) ;
double main =(MathExp(2.0 * coef2) - 1.0) / (MathExp(2.0 * coef2) + 1.0) ;

retour (principal) ;

}

Contraintes : (-1;1)

 
dzhini:

C'est un indicateur avec cette formule :

double R(int shift)
{
double coef1 = 100.0 * (iMA(NULL, 0, perfast, 0,MODE_LWMA, PRICE_CLOSE, shift) - iMA(NULL, 0, perslow, 0, MODE_LWMA, PRICE_CLOSE, shift)) * iATR(NULL, 0, perslow, shift) ;
double coef2 = coef1 / iMA(NULL, 0, perslow, 0, MODE_LWMA, PRICE_CLOSE, shift) / iATR(NULL, 0, perslow, shift) ;
double main = (MathExp(2.0 * coef2) - 1.0) / (MathExp(2.0 * coef2) + 1.0) ;

retour (principal) ;

}

Contraintes : (-1;1)

Votre fonction doit fonctionner correctement selon les conditions mentionnées dans les commentaires :

int RFilter()

{

if ( R(2)> -barier && R(1) < -barier ) return (-1) ; // Pose courte si la valeur de l'indicateur sur la barre précédente est supérieure à celle de la barre inférieure et que la barre actuelle est inférieure à cette barre.

if ( R(2)< barier && R(1) > barier ) return (1) ; // Pose longue si la valeur de l'indicateur est inférieure à la barre supérieure sur la barre précédente et supérieure à cette barre sur la barre actuelle.

return(0) ; // Ne rien faire dans tous les autres cas.

}

 
Reshetov:

Ensuite, votre fonction devrait fonctionner correctement pour les conditions dans les commentaires :

int RFilter()

{

if ( R(2)> -barier && R(1) < -barier ) return (-1) ; // Pose courte, si la valeur de l'indicateur sur la barre précédente est supérieure à la barre inférieure et que la barre actuelle est inférieure à cette barre.

if ( R(2)< barier && R(1) > barier ) return (1) ; // Pose longue si la valeur de l'indicateur est inférieure à la barrière supérieure sur la barre précédente et est supérieure à celle-ci sur la barre actuelle.

return(0) ; // Aucune action dans tous les autres cas.

}

Mais ça ne marche pas :(