Aide au codage - page 239

 

Bonjour,

J'ai modifié l'indicateur standard stepMA 9 en celui-ci dans une fenêtre séparée comme histogramme mais je ne sais pas pourquoi les signaux d'achat ne sont pas synchronisés avec l'indicateur standard (les signaux de vente le sont). Avec le nouvel indicateur, ils se produisent une barre plus loin que l'indicateur original. Pourquoi ? J'ai modifié uniquement la partie du code qui détermine l'aspect graphique de l'indicateur.

stepma_9_histo_mtf.mq4

stepma_9.0.mq4

Dossiers :
 
thefxpros:
Bonjour,

J'ai modifié l'indicateur standard stepMA 9 en celui-ci dans une fenêtre séparée comme histogramme mais je ne sais pas pourquoi les signaux d'achat ne sont pas synchronisés avec l'indicateur standard (les signaux de vente le sont). Avec le nouvel indicateur, ils apparaissent une barre plus loin que l'indicateur original. Pourquoi ? J'ai modifié uniquement la partie du code qui détermine l'aspect graphique de l'indicateur.

stepma_9_histo_mtf.mq4

stepma_9.0.mq4

thefxpros

C'est le résultat de la façon dont les lignes sont dessinées.

Lorsque vous dessinez une ligne, vous devez commencer à dessiner la ligne 1 barre en arrière afin de la rendre visible (sinon ce serait un point et elle ne serait pas du tout visible sur le graphique). Essayez ces deux exemples et comparez-les maintenant

Dossiers :
 

Bonjour,

J'ai cherché un EA qui ouvrirait une transaction de la même manière qu'un stop suiveur.

Disons que j'attends un retracement sur un instrument. Je voudrais ouvrir ma position aussi haut (ou bas) que possible sur le prix. Avec un EA comme celui-ci, je pourrais définir mes paramètres de transaction et cet EA continuerait à suivre le prix de la même manière qu'un trailing stop. Lorsqu'il y a un renversement, la transaction est frappée et ouverte.

Avez-vous déjà vu un tel EA ?

Merci

 

Bonjour à tous

J'ai essayé de faire le code, mais je ne peux pas ouvrir le commerce.

int varCurrentTime = TimeCurrent();

for (int iTS = 0; iTS < 2000; iTS++) {

int varZonStart = StrToTime(TimeToStr(varCurrentTime, TIME_DATE) + " " + "00:00");

int varZonEnd = StrToTime(TimeToStr(varCurrentTime, TIME_DATE) + " " + "10:00");

int JamStart=TimeHour(varZonStart);

int JamEnd=TimeHour(varZonEnd);

if (JamStart>JamEnd) {

varCurrentTime = decDateTradeDay(varCurrentTime);

//if (TimeDayOfWeek(varCurTime) < 1) varCurTime = decDateTradeDay(varCurTime);

if (TimeDayOfWeek(varCurrentTime) > 5) varCurrentTime = decDateTradeDay(varCurrentTime);

}

varZonStart = StrToTime(TimeToStr(varCurrentTime, TIME_DATE) + " " + "00:00");

int varShiftStart = iBarShift(NULL, 0, varZonStart - 60 * Period());

int varShiftEnd = iBarShift(NULL, 0, varZonEnd);

varHighest = High;

varLowest = Low;

varCurrentTime = decDateTradeDay(varCurrentTime); //set 1 hari kebelakang

if (TimeDayOfWeek(varCurrentTime) < 1) varCurrentTime = decDateTradeDay(varCurrentTime); //jika minggu mundur lagi

if (TimeDayOfWeek(varCurrentTime) > 5) varCurrentTime = decDateTradeDay(varCurrentTime); //jika sabtu mundur lagi

}

for (int iTSh = 0; iTSh < 2000; iTSh++) {

for (int iTSl = 0; iTSl < 2000; iTSl++) {

if(((varHighest-varLowest)/Pip)<=5) varHL=(varHighest+varLowest)/2;

}

}

double isg10a = iOpen(Symbol(),PERIOD_M15,1);

double isg10b = iClose(Symbol(),PERIOD_M15,1);

int static isg10c = -1;

for (iTS = 0; iTS < 2000; iTS++) {

if(isg10avarHL)isg10c =0;

if(isg10a>varHL&&isg10b<varHL)isg10c =1;

}

if (isg10c==0) To code Buy

else if (isg10c==1) To code Sel

else no trade

 
mladen:
Jim Au lieu de réécrire le tout, j'ai ajouté une limite pour calculer les barres et ensuite toutes ces barres sont recalculées. Cela devrait résoudre le problème de rafraîchissement (il suffit de garder le BarsTocalculate à une valeur raisonnable - pas trop grande ni trop petite. J'ai utilisé 1000 comme valeur par défaut et ça semble aller comme ça). Essayez-le

Cher mladen,

Merci beaucoup pour votre effort et votre aide très rapide.

Je vais faire des essais.

Cordialement, de Munich

 

S'il vous plaît aidez-moi à mettre à jour cet indicateur de volume pour l'attacher sur mon mt4

