Comment coder ? - page 301

 

Bonjour Mladen,

Merci pour l'explication, mais qu'entendez-vous par la valeur de la première barre fermée ? Est-ce que c'est la valeur de la première barre fermée ou la barre actuelle ou après ? Qu'en est-il alors de la signification de current+0 ou current+1 ?

Salutations

Terrance

mladen:
Terrance

MODE_MAIN signifie que vous lisez la valeur de la ligne stochastique. MODE_SIGNAL signifie que vous lisez la valeur de la ligne de signal stochastique.

Pour ce qui est de SHIFT : c'est le même pour tous les indicateurs (même ceux qui sont personnalisés). Par exemple : SHIFT=0 signifie la valeur de la barre courante, SHIFT=1 signifie la valeur de la première barre fermée et ainsi de suite ...
 

...

Terrance

La barre actuelle n'est par définition pas encore une barre fermée.

La première barre avant la barre actuelle est la première barre fermée.

tkuan77:
Bonjour Mladen,

Merci pour l'explication, mais qu'entendez-vous par la valeur de la première barre fermée ? Est-ce que c'est la valeur de la première barre fermée, la barre actuelle ou après ? Qu'en est-il de la signification de current+0 ou current+1 ?

Salutations

Terrance
 

Salut Mladen,

Ai-je raison de dire que :

current+0 est identique à la valeur 0,

current+1 est identique à la valeur 1,

current+2 est identique à la valeur 2,

et ainsi de suite..... pour SHIFT ?

Par exemple

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, Current + 1) ; est identique à iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 1) ;

Ai-je raison de le dire ?

Salutations

Terrance

mladen:
Terrance

La barre actuelle n'est par définition pas encore une barre fermée.

La première barre avant la barre actuelle est la première barre fermée.
 

...

Terrance

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 0) ; est le courant

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 1) ; est le premier fermé (précédent)

...

...

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL,Bars-1) ; est le plus ancien sur le graphique.

PS : dans ce post vous avez plus d'informations sur les barres : https://www.mql5.com/en/forum/173124

tkuan77:
Salut Mladen,

Donc, ai-je raison de dire que :

current+0 est identique à la valeur 0,

current+1 est identique à la valeur 1,

current+2 est la même que la valeur 2,

et ainsi de suite..... pour SHIFT ?

Par exemple

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, Current + 1) ; est identique à iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 1) ;

Ai-je raison de le dire ?

Salutations

Terrance
 

Salut Mladen,

Merci pour votre aide, comme toujours !

Salutations

Terrance

mladen:
Terrance

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 0) ; est le courant

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 1) ; est le premier fermé (précédent)

...

...

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL,Bars-1) ; est le plus ancien sur le graphique.

PS : sur ce post vous avez plus d'informations sur les bars : https://www.mql5.com/en/forum/173124
 

Quelques problèmes

Bonjour à tous,

J'ai testé mon code et il est presque arrivé. J'ai quelques questions auxquelles j'espère que vous pourrez m'aider.

J'ai mis ceci dans int init() :

if (Bars < D1FastMAPeriod || Bars < D1SlowMAPeriod)

{

Alert("ERROR- INSUFFICIENT BARS TO CALCULATE SMA ON DAILY CHART") ;

return(0) ;

}

La SlowMAPeriod est de 200. Lorsque j'effectue un backtest à partir du 01.01.2009, cette erreur apparaît alors que je peux clairement voir sur mon graphique qu'il y a suffisamment de barres pour calculer la 200SMA de 2008. Y a-t-il quelque chose qui m'échappe ?

2. Je place des trades sur le graphique H4 mais uniquement dans le sens de la tendance quotidienne. Je tire des valeurs en utilisant le code suivant :

SlowMACurrent = iMA(Symbol(), PERIOD_D1, D1SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1) ;

FastMACurrent = iMA(Symbol(), PERIOD_D1, D1FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1) ;

Ensuite, lorsque je recherche une position longue, je la référence en utilisant :

if (FastMACurrent > SlowMACurrent && ... etc ... )

Cette méthode est-elle correcte car elle ne semble pas filtrer correctement mes transactions ?

3. J'utilise également un filtre de tendance sur le graphique H4 en ne prenant des positions longues que lorsque le prix a dépassé le sommet précédent des 120 dernières périodes (et reste ensuite au-dessus du bas des 120 périodes). J'utilise ce code :

Donchian_Low = Low ;

Donchian_High = High ;

static bool UpTrend = FALSE ;

static bool DownTrend = FALSE ;

if (Ask > Donchian_High) {UpTrend = TRUE ; DownTrend = FALSE;}

if (Bid < Donchian_Low) {UpTrend = FALSE ; DownTrend = TRUE;}

Ensuite, j'utilise le code suivant (disons pour les positions longues) :

if (FastMACurrent > SlowMACurrent && UpTrend == TRUE && DownTrend == FALSE ... etc ... )

Mais cela ne semble pas fonctionner car lorsque je vérifie mon graphique backtesté par rapport à un canal de Donchian de 120 périodes, cela ne correspond pas. Une idée ?

Merci d'avance.

 

...

1. Placez-le au début de la fonction start(). Init n'est pas fiable quand il s'agit de données comme Bars

2. Cette condition est vraie lorsque FastMACurrent > SlowMACurrent. C'est ce que vous vouliez ou peut-être cherchez-vous des croisements ?

3. C'est probablement en relation avec le point 2. Vous devez "restreindre" les conditions dans lesquelles les ordres peuvent être entrés car de cette façon, cela couvre trop de possibilités.

crsnape@btinternet.com:
Bonjour à tous,

J'ai testé mon code et il est presque là. J'ai quelques questions auxquelles j'espère que vous pourrez m'aider.

J'ai mis ceci dans int init() :

if (Bars < D1FastMAPeriod || Bars < D1SlowMAPeriod)

{

Alert("ERROR- INSUFFICIENT BARS TO CALCULATE SMA ON DAILY CHART") ;

return(0) ;

}

La SlowMAPeriod est de 200. Lorsque j'effectue un backtest à partir du 01.01.2009, cette erreur apparaît alors que je peux clairement voir sur mon graphique qu'il y a suffisamment de barres pour calculer la 200SMA de 2008. Y a-t-il quelque chose qui m'échappe ?

2. Je place des transactions sur le graphique H4 mais uniquement dans le sens de la tendance quotidienne. Je tire des valeurs en utilisant le code suivant :

SlowMACurrent = iMA(Symbol(), PERIOD_D1, D1SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1) ;

FastMACurrent = iMA(Symbol(), PERIOD_D1, D1FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1) ;

Ensuite, lorsque je recherche une position longue, je la référence en utilisant :

if (FastMACurrent > SlowMACurrent && ... etc ... )

Cette méthode est-elle correcte car elle ne semble pas filtrer correctement mes transactions ?

3. J'utilise également un filtre de tendance sur le graphique H4 en ne prenant des positions longues que lorsque le prix a dépassé le sommet précédent des 120 dernières périodes (et reste ensuite au-dessus du bas des 120 périodes). J'utilise ce code :

Donchian_Low = Low ;

Donchian_High = High ;

static bool UpTrend = FALSE ;

static bool DownTrend = FALSE ;

if (Ask > Donchian_High) {UpTrend = TRUE ; DownTrend = FALSE;}

if (Bid < Donchian_Low) {UpTrend = FALSE ; DownTrend = TRUE;}

Ensuite, j'utilise le code suivant (disons pour les positions longues) :

if (FastMACurrent > SlowMACurrent && UpTrend == TRUE && DownTrend == FALSE ... etc ... )

Mais cela ne semble pas fonctionner car lorsque je vérifie mon graphique backtesté par rapport à un canal de Donchian de 120 périodes, cela ne correspond pas. Une idée ?

Merci d'avance.
 

Salut mladen,

1. OK, ça ira.

2. Oui, c'est vrai, je ne veux pas entrer à partir du croisement, je l'utilise juste pour un filtre long/ court sur des graphiques à plus court terme, par exemple si la MA rapide est au-dessus de la MA lente sur le graphique quotidien, je veux seulement qu'il considère des positions longues sur le graphique H4. Je pense donc avoir codé cela correctement ?

3. Je ne sais pas si je comprends ce que vous voulez dire, mais j'ai mis ceci sous init start()

static bool UpTrend = FALSE ;

static bool DownTrend = FALSE ;

if (Ask > Donchian_High) {UpTrend = TRUE ; DownTrend = FALSE;}

if (Bid < Donchian_Low) {UpTrend = FALSE ; DownTrend = TRUE;}

Devrais-je mettre les variables statiques bool au tout début pour les rendre globales ? Cela pourrait-il être la cause du problème ?

 

...

3. Que se passe-t-il lorsque Ask Donchian_Low (ce qui est le cas la plupart du temps). Vos variables statiques affichent toujours les "anciens" états même s'ils ne sont plus valides (elles "héritent" de l'état et de cette façon elles signalent qu'elles sont au-dessus ou au-dessous même si elles ne le sont plus). Vérifiez si c'est ce qui cause vos problèmes

crsnape@btinternet.com:
Salut mladen,

1. OK fera l'affaire.

2. Oui, c'est vrai, je ne veux pas entrer à partir du croisement, je l'utilise juste pour un filtre long/ court sur des graphiques à plus court terme, par exemple si la MA rapide est au-dessus de la MA lente sur le graphique quotidien, je veux seulement qu'il considère des positions longues sur le graphique H4. Je pense donc avoir codé cela correctement ?

3. Je ne sais pas si je comprends ce que vous voulez dire, mais j'ai mis ceci sous init start()

static bool UpTrend = FALSE ;

static bool DownTrend = FALSE ;

if (Ask > Donchian_High) {UpTrend = TRUE ; DownTrend = FALSE;}

if (Bid < Donchian_Low) {UpTrend = FALSE ; DownTrend = TRUE;}

Devrais-je placer les variables statiques bool au tout début pour les rendre globales ? Cela pourrait-il être la cause du problème ?
 

C'est un bon point. J'y jetterai un coup d'œil.

Une question sur les fonctions, est-il possible d'appeler une fonction dans une fonction ? Par exemple, j'ai cette fonction :

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

si (... etc

Puis plus tard je l'appelle :

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, string GetWinLossPreviousShort)

Raison: