[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 60

 
7777877: transfert de paramètres à partir du transfert de paramètres par référence ?

voici le transfert des paramètres par référence, faites un script comme ceci :

int start(){
   int res = 999;
   Print("func = ",func(res)," , res = ",res);
return(0);
}
//__________________________
int func(int &a){
   a = 10;
   return(a*10);
}

l'onglet Expert affiche l'enregistrement suivant : 2012.04.08 11:19:35 test EURUSD,M5 : func = 100, res = 10

et essayer de répondre à la question pourquoi nous avons assigné res = 999; et le journal a obtenu res = 10

 

Pouvez-vous me dire comment connecter les bibliothèques ? Ils sont présents dans les fichiers mqh, mais lors de la copie ils donnent

strlib.mqh' - Impossible d'ouvrir le fichier du programme.

 
IgorM:

voici le transfert de paramètres à partir du lien, faites un script comme ceci :

l'onglet Expert affichera l'entrée suivante : 2012.04.08 11:19:35 test EURUSD,M5 : func = 100, res = 10

Et essayer de répondre à la question pourquoi nous avons assigné res = 999; mais dans le journal a obtenu res = 10


Voici mon explication :

La fonction Print appelle la fonction utilisateur func. Le paramètre res=999 est transmis à la fonction func. Lorsque la fonction func elle-même est évaluée, le paramètre a=10 est utilisé. La valeur a*10=100 est renvoyée à l'endroit où la fonction func est appelée. Puisque nous obtenons res=10, j'en déduis que passer un paramètre par référence signifie ce qui suit : vous pouvez passer N'IMPORTE QUELLE valeur du type concerné (dans ce cas, res=999) à la fonction appelée (dans ce cas, à func), mais la fonction elle-même sera déjà évaluée avec cette valeur (c'est-à-dire...(c'est-à-dire dans notre cas avec a=10), qui sera initialisée à l'intérieur de la fonction elle-même (qui dans un cas particulier peut aussi coïncider avec la valeur passée dans la fonction appelée, c'est-à-dire dans ce cas, dans func). Et lors du transfert de la valeur calculée dans la fonction (dans ce cas, à func) vers la chaîne d'appel de la fonction, la variable (dans ce cas, res) aura déjà une valeur différente de celle d'avant, c'est-à-dire la valeur qu'elle a reçue lors du calcul de la fonction func (c'est-à-dire, dans ce cas, res=10). Ainsi, lorsqu'on passe un paramètre à une fonction par référence, à l'intérieur d'une fonction évaluée, la valeur du paramètre peut changer, et de plus, après que la valeur calculée soit retournée dans la chaîne d'appel de la fonction, ce paramètre aura une valeur MODIFIÉE (dans un cas particulier, la même), qu'il a reçue lors du calcul de la fonction appelée.

Est-ce que j'ai bien compris ?

 
7777877: Lorsqu'un paramètre est transmis à une fonction par référence, la valeur du paramètre peut changer dans la fonction évaluée.
Oui, c'est vrai.
 
IgorM:
C'est vrai.

Grosse danke schoen !!!
 

S'il vous plaît dites-moi, je veux faire une modification de l'ordre, de sorte que l'EA va changer la valeur de stop-loss au moment que je spécifie, mais il commence à tromper.

voici mon code

extern int tp = 350 ; // valeur de profit takeprofit
extern int sl = 400 ; // valeur de perte stoploss

int ticket ;

int start()
{
//----
if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // l'ordre s'ouvre à 2:00 heure du terminal
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,"",123,0,Red) ;

//----

if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // ici, je pose une condition selon laquelle l'ordre avec le ticket sélectionné doit être modifié à 3h00 heure du terminal. temps.

{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ; // ici j'ai spécifié la sélection de l'ordre, le trade
OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue) ; // modifier l'ordre avec le ticket sélectionné, à partir du prix de la position ouverte, changer la valeur SL en points, TP laissé inchangé


}
//--

}


Il y a un problème pendant le test : le conseiller expert commence à faire beaucoup de modifications inutiles dans le temps, de 3 heures 00 minutes à 3 59 minutes. EA s'amuse à faire des modifications à chaque seconde ! Pourquoi ? Quel est le problème avec le code ?

 
oleg_felix:

Dites-moi, je veux faire une modification de l'ordre, de sorte que l'EA change la valeur du stop loss au moment que je spécifie, mais il commence à faire des bêtises.

voici mon code

extern int tp = 350 ; // valeur de prise de profit
extern int sl = 400 ; // valeur du stop loss

int ticket ;

int start()
{
//----
if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // l'ordre s'ouvre à 2:00 heure terminale
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,"",123,0,Red) ;

//----

if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // ici j'ai spécifié une condition selon laquelle l'ordre avec le ticket sélectionné doit être modifié à 15h selon l'heure du terminal.

{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ; // ici, j'ai spécifié la sélection de l'ordre, la transaction.
OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue) ; // modifie l'ordre avec le ticket sélectionné, à partir du prix de la position ouverte, change la valeur SL en points, laisse le TP inchangé


}
//--

}


Lors du test, un problème survient : le conseiller expert commence à faire beaucoup de modifications inutiles dans le temps, de 3 heures 00 minutes à 3 59 minutes. L'Expert Advisor s'amuse à faire des modifications à chaque seconde ! Pourquoi ? Quel est le problème avec le code ?



Pourquoi sur le temps..... sur le profit !!!

 

Comment écrire la fonction correcte pour modifier un ordre ouvert dans un compte ECN, où vous ne pouvez pas placer le stop et le profit en une fois, mais vous devez le faire par modification.

Le problème est que quelque chose ne va pas, s'il vous plaît aidez-moi à trouver l'erreur.

extern int tp = 350 ; // valeur de profit takeprofit
extern int sl = 400 ; // valeur de perte stoploss

int ticket ;
int start()
{
//----
if (OrdersTotal()==0 && Close[1]<Open[1] && High[1]<Bid) )==0) // l'ordre s'ouvre sur des conditions
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0t,",123,0,Red) ;
//----
if (OrdersTotal()==1 ) // ici j'ai défini une condition qui modifie un ordre avec un seul ordre sélectionné.
{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) ; // ici j'ai spécifié la sélection des ordres, les transactions
OrderModify(ticket, OrderOpenPrice(), Ask+sl*Point,Ask-tp*Point,0,Blue) ; // modifie l'ordre avec le ticket sélectionné, à partir du prix de la position ouverte, change la valeur SL en points, laisse TP inchangé
}
}

 
oDin48:
  • Les gars, comment je connecte les bibliothèques ? Quand j'essaye de compiler l'EA, cela donne

  • strlib.mqh' - Impossible d'ouvrir le fichier du programme.

A trouver la ligne :
#include <strlib.mgh>

et remplacer par :

#include <stdlib.mgh>
 
7777877:

S'il vous plaît, expliquez d'une manière simple, ce qu'est le transfert de paramètres par référence. J'ai lu la documentation, mais j'ai seulement compris que c'est possible et qu'après l'identification de la variable, il est obligatoire de mettre un modificateur &. Ce serait formidable si l'explication était accompagnée d'un petit programme avec des explications... Quelle est la différence entre le passage habituel de paramètres et le passage de paramètres par référence ?

Le sens général du passage de paramètres par référence est de passer non pas la variable elle-même, mais son adresse dans le paramètre. Dans le cas contraire, une copie de la variable est passée au paramètre.