Bonjour gourous, s'il vous plaît aidez-moi à réparer les erreurs dans cet indicateur de volume. Je viens de remarquer qu'il n'a pas pu être attaché à mon graphique mt4 récemment. J'ai fait tout ce qui était possible pour corriger les erreurs dans le fichier mais en vain. Je soupçonne que c'est à cause de l'énorme mise à jour de mt4. Tous les autres indicateurs de mon dossier mt4, tant les anciennes que les nouvelles versions, fonctionnent bien. Il fonctionnait il y a un an, la dernière fois que je l'ai utilisé. Je ne suis pas encore un programmeur.

Veuillez trouver le fichier joint

 

Bonjour MLaden et Mrtools,

J'espère que vous allez bien

J'ai besoin d'une confirmation de votre part concernant le RSX.

Je vois que vous utilisez une formule plus simple pour calculer le RSX :

__________________________

double Kg = (3.0)/(2.0+Longueur) ;

double Hg = 1.0-Kg ;

if (slope[limit]==-1) CleanPoint(limit,rsxDa,rsxDb) ;

if (ArrayRange(wrkBuffer,0) != Bars) ArrayResize(wrkBuffer,Bars) ;

for(i=limit, r=Bars-i-1 ; i>=0 ; i--, r++)

{

wrkBuffer[r][12] = iMA(NULL,0,1,0,MODE_SMA,Price,i) ;

if (i==(Bars-1)) { for (int c=0 ; c<12 ; c++) wrkBuffer[r][c] = 0 ; continue ; }

//

//

//

//

//

double mom = wrkBuffer[r][12]-wrkBuffer[r-1][12] ;

double moa = MathAbs(mom) ;

for (int k=0 ; k<3 ; k++)

{

int kk = k*2 ;

wrkBuffer[r][kk+0] = Kg*mom + Hg*wrkBuffer[r-1][kk+0] ;

wrkBuffer[r][kk+1] = Kg*wrkBuffer[r][kk+0] + Hg*wrkBuffer[r-1][kk+1] ; mom = 1.5*wrkBuffer[r][kk+0] - 0.5 * wrkBuffer[r][kk+1] ;

wrkBuffer[r][kk+6] = Kg*moa + Hg*wrkBuffer[r-1][kk+6] ;

wrkBuffer[r][kk+7] = Kg*wrkBuffer[r][kk+6] + Hg*wrkBuffer[r-1][kk+7] ; moa = 1.5*wrkBuffer[r][kk+6] - 0.5 * wrkBuffer[r][kk+7] ;

}

if (moa != 0)

rsx = MathMax(MathMin((mom/moa+1.0)*50.0,100.00),0.00) ;

sinon rsx = 50 ;

____________________________________

Juste pour être sûr de bien comprendre comment le RSX est calculé avec cette formule

Tout d'abord avec la ligne

mom = wrkBuffer[r][12]-wrkBuffer[r-1][12] ;

en fait wrkBuffer[r][12] est la moyenne mobile simple du prix, notez la prise comme avec un RSI habituel ?

N'est-ce pas ? Mais je ne comprends pas quelle est la période de cette SMA (Probablement pas la longueur) ?

Et après, si j'ai bien compris avec les lignes :

for (int k=0 ; k<3 ; k++)

{

int kk = k*2 ;

wrkBuffer[r][kk+0] = Kg*mom + Hg*wrkBuffer[r-1][kk+0] ;

wrkBuffer[r][kk+1] = Kg*wrkBuffer[r][kk+0] + Hg*wrkBuffer[r-1][kk+1] ;

mom = 1.5*wrkBuffer[r][kk+0] - 0.5 * wrkBuffer[r][kk+1] ;

En fait il calcule 3 fois le mom (l'un après l'autre), avec le premier mom ci-dessus (mom = wrkBuffer[r][12]-wrkBuffer[r-1][12] ;)

C'est bien ça ?

Et après cela, c'est "classique" avec RSX=((mom/moa)+1)*50

Merci pour votre prochaine réponse, en tant que codeur (sur une autre plateforme), vous savez que j'aime comprendre le fonctionnement des codes.

Passez une belle journée

Zilliq

 
zilliq:
Bonjour MLaden et Mrtools,

J'espère que tu vas bien

J'ai besoin d'une confirmation de votre part concernant le RSX.

Je vois que vous utilisez une formule plus simple pour calculer le RSX :

__________________________

double Kg = (3.0)/(2.0+Longueur) ;

double Hg = 1.0-Kg ;

if (slope[limit]==-1) CleanPoint(limit,rsxDa,rsxDb) ;

if (ArrayRange(wrkBuffer,0) != Bars) ArrayResize(wrkBuffer,Bars) ;

for(i=limit, r=Bars-i-1 ; i>=0 ; i--, r++)

{

wrkBuffer[r][12] = iMA(NULL,0,1,0,MODE_SMA,Price,i) ;

if (i==(Bars-1)) { for (int c=0 ; c<12 ; c++) wrkBuffer[r][c] = 0 ; continue ; }

//

//

//

//

//

double mom = wrkBuffer[r][12]-wrkBuffer[r-1][12] ;

double moa = MathAbs(mom) ;

for (int k=0 ; k<3 ; k++)

{

int kk = k*2 ;

wrkBuffer[r][kk+0] = Kg*mom + Hg*wrkBuffer[r-1][kk+0] ;

wrkBuffer[r][kk+1] = Kg*wrkBuffer[r][kk+0] + Hg*wrkBuffer[r-1][kk+1] ; mom = 1.5*wrkBuffer[r][kk+0] - 0.5 * wrkBuffer[r][kk+1] ;

wrkBuffer[r][kk+6] = Kg*moa + Hg*wrkBuffer[r-1][kk+6] ;

wrkBuffer[r][kk+7] = Kg*wrkBuffer[r][kk+6] + Hg*wrkBuffer[r-1][kk+7] ; moa = 1.5*wrkBuffer[r][kk+6] - 0.5 * wrkBuffer[r][kk+7] ;

}

if (moa != 0)

rsx = MathMax(MathMin((mom/moa+1.0)*50.0,100.00),0.00) ;

sinon rsx = 50 ;

____________________________________

Juste pour être sûr de bien comprendre comment le RSX est calculé avec cette formule

D'abord avec la ligne

mom = wrkBuffer[r][12]-wrkBuffer[r-1][12] ;

en fait wrkBuffer[r][12] est la moyenne mobile simple du prix, notez la prise comme avec un RSI habituel ?

N'est-ce pas ? Mais je ne comprends pas quelle est la période de cette SMA (Probablement pas la longueur) ?

Et après, si j'ai bien compris avec les lignes :

for (int k=0 ; k<3 ; k++)

{

int kk = k*2 ;

wrkBuffer[r][kk+0] = Kg*mom + Hg*wrkBuffer[r-1][kk+0] ;

wrkBuffer[r][kk+1] = Kg*wrkBuffer[r][kk+0] + Hg*wrkBuffer[r-1][kk+1] ;

mom = 1.5*wrkBuffer[r][kk+0] - 0.5 * wrkBuffer[r][kk+1] ;

En fait il calcule 3 fois le mom (l'un après l'autre), avec le premier mom ci-dessus (mom = wrkBuffer[r][12]-wrkBuffer[r-1][12] ;)

C'est bien ça ?

Et après cela, c'est "classique" avec RSX=((mom/moa)+1)*50

Merci pour votre prochaine réponse, en tant que codeur (sur une autre plateforme), vous savez que j'aime comprendre le fonctionnement des codes.

Passez une belle journée

Zilliq

"En fait wrkBuffer[r][12] est la moyenne mobile simple du prix, notez la prise comme avec un RSI habituel ?"

Non. La période de calcul de cette moyenne est de 1, ce qui signifie qu'elle est égale au prix de la "moyenne" utilisée. Dans metatader c'est la manière la plus rapide d'obtenir le prix désiré (si vous essayez d'écrire la structure "case" faisant la même chose vous verrez que c'est beaucoup plus lent que la manière utilisée dans le code rsx).

"En fait il calcule 3 fois le mom (l'un après l'autre), avec le premier mom au-dessus"

Non. Regardez quelles valeurs il utilise à chaque nouvelle itération. mom et moa sont constamment modifiés et réutilisés (sous cette forme modifiée) pendant le processus de bouclage.

 

Merci beaucoup Mladen,

C'est très étrange, si j'ai bien compris wrkBuffer[r][12] est égal au prix, mais vous utilisez une moyenne mobile avec une période de 1 pour accélérer le calcul. C'est très curieux...

Pour la deuxième chose, je pense/suppose que c'est ce que j'essaie de dire

il calcule le mom comme un momentum du prix

Et il calcule une autre maman avec Kg et Hg. Il donne une nouvelle maman, qui est habituée à créer une nouvelle maman, et ainsi de suite, 3 fois

Quelque chose de plus "facile" (pour faciliter la compréhension) comme ça

maman

maman1=kg*maman

mom2=kg*mom1

mom3=kg*mom2

Et à la fin il utilise mom3, et moa3

J'ai raison ?

 
zilliq:
Merci beaucoup Mladen,

C'est très étrange, si j'ai bien compris wrkBuffer[r][12] est égal au prix, mais vous utilisez une moyenne mobile avec une période de 1 pour accélérer le calcul. C'est très curieux...

Pour la deuxième chose, je pense/suppose que c'est ce que j'essaie de dire

il calcule le mom comme un momentum du prix

Et il calcule une autre maman avec Kg et Hg. Il donne une nouvelle maman, qui est habituée à créer une nouvelle maman, et ainsi de suite, 3 fois

Quelque chose de plus "facile" (pour faciliter la compréhension) comme ça

maman

maman1=kg*maman

mom2=kg*mom1

mom3=kg*mom2

Et à la fin, il utilise mom3, et moa3.

J'ai raison ?

Zilliq,

oui, c'est comme ça que ça se passe

Raison: