Comment coder ? - page 322

 

Bonjour,

ma demande est uniquement à titre d'information, pour le moment.

Si j'ai un indicateur qui crée un graphique hors ligne sans calculer le passé mais seulement les données en direct, est-il possible de l'attacher dans le modèle du testeur de stratégie et de créer un graphique hors ligne avec les données de l'historique ?

Merci.

 
mladen:
jayjonbeach,

Vous testez la valeur de trendCurr encore et encore dans la boucle sans la changer (donc elle retournera toujours NONE).

Essayez de mettre le iCustom() dans la boucle et puis testez cette valeur. Quelque chose comme ceci :

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

Cher monsieur. Je n'ai que deux mots à ce sujet, mais ils méritent d'être répétés...

MERCI, MERCI et MERCI ! !!

En effet, votre code a fonctionné parfaitement, et je parie que vous m'avez épargné 12 heures ou plus d'examen d'autres boucles 'for', d'essais et d'erreurs, etc. avant que je ne tombe finalement sur ce que vous avez posté.

Je pensais en fait que je voulais tester trendCurr encore et encore dans la boucle mais je vois l'erreur maintenant grâce à vous, et je vois comment votre solution de changer le Stepbartotest avec "i" est en effet la solution parfaite, l'utilisation de "i" ici est en fait la clé pourtant ne semble pas tout à fait évident, au moins pour un novice comme moi, il aurait pu être un certain temps avant que je comprenne cela...

Alors que votre code a fonctionné comme prévu, mon bloc entier ne l'est pas, il y a un résultat involontaire très intéressant à avoir cette boucle exécutée à l'intérieur du critère LONG :

if(TwentyOneEMA > FiftyFiveEMA)

{

if (trendCurr>0) // vérifier le filtre Step actuel

{

if (Bid > TwentyOneEMA)

{

for(int i=0 ; i<=lookback ; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i) ;

if (testValue<0) return(LONG) ;

}

return(NONE) ;

}

}

}

Ce qui se passe maintenant, c'est que lorsque les ifs sont satisfaits, la boucle est testée et si elle est vraie, elle achète, sinon elle ne fait rien, super. Cependant, l'ensemble du bloc de code agit comme une boucle "while", car tant que if(TwentyOneEMA > FiftyFiveEMA) est vrai, le reste du code en dessous continue de s'exécuter, et si les autres conditions deviennent toutes vraies, le crétin achète ! Je vois l'erreur évidente de ma structure de code ici.... (Je pense qu'une autre boucle for similaire pourrait tester les EMA, pour s'assurer que le croisement des EMA est un NOUVEAU croisement).

Ce n'est pas nécessairement une mauvaise chose (comme une certaine analyse le laisserait entendre), en fait, c'est un peu ce que mon prochain objectif était, d'une manière différente, il a besoin de beaucoup plus de tests, mais pour l'instant, je vais laisser cette révision en place sur ce robot et commencer les prochaines révisions sur une copie.

Ce que j'allais faire après l'avoir fait regarder le passé, c'est que si la boucle du passé s'avère fausse, je voulais qu'il vérifie les 10 prochaines barres pour un signal de pas, et s'il devient vrai, prendre le trade (je pensais utiliser une boucle while pour cela ?). Donc, cela se produit déjà en quelque sorte, sauf qu'il n'y a PAS de limite de 10 barres dans son anticipation, et je ne suis pas sûr de la façon dont je devrais structurer l'ensemble pour fonctionner correctement. (Je pense que je pourrais vérifier le signal Step, et si c'est vrai, chercher un nouveau croisement de MA dans les 10 dernières barres, mais je dois répéter tout le bloc pour cela et je pense qu'il doit y avoir un moyen plus efficace/élégant).

Merci encore pour votre aide, cela va être TRES utile dans le codage futur, j'en suis sûr.

 

Bonjour,

J'essaie de modifier l'indicateur ci-joint. Pratiquement quand une moyenne mobile touche le prix il alarme et change le timeframe où il est touché. J'ai mis un délai dans l'alarme qui est respecté mais après une alarme si je change le timeframe il l'ingnore.

Il peut être fixé ?

Mercimedie_mobili.mq4

Dossiers :
 

dasio

Avec les indicateurs, vous ne pouvez pas changer cela. Les indicateurs réinitialisent la portée globale et les variables statiques aux valeurs par défaut lorsque vous faites cela, donc vous ne pouvez pas conserver certaines valeurs lorsque vous changez de période ou de symbole. Vous pourriez utiliser les variables globales (celles qui sont gérées avec les fonctions "GlobalVariable...") mais cela rendrait votre code très compliqué (pour de multiples instances, de multiples symboles, ...) et à mon avis cela ne vaut pas la peine de faire cet effort.

dasio:
Bonjour,

J'essaie de modifier l'indicateur ci-joint. Pratiquement, quand une moyenne mobile touche le prix, il s'alarme et change le cadre temporel où il est touché. J'ai mis un délai dans l'alarme qui est respecté mais après une alarme si je change le timeframe il l'ingnore.

Cela peut-il être corrigé ?

Mercimedie_mobili.mq4
 

...

Juste un ajout au post précédent : une chose qui n'est pas si largement connue - les EAs traitent ces variables (portée globale et variables statiques) différemment - elles ne sont pas réinitialisées lorsque le cadre temporel ou le symbole est changé. Voici un EA très, très simple qui montrera à ceux qui sont intéressés comment ces valeurs ne sont pas réinitialisées dans les EAs comme dans les indicateurs.

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

C'est même une cause d'erreurs dans certains EA (si l'EA ne prend pas en compte le fait que la variable ne va pas être réinitialisée lorsque le cadre temporel ou le symbole sont modifiés, des erreurs très étranges dans le travail de l'EA peuvent se produire).

 
mladen:
dasio A partir du code, je ne peux pas voir quelle est l'intention du code. Quoi qu'il en soit, voici un code dans lequel vous pouvez choisir si vous souhaitez utiliser la plage réelle comme valeur "de base" de l'indicateur (c'est la première partie de votre code) ou si vous souhaitez utiliser la deuxième partie de votre code comme valeur "de base".

Une autre fois, merci mladen.

Est-il possible d'ajouter une autre ligne basée sur cette condition ?

Tracer une ligne horizontale = à la moyenne des Work[] qui sont > de Avg[] toujours basé sur la période de jours ?

Merci pour votre aide.

 

Modification du signal

Salut Mladen,

Je veux ajouter un signal d'arrêt de vente ou d'achat à ce code.....e.g si la ligne de signal stochastique est au-dessus de la principale, arrêter la vente e.t.c, je l'ai ajouté au code mais il ne fonctionne pas ... s'il vous plaît aider

if(Period()==240)

{

static datetime lastAlerted=0 ;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0) ;

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0) ;

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0) ;

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0) ;

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1) ;

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0) ;

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1) ;

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0) ;

// alertes

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&nowenCCI>b4enCCI)&&(nowtrCCI>0&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0] ; Alert("Flèche d'achat","\n"," L'heure actuelle est ",TimeToStr(CurTime()),"\n",Symbol()) ;

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&nowenCCI<b4enCCI)&&(nowtrCCI<0&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0] ; Alert("Flèche de vente","\n", "L'heure actuelle est ",TimeToStr(CurTime()),"\n",Symbol()) ;

}

}

 

Vous pouvez essayer quelque chose comme ceci :

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
Salut Mladen,

Je veux ajouter un signal d'arrêt de vente ou d'achat à ce code.....e.g si la ligne de signal stochastique est au-dessus de la principale, arrêter la vente e.t.c, je l'ai ajouté au code mais il ne fonctionne pas ... pls aider

if(Period()==240)

{

static datetime lastAlerted=0 ;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0) ;

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0) ;

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0) ;

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0) ;

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1) ;

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0) ;

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1) ;

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0) ;

// alertes

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&nowenCCI>b4enCCI)&&(nowtrCCI>0&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0] ; Alert("Flèche d'achat","\n", "L'heure actuelle est ",TimeToStr(CurTime()),"\n",Symbol()) ;

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&nowenCCI<b4enCCI)&&(nowtrCCI<0&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0] ; Alert("Flèche de vente","\n", "L'heure actuelle est ",TimeToStr(CurTime()),"\n",Symbol()) ;

}

}
 

Je suis à nouveau coincé. J'essaie d'empêcher l'EA de regarder dans le futur en raison de la façon dont mon code était structuré.

Mon code de signal commence par un "if", et tant que cela est vrai, le reste du code qui suit continue à s'exécuter, comme il se doit (ce n'était pas un problème avant d'insérer la première boucle for, mais maintenant ça l'est). J'ai donc essayé un tas de choses différentes pour corriger cela, mais rien ne fonctionne . J'ai également vérifié le manuel, mais rien n'est ressorti, peut-être que deux boucles "for" dans le même bloc ne sont pas autorisées ?

Voici ce que je pense être mon meilleur effort (je ne montre que LONG par souci de brièveté), pas d'erreurs mais l'EA ne fait pas de transactions, il est donc probable que j'ai encore raté la boucle :

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

si (trendCurr>0)

{

for(int i=0 ; i<=lookbackma ; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i) ;

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i) ;

si (testValue1 < testValue2-Separation2)

{

if (Bid TwentyOneEMA) // filtre de nouvelles

{

for(i=0 ; i<=lookback ; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i) ;

if (testValue3 <0 && NumOrders < maxorders) return(LONG) ;

}

return(NONE) ;

}

}

}

}

}

==========

Remarque : j'ai essayé if (testValue1 < testValue2-Séparation2) continue ; mais 'continue' a été signalé comme une erreur Si deux boucles ne sont pas autorisées, je suppose que ma prochaine tâche consistant à ajouter une autre boucle pourrait être malavisée...

 
jayjonbeach:
Je suis à nouveau coincé. J'essaie d'empêcher l'EA de regarder dans le futur en raison de la façon dont mon code a été structuré.

Mon code de signalisation commence par un "if", et tant que celui-ci est vrai, le reste du code qui suit continue à s'exécuter, comme il se doit (ce n'était pas un problème avant l'insertion de la première boucle for, mais c'en est un maintenant). J'ai donc essayé un tas de choses différentes pour corriger cela, mais rien ne fonctionne J'ai également vérifié le manuel, mais rien n'est ressorti, peut-être que deux boucles "for" dans le même bloc ne sont pas autorisées ?

Voici ce que je pense être mon meilleur effort (je ne montre que LONG par souci de brièveté), pas d'erreurs mais l'EA ne fait pas de transactions, il est donc probable que j'ai encore raté la boucle :

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

si (trendCurr>0)

{

for(int i=0 ; i<=lookbackma ; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i) ;

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i) ;

si (testValue1 < testValue2-Separation2)

{

if (Bid TwentyOneEMA) // filtre de nouvelles

{

for(i=0 ; i<=lookback ; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i) ;

if (testValue3 <0 && NumOrders < maxorders) return(LONG) ;

}

return(NONE) ;

}

}

}

}

}

==========

Note : j'ai essayé if (testValue1 < testValue2-Separation2) continue ; mais 'continue' a été signalé comme une erreur Si 2 boucles ne sont pas autorisées, alors je suppose que ma prochaine tâche consistant à ajouter une autre boucle pourrait être malavisée...

Je pense que j'ai trouvé la solution, c'est la façon dont j'ai structuré la boucle for, parce que les choses n'allaient pas "finir" directement après cette première boucle, elle devait être structurée légèrement différemment de la deuxième boucle, du moins c'est la conclusion à laquelle je suis arrivé en regardant d'autres robots. Un test rapide montre que ce qui suit fonctionne, mais il reste encore des tests à faire.

NumOrders = CalculateCurrentOrders() ;

si (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

if (trendCurr>0)

{

for(int i=0 ; i<=lookbackma ; i++)

{

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i) ;

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i) ;

si (testValue1 < ! testValue2-Separation2)

{

Print("No Trade") ;

break ;

}

if (Bid TwentyOneEMA) continue ; // filtre de nouvelles

for(int j=0 ; j<=lookback ; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j) ;

if (testValue3 <0 && NumOrders < maxorders) return(LONG) ;

}

return(NONE) ;

}

}

}

}