[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 203
![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Et en général, vous devriez avoir une fourchette de temps, pas une valeur fixe. Votre logique n'est pas du tout correcte. Pas 1 heure OU 3 heures, mais 1 heure à 3 heures ! !!Pour commencer, habituez-vous à mettre les supports là où vous en avez besoin. Comme ça :
Bonjour, pourriez-vous me donner une commande (s'il y en a une) pour sélectionner aléatoirement un nombre soit 0 soit 1, merci d'avance ?
Pendant le test de l'Expert Advisor j'ai trouvé des erreurs d'exécution de code :
- l'exécution de la boucle for(i=0;i<OrdersTotal();i++) est interrompue au prochain tick (ci-dessous en Gras),
- Les ordres d'achat sont sélectionnés et fermés dans n'importe quel ordre.
Pouvez-vous me dire comment en trouver la cause et la réparer ?
Le code du programme et le rapport du journal du testeur.
Code du programme.
//+------------------------------------------------------------------+
//|Poligon1.mq4 |
//| Droits d'auteur 2012, MetaQuotes Software Corp.
//| Test de l'opérateur de boucle.|
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#propriété lien ""
//+------------------------------------------------------------------+
//Déclarer des variables|
//+------------------------------------------------------------------+
int Mn=357;//Numéro magique
int i;//Indice du compteur d'itération
double PriTP;//TP series
int Tick;//Compteur de ticks
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int init()
{
//----Setting orders
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,Bid-350*Point,Ask+350*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1,Ask,0,Bid-250*Point,Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUYLIMIT,1,Ask-150*Point,0,Bid-400*Point,
Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_SELLSTOP,3,Ask-300*Point,0,Bid+150*Point,
Ask-750*Point,NULL,Mn,0,CLR_NONE);//
//----
PriTP=Bid;//PriTP
Print("Kc0 :",OrdersTotal=",OrdersTotal());//
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage de l'expert|
//+------------------------------------------------------------------+
int start()
{
//----Compteur de coups
Tick++;//Tick
//----Close Ordres d'achat
for(i=0;i<OrdersTotal();i++)//initialiser la boucle
{
Print("Kc1 :"," Tick=",Tick," i=",i);//Message
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Sélectionner l'ordre i
{
if(OrderSymbol()==Symbol())//Symbole
{
if(OrderMagicNumber()==Mn)//Numéro d'identification
{
if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Type de transaction de l'ordre actuellement sélectionné
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Clôture de la position
}/Closed if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
}// Fermé si(OrderMagicNumber()==Mn)
}// Fermé si(OrderSymbol()==Symbol()
}// Fermé si(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
}// Fermé for(i=0;i<OrdersTotal();i++)
//----
retour(0) ;
}
Entrées du carnet de bord du testeur.
2013.03.01 12:12:57 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=5 i=1
2013.03.01 12:12:57 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=5 i=0
2013.03.01 12:12:33 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=4 i=1
2013.03.01 12:12:33 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=4 i=0
2013.03.01 12:12:03 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=3 i=1
2013.03.01 12:12:03 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #4 acheter 2.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 at 1.25770
2013.03.01 12:12:09 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=3 i=0
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=2 i=2
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=2 i=1
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #2 acheter 1.00 EURUSD à 1.25773 sl : 1.25516 tp : 1.26023 au prix de 1.25768
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=2 i=0
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=1 i=3
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #5 acheter 3.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 at 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=1 i=2
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #3 acheter 1.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 à 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=1 i=1
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #1 acheter 0.50 EURUSD à 1.25773 sl : 1.25416 tp : 1.26123 at 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=1 i=0
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc0 : OrdersTotal=7
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : open #7 sell stop 3.00 EURUSD at 1.25473 sl : 1.25916 tp : 1.25023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : open #6 buy limit 1.00 EURUSD at 1.25623 sl : 1.25366 tp : 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : ouvert #5 acheter 3.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : ouvert #4 acheter 2.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : ouvert #3 acheter 1.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : open #2 buy 1.00 EURUSD at 1.25773 sl : 1.25516 tp : 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : ouvert #1 acheter 0.50 EURUSD à 1.25773 sl : 1.25416 tp : 1.26123 ok
2013.03.01 12:11:21 PM Test de Poligon1 commencé
2013.03.01 12:11:21 18 18:30 Poligon1 EURUSD, M15 : chargé avec succès
Regards. Shurkin
En testant l'Expert Advisor, nous avons détecté quelques erreurs dans le code :
- l'exécution de l'opérateur de boucle for(i=0;i<OrdersTotal();i++) est interrompue par le tick suivant (indiqué en gras ci-dessous),
- Les ordres d'achat sont sélectionnés et fermés dans un ordre aléatoire.
Regards. Shurkin
1. Les ordres ne peuvent pas être ouverts dans la fonction init() (dans le testeur de stratégie, mais cela ne fonctionnera pas sur la démo).
2. Lorsque vous clôturez des ordres, comptez de la fin au début, et non l'inverse, comme vous l'avez fait.
Lors du test de l'Expert Advisor, des erreurs d'exécution du code ont été détectées :
- l'exécution de l'instruction en boucle for(i=0;i<OrdersTotal();i++) est interrompue par le tick suivant (souligné en gras ci-dessous),
- les ordres d'achat sont sélectionnés et fermés dans un ordre aléatoire.
Pouvez-vous me dire comment trouver la cause et la réparer ?
Je vous fournis le code du programme et le rapport du journal du testeur.
Le code du programme.
//+------------------------------------------------------------------+
//|Poligon1.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| Test de l'opérateur de boucle.|
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#lien de propriété ""
//+------------------------------------------------------------------+
//|Variables déclarées|
//+------------------------------------------------------------------+
int Mn=357;//Nombre magique
int i ;//Compteur d'itérations
double PriTP;//Série deTP
int Tick;//Compteur de ticks
//+------------------------------------------------------------------+
//| fonction d'initialisation des experts |
//+------------------------------------------------------------------+
int init()
{
//----Set orders
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,Bid-350*Point,Ask+350*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1,Ask,0,Bid-250*Point,Ask+250*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,Bid-150*Point,Ask+150*Point,NULL,Mn,0,CLR_NONE);//
OrderSend(Symbol(),OP_BUYLIMIT,1,Ask-150*Point,0,Bid-400*Point,Point,
Ask+250*Point,NULL,Mn,0,CLR_NONE)//
OrderSend(Symbol(),OP_SELLSTOP,3,Ask-300*Point,0,Bid+150*Point,Point,
Ask-750*Point,NULL,Mn,0,CLR_NONE);//
//----
PriTP=Bid;//PriTP
Print("Kc0 :"," OrdersTotal=",OrdersTotal());//PriTP
//----
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation experte|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0) ;
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----Counter Tick
Tick++;//Tick
//----Close BUY Orders
for(i=0;i<OrdersTotal();i++)//initialiser la boucle
{
Print("Kc1 :"," Tick=",Tick," i=",i);//Envoyer le message
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Sélectionner l'ordre i
{
if(OrderSymbol()==Symbol())//Symbole
{
if(OrderMagicNumber()==Mn)//Numéro d'identification
{
if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Type d'opération de l'ordre actuellement sélectionné
{
OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Clôture de la position
}/Closed if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
}/Closed if(OrderMagicNumber()==Mn)
}// Closed if(OrderSymbol()==Symbol()
}// Closed if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
}// Fermé for(i=0;i<OrdersTotal();i++)
//----
return(0) ;
}
Entrées du journal du testeur.
2013.03.01 12:12:57 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=5 i=1
2013.03.01 12:12:57 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=5 i=0
2013.03.01 12:12:33 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=4 i=1
2013.03.01 12:12:33 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=4 i=0
2013.03.01 12:12:09 2012.03 03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=3 i=1
2013.03.01 12:12:09 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #4 buy 2.50 EURUSD at 1.25773 sl : 1.25616 tp : 1.25923 at price 1.25770
2013.03.01 12:12:09 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=3 i=0
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=2 i=2
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=2 i=1
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #2 buy 1.00 EURUSD à 1.25773 sl : 1.25516 tp : 1.26023 au prix de 1.25768
2013.03.01 12:11:45 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=2 i=0
2013.03.01 12:11:21 2012.09.03 03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=1 i=3
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #5 buy 3.50 EURUSD at 1.25773 sl : 1.25616 tp : 1.25923 at price 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=1 i=2
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #3 acheter 1.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 au prix 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=1 i=1
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : close #1 acheter 0.50 EURUSD à 1.25773 sl : 1.25416 tp : 1.26123 at 1.25766
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc1 : Tick=1 i=0
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : Kc0 : OrdersTotal=7
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : open #7 sell stop 3.00 EURUSD at 1.25473 sl : 1.25916 tp : 1.25023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : open #6 buy limit 1.00 EURUSD at 1.25623 sl : 1.25366 tp : 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : ouvert #5 achat 3.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : ouvert #4 achat 2.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : ouvert #3 acheter 1.50 EURUSD à 1.25773 sl : 1.25616 tp : 1.25923 ok
2013.03.01 12:11:21 2012.09.03 00:00 Poligon1 EURUSD,M15 : open #2 buy 1.00 EURUSD at 1.25773 sl : 1.25516 tp : 1.26023 ok
2013.03.01 12:11:21 2012.09.03 00:00:00 Poligon1 EURUSD,M15 : ouvert #1 acheter 0.50 EURUSD à 1.25773 sl : 1.25416 tp : 1.26123 ok
2013.03.01 12:11:21 Poligon1 test démarré
2013.03.01 12:11:21 Poligon1 EURUSD,M15 : chargé correctement
Regards. Shurkin
int x =MathRand() % 2 ;
Pourquoi renverrait-il 0 ou 1 au lieu d'un autre nombre ? Selon l'aide,MathRand() retourne un entier pseudo-aléatoire entre 0 et 32767
Et pourquoi renverrait-il 0 ou 1 au lieu d'un autre nombre ? Après tout, selonMathRand() renvoie un nombre entier pseudo-aléatoire compris entre 0 et 32767.
C'est le reste de la division! Regardez dans les étapes arithmétiques et dans votre imprimante !
Mettez-le et vous ne verrez que deux résultats en alternance :
Salutations à tous ! Je veux savoir comment arrêter le conseiller expert, lorsque les conditions pour entrer sur le marché sont réunies, il commence à écrire dans le fichier journal "Ordre déclenché !" et le fait quelques dizaines de fois par minute, en conséquence le fichier journal devient cosmiquement énorme. Comment faire pour qu'elle n'écrive qu'une seule fois, et pas avant de fermer la position, car elle peut rester suspendue pendant quelques heures...
Salut Allis ! L'impression doit être prescrite là où il n'y a pas de lecture de coche ! Je mets dans l'impression s'il y a une erreur, et si elle s'est ouverte, et ainsi il est prescrit dans le carnet de bord qu'elle s'est ouverte, et une seule fois !
Vous êtes un magicien)) Merci !