Aide au codage - page 62

 

...

Vous devez faire 2 choses
:- déclarer la variable "period" comme double (MQL se comporte parfois bizarrement quand dans la division une variable de type entier est utilisée)

- initialiser cette variable "period" (pour l'instant elle n'est pas initialisée et c'est pourquoi la dernière étape n'a pas fonctionné)

Après cela, vous obtiendrez quelque chose comme ceci :

Have a nice weekend

chenairbin:
#property indicateur_separate_window

#property indicator_buffers 1

#property indicator_color1 Red

#property indicator_maximum 100

#property indicator_level1 70

#property indicator_level2 50

#property indicator_level3 30

#property indicator_minimum 0

//---- paramètres d'entrée

extern int rsiperiod = 14 ;

extern int Shortperiod = 5 ;

extern int Middleperiod = 8 ;

extern int Longperiod = 13 ;

extern int mamode = 2 ;

//---- tampons

double RSI[] ;

double ShortRSI[] ;

double MiddleRSI[] ;

double LongRSI[] ;

double SMRSI[] ;

int période ;

//+------------------------------------------------------------------+

//| Fonction d'initialisation de l'indicateur personnalisé |

//+------------------------------------------------------------------+

int init()

{

//---- indicateurs

IndicatorBuffers(5) ;

SetIndexBuffer(0,SMRSI) ;

SetIndexBuffer(1,RSI) ;

SetIndexBuffer(2,ShortRSI) ;

SetIndexBuffer(3,MiddleRSI) ;

SetIndexBuffer(4,LongRSI) ;

//---- nom pour la DataWindow et l'étiquette de la sous-fenêtre de l'indicateur

IndicatorShortName("SMRSI("+rsiperiod+", "+Shortperiod+", "+Middleperiod+", "+Longperiod +", "+mamode+")") ;

SetIndexDrawBegin(0,rsiperiod+Longperiod) ;

period=Shortperiod+Middleperiod+Longperiod ;

retour(0) ;

}

//+------------------------------------------------------------------+

//| Fonction d'itération de l'indicateur personnalisé |

//+------------------------------------------------------------------+

int start()

{

int counted_bars=IndicatorCounted() ;

int i,limit ;

if(counted_bars<0) return(-1) ;

if(counted_bars>0) counted_bars-- ;

limit = Bars-counted_bars ;

for( i=limit ; i>=0 ; i--) RSI=iRSI(NULL,0,rsiperiod,0,i) ;

for( i=limit ; i>=0 ; i--) ShortRSI=iMAOnArray(RSI,0,Shortperiod,0,mamode,i) ;

for( i=limit ; i>=0 ; i--) MiddleRSI=iMAOnArray(RSI,0,Middleperiod,0,mamode,i) ;

for( i=limit ; i>=0 ; i--) LongRSI=iMAOnArray(RSI,0,Longperiod,0,mamode,i) ;

for( i=limit ; i>=0 ; i--) { if(period!=0) SMRSI=(Shortperiod/period)*ShortRSI+(Middleperiod/period)*MiddleRSI+(Longperiod/period)*LongRSI;}

return(0) ;

}

//+------------------------------------------------------------------+
Dossiers :
smrsi.gif  33 kb
_test0.mq4  3 kb
 

n_n

