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
Regardez ce fil de discussion : https://www.mql5.com/en/forum/178677
Regardez ce fil : https://www.mql5.com/en/forum/178677
Merci beaucoup pour les instructions d'ouverture du fichier et le lien de téléchargement.
10points3
S'IL VOUS PLAÎT, PROGRAMMEURS !
Nous avons besoin dans 10points3 EA, que lorsque le troisième trade s'ouvre, le premier se ferme, j'essaie mais il ferme toujours toutes les positions.
En fait, nous avons :
if (PreviousOpenOrders>OpenOrders)
{
for(cnt=OrdersTotal();cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;
mode=OrderType() ;
if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{
if (mode==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Blue) ; }
si (mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Red) ; }
return(0) ;
}
Je pensais faire ceci
1. changer le numéro magique pour le premier trade lorsque le second s'ouvre, par exemple magicnumber+1
2. lorsque le troisième trade s'ouvre, fermer le premier, avec le magicnumber+1 assigné.
Ai-je raison ?
ou quelle autre façon puis-je identifier le premier trade ouvert pour le fermer plus tard ?
Si vous pouvez me guider ou faire les changements, c'est mieux parce que je ne suis pas un programmeur, je suis juste en train d'apprendre.
Ce changement serait le début du Saint Graal!!!
10points3
Désolé, l'EA.
Et c'est dans ce fil :
https://www.mql5.com/en/forum/174975
Merci !
aide à la programmation - opérateur de retour
Bonjour
je suis débutant en programmation mt4 et maintenant j'essaie souvent de trouver une solution pour engager les variables d'une fonction void au programme principal "start()".
ci-dessous vous pouvez voir un exemple et la question est , comment puis-je commettre la valeur de variable "CountOpenSell", "CountOpenBuy", "ProfitSell " et "ProfitBuy" au start() - mainprogram.........
J'ai ajouté ma suggestion (les retours sont en caractères gras) mais je ne sais pas si elle est correcte et quel est le bon code pour le programme principal "start()" ???
Désolé pour mon mauvais anglais et pour toute aide
merci beaucoup
salutations
forex2006
void CallBuySellProfit()
{ ProfitBuy=0 ;
ProfitSell=0 ;
CountOpenSell=0 ;
CountOpenBuy=0 ;
for (i=OrdersTotal()-1;i>=0;i--)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderType()==OP_SELL) {ProfitSell = ProfitSell + OrderProfit();CountOpenSell++;}
si (OrderType()==OP_BUY) {ProfitBuy = ProfitBuy + OrderProfit();CountOpenBuy++;}
}
else Print( "Erreur lors de la sélection de l'ordre ", GetLastError()) ;
}
return(CountOpenSell) ;
return(CountOpenBuy) ;
return(ProfitSell) ;
return(ProfitBuy) ;
}
aide à la programmation forex2006 - opérateur de retour
Salut forex2006,
Si vous voulez vraiment apprendre le mql, je vous suggère d'essayer les tutoriels de codersguru, c'est là que j'ai commencé. Pour répondre à votre question, une fonction void ne peut pas retourner une valeur, si vous voulez obtenir des valeurs à partir de fonctions void, vous devez utiliser des variables globales. La meilleure façon d'obtenir les valeurs est d'utiliser une fonction qui renvoie une valeur utilisée avec des paramètres pour indiquer les valeurs que vous voulez. Vous trouverez un exemple simple ci-dessous. Essayez d'éviter d'utiliser des variables globales dans les fonctions, car cela pourrait vous rendre la tâche difficile par la suite.
J'espère que cela vous aidera
int start()
{
double ProfitBuy = CallBuySellProfit(OP_BUY,false) ;
double ProfitSell = CallBuySellProfit(OP_SELL,false) ;
int CountOpenBuy = CallBuySellProfit(OP_BUY,true) ;
int CountOpenSell = CallBuySellProfit(OP_SELL,true) ;
Comment( "ProfitBuy : "+DoubleToStr(ProfitBuy,2) +"\n "+
"ProfitSell : "+DoubleToStr(ProfitSell,2) +"\n "+
"CountOpenBuy : "+DoubleToStr(CountOpenBuy,2)+"\n "+
"CountOpenSell : "+DoubleToStr(CountOpenSell,2)+"\n "+
"") ;
retour ;
}
double CallBuySellProfit(int iOrderType, bool bCount)
{
double dProfit = 0 ;
int iCount = 0 ;
for (int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
si(OrderType()==iOrderType))
{
dProfit = dProfit + OrderProfit() ;
iCount++ ;
}
}
sinon
{
Print( "Erreur lors de la sélection de la commande ", GetLastError()) ;
}
}//fin pour
if(bCount)return(iCount) ;
sinon return(dProfit) ;
}//end CallBuySellProfit
Arrêter les transactions de l'EA sur la même barre
Bonjour, est-il possible de mettre un code pour que l'EA vérifie si des transactions ont déjà été effectuées sur cette barre puis de ne plus effectuer de transactions jusqu'à une nouvelle barre ?
Merci
matrixebiz, avez-vous envisagé la possibilité qu'un trade s'ouvre et se ferme dans la même bougie avant que celle-ci ne soit fermée ? vous devriez probablement vérifier la liste des historiques également.
J'ai toujours porté cette petite fonction que j'ai écrite à tous mes EAs, peut-être la trouverez-vous utile aussi.
bool DecideToOpenTrade()
{
int total = OrdersTotal();
if (total > 0)
{
for(int cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)
{
return (false);
}
}
}
}
// in case trades has already opened and closed within the candle
int histotal = OrdersHistoryTotal();
if (histotal > 0)
{
for(cnt=0;cnt<histotal;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)
{
if (Time[0] <= OrderOpenTime()) // don't open a new position if we're still on the same candle
{
return (false);
}
}
}
}
}
return (true);
}
int start()
{
// some time check codes first.. blah blah
// ...
// ...
// ...
// check signals
if (Should_Buy())
{
if (DecideToOpenTrade())
{
//... trade opening codes here
}
}
if (Should_Sell())
{
if (DecideToOpenTrade())
{
//... trade opening codes here
}
}
}
note : cette fonction suppose que vous avez défini une valeur unique à EA_MAGIC_NUM. De cette façon, la vérification ne regardera pas les transactions ouvertes par d'autres EAs.
Should_Buy() et Should_Sell() sont des fonctions que je crée dans tous mes EAs pour déterminer si un signal d'achat ou de vente s'est produit.
J'espère que cela vous aidera. Envoyez-moi un message si vous avez besoin d'autres éclaircissements.
Salutations,
Zen
poste mis à jour ci-dessous...
Cela semble fonctionner pour moi Merci.
void DesideToOpen()
//----------------------------------------------------------------+
//----------------------------------------------------------------+
{
int total = OrdersTotal();
if (total > 0)
{
for(int cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{
if(OrderComment() == EA_Name + MagicNumber) DecideToOpenTrade = false;
}
}
}
// in case trades has already opened and closed within the candle
int histotal = OrdersHistoryTotal();
if (histotal > 0)
{
for(cnt=0;cnt<histotal;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderComment() == EA_Name + MagicNumber)
{
if (Time[0] <= OrderOpenTime()) DecideToOpenTrade = false; // don't open a new position if we're still on the same candle
}
}
}
}
}