Indicateurs d'élite :) - page 183

 

Message DTosc...

Mladen,

Je reçois un message dans le dossier Expers qui dit....... "incorrect start position 10148 for Array Maximum function" - l'indicateur semble pourtant se comporter parfaitement.

Une explication s'il vous plaît ?

En vous remerciant par avance.

 

ValeoFX

Sans savoir de quel indicateur il s'agit, c'est généralement quelque chose comme ceci Trouvez où la limite est déterminée et changez-la en quelque chose comme ceci :

limit=MathMin(Bars-counted_bars,Bars-1);

Le deuxième paramètre de cette expression (Bars-1) assure dans ce cas que la limite n'est pas supérieure au nombre de barres du graphique.

Mais, comme vous l'avez déjà remarqué, il s'agit d'une erreur "bénigne" : elle ne se produit qu'une seule fois (lorsque l'indicateur est chargé ou lorsque le cadre temporel est modifié) et, contrairement à d'autres erreurs, elle n'arrête pas le calcul de l'indicateur, de sorte que tout le reste du calcul est effectué correctement et les valeurs sont calculées correctement.

Salutations

mladen

ValeoFX:
Mladen,

Je reçois un message dans le dossier Expers qui dit....... "position de départ incorrecte 10148 pour la fonction Array Maximum" - l'indicateur semble pourtant se comporter parfaitement.

Une explication s'il vous plaît ?

En vous remerciant par avance.
 

Merci...

mladen:
ValeoFX

Sans savoir de quel indicateur il s'agit, c'est généralement quelque chose comme ceci Trouvez où la limite est déterminée et changez-la en quelque chose comme ceci :

limit=MathMin(Bars-counted_bars,Bars-1);

Le deuxième paramètre de cette expression (Bars-1) assure dans ce cas que la limite n'est pas supérieure au nombre de barres du graphique.

Mais, comme vous l'avez déjà remarqué, il s'agit d'une erreur "bénigne" : elle ne se produit qu'une seule fois (lorsque l'indicateur est chargé ou lorsque le cadre temporel est modifié) et, contrairement à d'autres erreurs, elle n'arrête pas le calcul de l'indicateur, de sorte que tout le reste du calcul est effectué correctement et que les valeurs sont calculées correctement.

Salutations

mladen

======================

Désolé Mladen, j'avais le nom de l'indicateur dans la fenêtre "Title" (DTOsc) et je n'ai pas pensé à le répéter. Cependant, je vous remercie pour l'explication - je vais y regarder immédiatement.

A la ligne 124 j'ai trouvé :

limit = MathMax(limit,MathMin(Bars,iCustom(NULL,timeFrame,IndicatorFileName, "getBarsCount",0,0)*timeFrame/Period())) ;

Comme c'est différent de ce que vous avez suggéré, pourriez-vous m'expliquer ce que je dois faire pour y remédier, s'il vous plaît ?

Merci beaucoup.

 

ValeoFX

Je n'ai pas fait attention au sous-titre du message, désolé.

Quoi qu'il en soit, si vous utilisez celui de ce post : https://www.mql5.com/en/forum/general alors vous obtenez ce message.

Par contre, si vous utilisez celui de ce post : https://www.mql5.com/en/forum/general (le plus récent), vous n'aurez pas ce message.

Je ne me souviens pas quand exactement j'ai fait celui du premier article mais j'ai changé quelques styles de codage depuis (d'où l'absence de ce message d'erreur) et franchement, avant je ne me souciais pas trop de ce message d'erreur puisqu'il ne change vraiment rien. Après, j'ai simplement décidé de ne pas laisser d'espace pour d'éventuelles erreurs, d'où le "contrôle de sécurité" lors de la détermination de la limite

____________________________________

PS : cette ligne fonctionne en mode multi time frame. Elle "demande" au cadre temporel cible combien de barres ont changé dans le cadre temporel cible afin de pouvoir recalculer le nombre exact de barres nécessaires dans le cadre temporel actuel. Cette ligne n'est donc efficace qu'en mode mtf.

 

mladen,

Je suis nouveau dans le codage. Et c'est difficile. Mais si je n'ai que le livre de CodersGuru pour faire une EA....... ne sera pas suffisant...

voir mon post page 183

 

Tradefx1

De la tendance quotidienne que vous essayez de trouver : vous devez la redéfinir (la réécrire). Actuellement, elle est écrite comme ceci :

int GetDailyTrend (int res){

double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);

double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);

double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);

double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);

if (MA5_1 MA8_0) res =1;//Cross up

if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down

BarCount=Bars;

return (res);

}[/php]and you are calling it like this :

if (GetDailyTrend(1) && ...) Order = SIGBNAL_BUY;

if (GetDailyTrend(2) && ...) Order = SIGNAL_SELL;

[/php]The way it is used and called now expressions GetDailyTrend(1) and GetDailyTrend(2) are always true (in metatrader any value not equal to 0 is considered a true.

_________________________

Redefine the GetDailyTrend() to something like this:

[php]int GetDailyTrend ()

{

int res = 0;

double MA5_1 = double iMA(NULL,1440,5,0,1,0,1);

double MA5_0 = double iMA(NULL,1440,5,0,1,0,0);

double MA8_1 = double iMA(NULL,1440,8,0,1,0,1);

double MA8_0 = double iMA(NULL,1440,8,0,1,0,0);

if (MA5_1 MA8_0) res =1;//Cross up

if (MA5_1 > MA8_1 && MA5_0 < MA8_0) res =2;//Cross down

return (res);

}

And then use it this way :

[php]if (GetDailyTrend()==1 && ...) Order = SIGBNAL_BUY;

if (GetDailyTrend()==2 && ...) Order = SIGNAL_SELL;

_________________________

En ce qui concerne les livres et le codage : j'ai toujours pensé que la meilleure façon d'apprendre à coder est de se baser sur des exemples et des programmes qui fonctionnent. Croyez-le ou non, mais les gens de Microsoft sont excellents pour apprendre (ils écrivent le code de façon uniforme (ce qui signifie qu'ils ont des règles d'équipe fermes sur la façon dont le code doit être écrit), très propre et ils essaient de le rendre aussi efficace que possible).

Il y a beaucoup d'exemples et d'EAs fonctionnels dans la section Elite que tout le monde peut utiliser (je peux vous recommander celui-ci https://www.mql5.com/en/forum/180383 ) pour les raisons que j'ai déjà mentionnées dans ce fil de discussion et je pense qu'il peut facilement être utilisé comme "cadre" pour d'autres EAs. Mais aussi, il y a beaucoup d'autres EAs très utiles qui peuvent être utilisés pour apprendre et faire des EAs qui fonctionnent.

Et n'oubliez jamais une chose : les langages de codage sont exactement cela : des "langages". Ce qui signifie qu'il s'agit d'une simple conversation comme n'importe quelle autre conversation. Faites juste attention à ce que vous "dites" à l'ordinateur parce que l'ordinateur, contrairement aux gens, ne se pose pas de questions sur ce que vous lui dites mais l'exécute simplement (et parfois ce n'est pas ce que nous voulons qu'il fasse ) Et puis, après un certain temps, vous vous habituez à "parler" à l'ordinateur et tout devient beaucoup plus facile.

 

Juste au cas où...

Au cas où quelqu'un se demanderait quelle est la logique de base derrière l'indicateur adxvma, voici une étape intermédiaire de celui-ci qui pourrait être aussi utile que l'indicateur lui-même. (il y a d'autres étapes après celle-ci, donc ne comparez pas les 2 indicateurs, mais cette étape semble particulièrement intéressante)

Si cela semble familier à quelqu'un, la réponse est "oui". Il semble qu'il s'agisse de l'indicateur Power Trend (le "vrai" Power Trend, pas ceux qui sont affichés et publiés en tant que tels - je n'en suis pas sûr à 100% (tout ce que j'ai vu du "vrai" indicateur, ce sont des photos), mais il lui ressemble beaucoup).
Dossiers :
 
mladen:
ValeoFX

Je n'ai pas fait attention au sous-titre du message, désolé.

Quoi qu'il en soit, si vous utilisez celui de ce post : https://www.mql5.com/en/forum/general, vous obtenez ce message.

Par contre, si vous utilisez celui de ce post : https://www.mql5.com/en/forum/general (le plus récent), vous n'aurez pas ce message.

Je ne me souviens pas quand exactement j'ai fait celui du premier article mais j'ai changé quelques styles de codage depuis (d'où l'absence de ce message d'erreur) et franchement, avant je ne me souciais pas trop de ce message d'erreur puisqu'il ne change vraiment rien. Après, j'ai simplement décidé de ne pas laisser d'espace pour d'éventuelles erreurs, d'où le "contrôle de sécurité" lors de la détermination de la limite

____________________________________

PS : cette ligne fonctionne en mode multi time frame. Elle "demande" au cadre temporel cible combien de barres ont changé dans le cadre temporel cible afin de pouvoir recalculer le nombre exact de barres nécessaires dans le cadre temporel actuel. Cette ligne n'est donc efficace qu'en mode mtf.

=========================================================

Merci beaucoup pour cette explication. J'apprécie beaucoup et cela m'aide aussi à mieux comprendre le codage.

Je vais télécharger le 2ème immédiatement.

Bonne continuation.

 

adxvma

mladen,

Serais-je dans l'erreur en vous demandant de poster la version Tradestation ?

Ray

mladen:
Les gars, j'ai remarqué une chose illogique dans l'indicateur (la première étape comment la partie adx est calculée) J'ai utilisé l'indicateur Tradestation comme modèle et il semble qu'il y ait une erreur dans celui-ci que j'ai hérité sans y penser . Dans ce cas, cette erreur est corrigée. Même les résultats sont meilleurs de cette façon.
Ce calcul est beaucoup plus proche de celui de la section publique (donc celui de la section publique est un indicateur assez correct) avec un code beaucoup plus rapide dans 99% du temps et des extras qui sont spécifiques à ceux postés dans la section élite. Donc si vous avez téléchargé les indicateurs des postes précédents, veuillez utiliser ceux-ci à la place. J'ai également ajouté une option supplémentaire à la version "régulière" : MultiColorMode - si elle est réglée sur false, une seule couleur sera utilisée pour afficher les adxvma (utile si l'on veut utiliser un couple d'adxvma pour vérifier les croisements comme signaux).

Salutations

Mladen
 

Ray,

Le voici. L'indicateur :

inputs:

Price (close),

length (14);

vars:

av (0);

av = ADXVMA(Price, length);

Plot1(av, "Rising");

Plot2(av, "Falling");

Plot3(av, "Neutral");

Plot4(av, "ADXVMA", iff(av = av[1], GetPlotColor(3), iff(av > av[1], GetPlotColor(1), GetPlotColor(2))));

NoPlot(1);

NoPlot(2);

NoPlot(3); [/php]and the adxvma function

[php]inputs:

Price (NumericSeries),

Length (NumericSimple);

vars:

TR(0),

DI_Diff(0),

DI_Sum(0),

ma(0),

pdm(0),

mdm(0),

pdi(0),

mdi(0),

DI_Factor(0),

VI(0),

diff(0),

HHV(0),

LLV(0),

WeightDM(Length),

WeightDI(Length),

WeightDX(Length),

ChandeEMA(Length),

out(0),

j(0);

once ma=Price;

//

// in order to make it right the "pdm=0; mdm=0;" must be added (it does not

// exist in original and that is an error, tradestation inherits values fom

// a previous loop and they must be zeroed before these calculations)

//

pdm=0; mdm=0;

if(Price>Price[1]) then pdm=Price-Price[1] else mdm=Price[1]-Price;

pdm=((WeightDM-1)*pdm[1] + pdm)/WeightDM;

mdm=((WeightDM-1)*mdm[1] + mdm)/WeightDM;

TR=pdm+mdm;

if (TR>0) then begin pdi=pdm/TR; mdi=mdm/TR; end

else begin

pdi=0;

mdi=0;

end;

pdi=((WeightDI-1)*pdi[1] + pdi)/WeightDI;

mdi=((WeightDI-1)*mdi[1] + mdi)/WeightDI;

DI_Diff=pdi-mdi;

if (DI_Diff<0) then DI_Diff= -DI_Diff;

DI_Sum=pdi+mdi;

DI_Factor=0;

if (DI_Sum>0) then out=DI_Diff/DI_Sum else out=0;

out=((WeightDX-1)*out[1] + out)/WeightDX;

if (out>out[1]) then begin HHV=out; LLV=out[1]; end

else begin

HHV=out[1];

LLV=out;

end;

for j = 1 to Length-1 begin

if(out[j+1]>HHV)then HHV=out[j+1];

if(out[j+1]<LLV) then LLV=out[j+1];

end;

diff = HHV - LLV;

VI=0;

if (diff>0) then VI=(out-LLV)/diff;

ma=((ChandeEMA-VI)*ma[1]+VI*Price)/ChandeEMA;

ADXVMA = ma;

Ajout d'un commentaire et d'une correction de code qui n'existait pas dans l'original (c'est la seule modification que j'y ai apportée). Certains des noms de variables sont trompeurs : il n'y a pas de calcul d'EMA sur aucune des étapes. Il s'agit d'une moyenne mobile lissée utilisée dans les étapes de lissage intermédiaires, et non d'une EMA. Vous remarquerez également que même si la logique de base du calcul est issue de l'ADX, il ne s'agit pas d'un ADX, mais il est suffisamment proche pour mériter le nom dans le cas de cet indicateur "hybride".

Salutations

Mladen

traderduke:
mladen,

Serais-je dans l'erreur en vous demandant de poster la version Tradestation ?

Ray