Besoin d'aide ?

 

J'essaie de coder un EA basé sur ma propre stratégie, avec l'aide du code de quelques autres EAs et indis. mais je suis maintenant bloqué sur une chose.

(user defined lot sizes for each trade)

extern string LotsProgression="0.1;0.1;0.2;0.3;0.4;0.6;0.8;1.1;1.5;2.0;2.7;3.6;4.7;6.2;8.0;10.2;13.0;16.5;20.8;26.3;33.1;41.6;52.2;65.5;82.5;103.9;130.9;165;207.9;262;330.1;416;524.7;661.1";

extern bool RestartNewCycle = true;

(and the code)

int init()

{

int i,j,k;

string ls;

while (true) {

        j=StringFind(LotsProgression,";",i);

        if (j>0) {

                ls=StringSubstr(LotsProgression,i,j-i);

                i=j+1;

                k++;

                ArrayResize(lots,k);

                lots[k-1]=StrToDouble(ls);

        } else {

                ls=StringSubstr(LotsProgression,i);

                k++;

                ArrayResize(lots,k);

                lots[k-1]=StrToDouble(ls);

                break;

        }

}



plen=ArraySize(lots);

}

Je ne parviens pas à comprendre cette logique ou ce qu'elle représente réellement.

PS : Un ami a aimé ma stratégie et a créé cette EA. Mais j'ai perdu les deux (l'EA et le contact de cet ami codeur), alors maintenant j'essaie de tester mes connaissances de base en codage, car je veux vraiment que cette stratégie soit codée à nouveau.

 
qgmql:

J'essaie de coder un EA basé sur ma propre stratégie, avec l'aide du code de quelques autres EA et indis. mais maintenant bloqué dans une chose.

<emoved>


Veuillez utiliser le bouton SRC pour afficher le code . . .
 
qgmql: Je ne parviens pas à comprendre cette logique ou ce qu'il en est réellement.

extern string LotsProgression="0.1;0.1;0.2;0.3 ...

double lots[];     // [0]=0.1 [1]=0.1 [2]=0.2 [3]=0.3 [34]=661.1
int    plen;       // 35
int init(){ ... }

Divise la chaîne de caractères au niveau des points-virgules, convertit les sous-chaînes en doubles, et stocke les valeurs dans le tableau dynamique.
 

La chose que vous avez mentionnée est correcte. Le problème est dans le reste du code. J'obtiens deux erreurs (uniquement dans le nouveau metaeditor).

'init' - function can be declared only in the global scope

and

'init' - function already defined and has body
 
qgmql:

La chose que vous avez mentionnée est correcte. Le problème est dans le reste du code. J'obtiens deux erreurs (uniquement dans le nouveau metaeditor).

On dirait que vous avez déclaré init() à l'intérieur d'une autre fonction et que vous l'avez définie une deuxième fois....
 

Oui, j'ai compris et corrigé. J'obtiens maintenant une erreur dans le code de l'horizon temporel.

   //--- EA PARAMETERS
extern int      EA_TF=240;
extern bool     Forced_TF=True;


bool   TF;

     if(Forced_TF != True) TF = EA_TF;     //These two lines i think, have error.
     else TF = Period();                   //New metaeditor is not accepting "TF = EA_TF;" from above line.

Si Forced_TF est true, alors l'EA doit trader et obtenir des signaux à partir de l'horizon temporel mentionné uniquement, même si le graphique actif (sur lequel je place l'EA) est ouvert dans un horizon temporel différent. Si la valeur est false, alors l'EA devrait fonctionner sur n'importe quel timeframe.

 
qgmql:

Oui, j'ai compris et corrigé. Maintenant, j'obtiens une erreur dans le code de l'horizon temporel.

Si Forced_TF est true, alors l'EA doit trader et obtenir des signaux à partir de l'horizon temporel mentionné uniquement, même si le graphique actif (sur lequel je place l'EA) est ouvert dans un horizon temporel différent. Si la valeur est false, alors l'EA devrait fonctionner sur n'importe quel timeframe.

Vous avez TF comme un bool .. . mais vous essayez de le définir comme un int... essayez ceci ....

   //--- EA PARAMETERS
extern int      EA_TF=240;
extern bool     Forced_TF=True;


int   TF;

     if(!Forced_TF) TF = EA_TF;     //These two lines i think, have error. 
     else TF = Period();            //New metaeditor is not accepting "TF = EA_TF;" from above line.
 
Affichez TOUT le code ou indiquez au moins la troncature. Ce IF/ELSE doit être à l'intérieur d'une fonction.
 

@RaptorUK Je vous ai compris. et encore une fois tout est ok avec l'ancien éditeur, mais le nouvel éditeur donne toujours un avertissement, cité dans le code après la ligne d'erreur,

//+------------------------------------------------------------------+
//|                                                   01Multi_EA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
#property version   "1.00"
#property strict

//--- input parameters
input int      EA_TF=60;
input bool     Forced_TF=True;
input int      MagicNumber=12345;
input int      FastMA_Period=5;
input int      FastMA_Shift=0;
input int      FastMA_Method=1;
input int      FastMA_Price=0;
input int      SlowMA_Period=34;
input int      SlowMA_Shift=0;
input int      SlowMA_Method=1;
input int      SlowMA_Price=0;
input string   LotsProgression="0.01;0.02;0.03;0.04;0.05;0.06;0.07;0.08;0.09;0.10;0.11;0.12;0.13;0.14;0.15;0.16;0.17;0.18;0.19;0.20";
input bool     NewCycle=True;
input int      Limit_TP=50;
input bool     Use_TP=False;
input int      Limit_SL=50;
input bool     Use_SL=False;
input int      MaxSlippage=3;
input int      OrderTries=10;

int      TF, Plen;
double   TP, SL, pips2dbl, pips2point, pipValue, Slippage, Lots[];
         
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//----
 if(Forced_TF != True) TF = EA_TF;
      else TF = Period();
   int i,j,k;
   string ls;
   while (true) {
        j=StringFind(LotsProgression,";",i);
        if(j>0) {
                ls=StringSubstr(LotsProgression,i,j-i);    // <<<<<"possible use of uninitialized variable 'i'	01Multi_EA.mq4	46	38">>>>>

                i=j+1;
                k++;
                ArrayResize(Lots,k);
                Lots[k-1]=StrToDouble(ls);
        } else {
                ls=StringSubstr(LotsProgression,i);
                k++;
                ArrayResize(Lots,k);
                Lots[k-1]=StrToDouble(ls);
                break;
        }
   }


   Comment("Copyright © 2004, MetaQuotes Software Corp.");
   
   if (Digits == 5 || Digits == 3)
   {            
      pips2dbl = Point*10; pips2point = 10; pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*10;
   } 
   else 
   {    
      pips2dbl = Point;   pips2point = 1; pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*1;
   }
   
   Slippage = pips2dbl*MaxSlippage;
   TP = pips2dbl*Limit_TP;
   SL = pips2dbl*Limit_SL;
   
//----
   return(INIT_SUCCEEDED);
  }

@WHRoeder J'ai collé le code entier.

 
qgmql:

@RaptorUK Je vous ai compris. et encore une fois tout est ok avec l'ancien éditeur, mais le nouvel éditeur donne toujours un avertissement, cité dans le code après la ligne d'erreur,

@WHRoeder J'ai collé le code entier.

Ce n'est pas une erreur, c'est un avertissement... pour se débarrasser de l'avertissement, initialisez la variable plutôt que de simplement la déclarer. Dans mql4, lorsque vous déclariez une variable, elle était également initialisée, maintenant avec mql4.5, vous devez initialiser explicitement la variable si vous voulez....

int i = 0, j, k;   //  i initialised to 0
 
pipValue = (MarketInfo(Symbol(),MODE_TICKVALUE))*10;
N'utilisez pas tickvalue par lui-même https://www.mql5.com/en/forum/133792/page3#512466
Raison: