Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 176

 
mila.com:

Lecture, mais je n'aurais jamais deviné qu'il fallait ouvrir le fichier avant la boucle).

Peut-être que je ne l'ai pas lu attentivement.)
Il y a même un exemple de lecture d'un fichier ligne par ligne du début à la fin...
 

Il existe un conseiller expert, qui est guidé par la barre d'épingle lors des transactions. Le robot fonctionne correctement sur les devises et de manière totalement imprévisible sur les CFD.

Pouvez-vous me dire comment cela peut se produire ?

 
RichLux:

J'ai écrit un robot qui est basé sur Pinbar lors de la négociation. Le robot fonctionne correctement sur les devises et de manière totalement imprévisible sur les CFD.

Pouvez-vous me dire comment cela peut se produire ?

Voici tout ce qu'il faut pour votre affaire.
 

Voici la fonction de définition de la Pinbar

int Pin() { 
  double Close1 = iClose (_Symbol,_Period,1); 
  double Open1 = iOpen (_Symbol,_Period,1); 
  double Low1 = iLow(_Symbol,_Period,1); 
  double High1 = iHigh (_Symbol,_Period,1); 
  double Close2 = iClose (_Symbol,_Period,2); 
  double Open2 = iOpen (_Symbol,_Period,2); 
  double Low2 = iLow(_Symbol,_Period,2); 
  double High2 = iHigh (_Symbol,_Period,2); 
  if (MathAbs(Close1-Open1)/(High1-Low1)<= BodyPercent) 
    { 
       if(Close1>High1 - BodyLocaut*(High1-Low1)&&Open1>High1-BodyLocaut*(High1-Low1)&&Low1<Low2-nose*_Point && High2>High1) 
          return (1); 
       if(Close1<Low1 + BodyLocaut*(High1-Low1)&&Open1<Low1+BodyLocaut*(High1-Low1)&&High1>High2+nose*_Point && Low2<Low1) 
          return (-1); 
    } 
  return(0); 
}

Lorsque je l'insère dans le conseiller expert, la fonction fonctionne bien (c'est-à-dire que le conseiller expert fixe les transactions sur la barre suivante après la barre correspondant aux conditions de la fonction) pour les paires de devises. Cependant, les transactions sur CFD sont ouvertes partout.

Quelle est la différence entre les CFD et les paires de devises pour cette fonction ?

 
RichLux:

Voici la fonction de définition de la Pinbar

Lorsque je l'insère dans le conseiller expert, la fonction fonctionne bien (c'est-à-dire que le conseiller expert fixe les transactions sur la barre suivante après la barre correspondant aux conditions de la fonction) pour les paires de devises. Cependant, les transactions sur CFD sont ouvertes partout.

Quelle est la différence entre les CFD et les paires de devises pour cette fonction ?

Tout d'abord, remplacez tous les && par {} de sorte que chacune des conditions se trouve dans son propre bloc - puis vous pouvez désimprimer le résultat testé dans chaque bloc - voyez quelles valeurs vous obtenez dans le journal.
 
Artyom Trishkin:
Tout d'abord, remplacez tous les && par {} afin que chacune des conditions soit dans son propre bloc - puis vous pouvez dans chaque bloc dérouler le résultat testé - voyez dans le journal quelles valeurs vous obtenez.

Merci, j'ai suivi les conseils et compris où je faisais fausse route. Parce que mon EA évoluait sur 5 chiffres et que le CFD n'est que de 2 chiffres. Je m'attendais à ce que l'EA réagisse à 50 pips minimum et j'ai obtenu une réaction de 5 pips. J'ai fait une erreur.

Veuillez m'aider sur ce point.

Il y a une telle partie dans le code :

MathAbs(Close1-Open1)/(High1-Low1)

Il arrive parfois que High1=Low1. Le testeur génère alors l'erreur critique disant qu'il ne peut pas diviser par zéro.

Comment le contourner ?

 
RichLux:

Merci, j'ai suivi les conseils et compris où je faisais fausse route. Parce que mon EA évoluait sur 5 chiffres et que le CFD n'est que de 2 chiffres. Je m'attendais à ce que l'EA réagisse à 50 pips minimum et j'ai obtenu une réaction de 5 pips. J'ai fait une erreur.

Veuillez m'aider sur ce point.

Il y a une telle partie dans le code :

Il arrive parfois que High1=Low1. Le testeur génère alors l'erreur critique disant qu'il ne peut pas diviser par zéro.

Comment le contourner ?

Vous pouvez le faire sans réfléchir :

MathAbs((Close1-Open1)/(High1-Low1>0?High1-Low1:0.00001))
 

Bonjour, j'ai rencontré un problème lors de la compilation :


void OnTick()

{

double minprice=999999, mp, maxprice=-999999 ;

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

{

mp = iLow(Simbol(), PERIOD_CURRENT, i) ;

si (mp < minprice)

minprice = mp ;

}


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

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i) ;

si (mp > maxprice)

maxprice = mp ;

}

Comment("Prix minimal : " + DoubleToString(minprice, 5) + "\n "+

"Prix maximum : " + DoubleToString(maxprice, 5)) ;

}


Le code source contient des fonctions que le compilateur jure par iLow et iHigh et la variable Simbol() là en mode chaîne, mais il résout un autre problème dans l'exemple. Que dois-je corriger dans le code ci-dessus. Je suis coincé et je n'arrive pas à compiler la boucle pour la vérifier.

DU MANUEL

Si vous voulez obtenir la valeur correspondant à la barre incomplète actuelle, alors

vous pouvez utiliser la première forme de l'appel en spécifiant start_pos=0 et count=1.

Exemple :

#property copyright "2009, MetaQuotes Software Corp."

#lien de propriété "https://www.mql5.com"

#propriété version "1.00"

#property description "Exemple de sortie des valeurs High[i] et Low[i]".

#property description "pour des barres choisies au hasard".

double High[],Low[] ;

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

//| Obtenir le niveau le plus bas pour un numéro de barre donné |

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

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double low=0 ;

ArraySetAsSeries(low,true) ;

int copied=CopyLow(symbole,timeframe,0,Bars(symbole,timeframe),Low) ;

if(copied>0 && index<copied) low=Low[index] ;

retour (faible) ;

}

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

//| Obtenir le haut pour le numéro de barre donné |

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

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double high=0 ;

ArraySetAsSeries(high,true) ;

int copied=CopyHigh(symbole,timeframe,0,Bars(symbole,timeframe),High) ;

if(copied>0 && index<copied) high=High[index] ;

retour (haut) ;

}

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

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

Bonjour, j'ai rencontré un problème lors de la compilation :


void OnTick()

{

double minprice=999999, mp, maxprice=-999999 ;

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

{

mp = iLow(Simbol(), PERIOD_CURRENT, i) ;

si (mp < minprice)

minprice = mp ;

}


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

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i) ;

si (mp > maxprice)

maxprice = mp ;

}

Comment("Prix minimum : " + DoubleToString(minprice, 5) + "\n "+

"Prix maximum : " + DoubleToString(maxprice, 5)) ;

}


Le code source contient des fonctions que le compilateur jure par iLow et iHigh ; la variable Simbol() y est en mode chaîne, mais elle résout un autre problème dans l'exemple. Que dois-je corriger dans le code ci-dessus. Je suis bloqué et je n'arrive pas à compiler la boucle pour la vérifier.

DU MANUEL

Si vous voulez obtenir la valeur correspondant à la barre incomplète actuelle, alors

vous pouvez utiliser la première forme de l'appel en spécifiant start_pos=0 et count=1.

Exemple :

#property copyright "2009, MetaQuotes Software Corp."

#lien de propriété "https://www.mql5.com"

#propriété version "1.00"

#property description "Exemple de sortie des valeurs High[i] et Low[i]".

#property description "pour des barres choisies au hasard".

double High[],Low[] ;

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

//| Obtenir le niveau le plus bas pour un numéro de barre donné |

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

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double low=0 ;

ArraySetAsSeries(low,true) ;

int copied=CopyLow(symbole,timeframe,0,Bars(symbole,timeframe),Low) ;

if(copied>0 && index<copied) low=Low[index] ;

retour (faible) ;

}

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

//| Obtenir le haut pour le numéro de barre donné |

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

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

double high=0 ;

ArraySetAsSeries(high,true) ;

int copied=CopyHigh(symbole,timeframe,0,Bars(symbole,timeframe),High) ;

if(copied>0 && index<copied) high=High[index] ;

retour (haut) ;

}

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


il y a une erreur dans ce motSimbol() vous devriez écrire Symbol() ou _Symbol
 
Sergey Gritsay:

Vous avez une erreur dans ce motSimbol() - Symbol() ou _Symbol devrait être écrit

Merci, l'erreur sur Simbol a été corrigée en orthographiant correctement Symbol. J'ai un problème avec les fonctions iLow et iHigh.

Quelle est ladifférence en % entre MQL4 et MQL5 ? Sinon, je vais devoir me gratter la tête à chaque fois que je regarderai les tutoriels vidéo de MQL4.

Dossiers :
1.png  64 kb