mladen:
Vous devez faire 2 choses
:- déclarer la variable "period" comme double (MQL se comporte parfois bizarrement lorsqu'en division une variable de type entier est utilisée)

- initialiser cette variable "period" (pour l'instant elle n'est pas initialisée et c'est pourquoi la dernière étape n'a pas fonctionné)

.

Après cela, vous obtiendrez quelque chose comme ceci :

Passez un bon week-end

Merci !

 

Bonjour,

J'ai téléchargé l'indicateur joint sur le site de mql4. J'essaie de faire un EA basé sur cet indicateur mais quand je démarre le backtest après quelques secondes les plateformes se plantent et je pense que c'est un défaut de l'indicateur car il utilise beaucoup de cpu.

Donc je demande s'il est possible d'alléger le code pour résoudre ce problème.

Merci pour votre disponibilité.

cronex_taichi.mq4

Dossiers :
 

dasio

Je l'ai testé avec ce snippet, et cela fonctionne bien. Je ne connais pas les paramètres que vous avez utilisés, donc c'est juste l'appel d'un indicateur par défaut, mais il n'y a aucun problème de cette façon.

int init()

{

return(0);

}

int start()

{

Comment(iCustom(NULL,0,"Cronex Taichi",0,0));

return(0);

}

dasio:
Bonjour,

J'ai téléchargé l'indicateur joint sur le site de mql4. J'essaie de faire un EA basé sur cet indicateur mais quand je démarre le backtest après quelques secondes les plateformes se plantent et je pense que c'est un défaut de l'indicateur car il utilise beaucoup de cpu.

Donc je demande s'il est possible d'alléger le code pour résoudre ce problème.

Merci pour votre disponibilité.

cronex_taichi.mq4
 
mladen:
dasio

Je l'ai testé avec ce snippet, et cela fonctionne bien. Je ne connais pas les paramètres que vous avez utilisés, donc c'est juste l'appel d'un indicateur par défaut, mais il n'y a aucun problème de cette façon.

int init()

{

return(0);

}

int start()

{

Comment(iCustom(NULL,0,"Cronex Taichi",0,0));

return(0);

}

Merci pour votre réponse,

Ce que je vois, c'est que dans l'historique, l'indicateur a été chargé à plusieurs reprises. J'ai donc déplacé le code d'icustom uniquement dans un événement de nouvelle bougie, mais le problème persiste.

Je ne sais pas pourquoi.

Cependant merci pour votre disponibilité.

 

Salut,

J'ai trouvé le problème. Maintenant tout est ok.

J'ai un autre problème avec un autre ea.

J'ai ces deux codes et la fonction Lotti() devrait me retourner le nombre de lot pour un ordre.

Quand je le compile, je reçois Posizioni Internal Error. Quel est le problème ? Merci ;

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

int intPOS=0;

bool boolTerm=false;

while(boolTerm==false)

{

if(OrderSelect(intPOS,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

intPOS++;

}

else

boolTerm=true;

}

return(intCount);

}

[/PHP]

[PHP]int Lotti(){

int Lotti;

int Posizioni=OTBM(MagicNumber);

switch (Posizioni)

{

case 0 : Lotti=0.1; break;

case 1 : Lotti=0.2; break;

case 2 : Lotti=0.4; break;

case 3 : Lotti=0.8; break;

case 4 : Lotti=1.6; break;

case 5 : Lotti=3.2; break;

case 6 : Lotti=6.4; break;

case 7 : Lotti=12.8; break;

}

return(Lotti);

}
 

Essayez de remplacer OTBM() par ceci :

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

}

}

return(intCount);

}

[/PHP]

dasio:
Hi,

i found the problem. Now all its ok.

I have another problem with another ea.

I have this two code and the function Lotti() would be return me the number of lot for an ordersend.

When i compile it i receive Posizioni Internal Error. What's wrong? Thank you;

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

int intPOS=0;

bool boolTerm=false;

while(boolTerm==false)

{

if(OrderSelect(intPOS,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

intPOS++;

}

else

boolTerm=true;

}

return(intCount);

}

[PHP]int Lotti(){

int Lotti;

int Posizioni=OTBM(MagicNumber);

switch (Posizioni)

{

case 0 : Lotti=0.1; break;

case 1 : Lotti=0.2; break;

case 2 : Lotti=0.4; break;

case 3 : Lotti=0.8; break;

case 4 : Lotti=1.6; break;

case 5 : Lotti=3.2; break;

case 6 : Lotti=6.4; break;

case 7 : Lotti=12.8; break;

}

return(Lotti);

}
 

Salut, -.-"

Je ne trouve pas la paix avec ces codes eheheh.

J'ai un problème avec une fonction qui doit me donner le profit de tous les ordres ouverts mais je pense que ça ne marche pas car la condition n'a jamais été respectée. Ci-dessous le code :

.....

if(Profit()>=0.....[/PHP]

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

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

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}
 

dasio

Essayez comme ceci :

.....

if(Profit()>=0.....[/PHP]

double Profit()

{

int total=OrdersTotal();

double profit=0;

for(int i=0; i<total-1; i++)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}[/PHP]

dasio:
Hi, -.-"

I do not find peace with these codes eheheh.

I have a problem with a function that have to result me the profit of all openorder but i think it's not work because the condition never been respected. Below the code:

[PHP].....

if(Profit()>=0.....

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

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

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}
 
mladen:
dasio

Essayez comme ceci :

.....

if(Profit()>=0.....[/PHP]

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

for(int i=0; i<total-1; i++)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}

De cette façon, je vérifie les ordres qui ne sont pas ouverts avec le numéro magique spécifié, n'est-ce pas ? Je dois vérifier l'ordre avec un symbole et un numéro magique spécifiques. Je ne sais pas si c'est important, mais j'ai trouvé l'erreur dans le testeur de stratégie.