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
Une autre note très importante concernant l'utilisation de votre EA sur de multiples paires de devises ou cadres temporels.
Votre code n'utilise pas la sélection du "Magic Number" et ne vérifie pas le symbole (ni le "Magic number") utilisé lors de la vérification des ordres ouverts dans l'historique. Donc, en substance, votre EA ne fonctionnera pas correctement, ni avec lui-même, ni avec les autres EA.
En l'état actuel des choses, vous ne pouvez utiliser cet EA que seul, sans aucun autre EA en cours d'exécution, même pas lui-même sur un autre graphique !
bool ans;
//You do not select an order
if(OrderType()==OP_BUY){
while(fastma < slowma) //Use if not while
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1) //ticket is a local variable and has not been assigned a value
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
Je vous remercie beaucoup de m'avoir aidé avec mon code jusqu'à présent et de votre temps, je vais essayer de faire les ajustements nécessaires.
Parce que vous avez trop de problèmes de logique dans votre EA, je vous suggère de jeter un coup d'œil sur l'exemple de code de MetaQuotes, à savoir"Moving Average.mq4" et/ou "MACD Sample.mq4" et de construire sur cette base, jusqu'à ce que vous compreniez les principes de base du fonctionnement d'un EA.
J'ai joint les fichiers, mais vous les trouverez dans votre dossier "MQL4\Experts".
EDIT : En ce qui concerne le code, vous utilisez l'OrderSelect, mais vous supposez toujours qu'il fonctionne à chaque fois. Et quand cela ne fonctionne pas, vous continuez à utiliser les fonctions de détails de l'ordre comme OrderTicket() dans votre clôture, qui pourrait échouer si l'OrderSelect() initial échoue aussi.
Après avoir remarqué votre édition.....
J'avais toujours supposé qu'un OrderSelect() serait perdu lorsqu'il y a un nouveau tick.
J'ai donc vérifié et j'ai constaté qu'une fois qu'un ordre est sélectionné, il reste sélectionné même lors des nouveaux ticks suivants.
J'apprends quelque chose de nouveau chaque jour :)
J'avais toujours supposé qu'un OrderSelect() serait perdu lorsqu'il y a un nouveau tick.
J'ai donc vérifié et j'ai découvert qu'une fois qu'un ordre est sélectionné, il le reste même lors des nouveaux ticks suivants.
J'apprends quelque chose de nouveau chaque jour :)
Une autre note très importante concernant l'utilisation de votre EA sur de multiples paires de devises ou cadres temporels.
Votre code n'utilise pas la sélection du "Magic Number" et ne vérifie pas le symbole (ni le "Magic number") utilisé lors de la vérification des ordres ouverts dans l'historique. Donc, en substance, votre EA ne fonctionnera pas correctement, ni avec lui-même ni avec d'autres EA.
En l'état, vous ne pouvez utiliser cet EA que seul, sans aucun autre EA en cours d'exécution, même pas lui-même sur un autre graphique !
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
//---Check Order Type
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
if(OrderType()==OP_SELL)
{
if(fastma > slowma)
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
}
Voici la section OrderClose, je n'obtiens plus l'erreur de ticket invalide, mais j'obtiens maintenant un prix invalide.
Voici ce qui se passe directement dans le journal
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1 : prix invalide 1.05454000 pour la fonction OrderClose
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
...
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
Voici la section OrderClose, je n'obtiens plus l'erreur de ticket invalide, mais j'obtiens maintenant un prix invalide.
Voici ce qui se passe directement dans le journal
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1 : prix invalide 1.05454000 pour la fonction OrderClose
N'utilisez pas Bid/Ask lors de la fermeture, utilisez OrderClosePrice(). Ce sera automatiquement le bon prix.
Dois-je simplement le remplacer dans la fonction OrderClose ? Et si oui, dois-je supprimer le OrderClosePrice dans la fonction d'impression qui se trouve en dessous ?
Modifier :
C'est ce que je viens de faire, mais maintenant il ne maintient aucune position ouverte. Il se contente d'ouvrir et de fermer des positions, bien qu'il n'y ait maintenant aucun problème à travailler sur plusieurs paires.
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
Il n'y a pas de besoin pour les retours ou la pause car vous devez compléter la boucle.
De plus, votre impression d'erreur dépend de
if(fastma < slowma)
est fausse, et n'est pas liée à l'échec de la fonction OrderClose().
if(OrderType()==OP_BUY)
{
if(fastma<slowma)
{
if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
Print("Order Closed : ",OrderClosePrice());
else
Print("Error : ",GetLastError())
}
}