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
J'ai trouvé une solution pour le filtre temporel "Close All".
Variables externes
extern string timefilter="Time Filter";
extern int gmtshift=1; // gmt offset of the broker
extern bool generalfilter=false; // enable time filter
extern int starthour=7; // start hour to trade after this hour
extern int startminutes=0; // minutes of the start hour
extern int endhour=21; // stop to trade after this hour
extern int endminutes=0; // minutes of the start hour
extern bool tradesunday=true; // trade on sunday
extern bool fridayfilter=false; // enable special time filter on friday
extern int fridayhour=21; // stop to trade after this hour
extern int fridayminutes=0; // minutes of the friday hour
[/CODE]
string istarthour,istartminutes,iendhour,iendminutes,ifridayhour,ifridayminutes;
datetime tstart,tend,tfriday;[/CODE]
Place Code in Start,
[CODE] if(generalfilter){
nstarthour=starthour+(gmtshift);if(nstarthour>23)nstarthour=nstarthour-24;
if(nstarthour<10)istarthour="0"+nstarthour;
if(nstarthour>9)istarthour=nstarthour;
if(startminutes<10)istartminutes="0"+startminutes;
if(startminutes>9)istartminutes=startminutes;
tstart=StrToTime(istarthour+":"+istartminutes);
nendhour=endhour+(gmtshift);if(nendhour>23)nendhour=nendhour-24;
if(endhour<10)iendhour="0"+nendhour;
if(endhour>9)iendhour=nendhour;
if(endminutes<10)iendminutes="0"+endminutes;
if(endminutes>9)iendminutes=endminutes;
tend=StrToTime(iendhour+":"+iendminutes);
}
if(fridayfilter){
nfridayhour=fridayhour+(gmtshift);if(nfridayhour>23)nfridayhour=nfridayhour-24;
if(nfridayhour<10)ifridayhour="0"+nfridayhour;
if(nfridayhour>9)ifridayhour=nfridayhour;
if(fridayminutes<10)ifridayminutes="0"+fridayminutes;
if(fridayminutes>9)ifridayminutes=fridayminutes;
tfriday=StrToTime(ifridayhour+":"+ifridayminutes);
}
if((generalfilter && (nstarthour<nendhour && TimeCurrent()tend) || (nstarthour>nendhour && TimeCurrent()tend))
|| (tradesunday==false && DayOfWeek()==0) || (fridayfilter && DayOfWeek()==5 && TimeCurrent()>tfriday))
{
CloseAll();
Comment("Non-trading Hours All Positions Closed");
return(0);
}and the CloseAll function.
[CODE]
void CloseAll(){
int total = OrdersTotal();
for(int i=total-1;i>=0;i--){
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
bool result = false;
switch(type){
//Close opened long positions
case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Lime); break;
//Close opened short positions
case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, LightGreen );
} if(result == false){
Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
Sleep(3000);
}
}
return(0);
}
Merci pour les conseils et astuces Kalenzo
StopLoss
Bonjour
J'ai tenté une expérience pour calculer un SL basé sur la tickvalue, un max dd et un pourcentage par transaction.
double lotSize = NormalizeDouble(Kellylot(),2);
double Pip = Point;
if(Digits==3 || Digits==5) Pip = 10*Point;
double Bal = AccountBalance(); // $1000
double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1
double Risk = 2; // 2%
double MaxDD = 10; // 10%
double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100
double RPT = Bal*Risk/100; // 2% of $1000 = $20
double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000
double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20
L'idée est qu'en fonction de la paire, de la valeur de tick individuelle de la paire et de la taille du lot, le SL de 2% peut être défini.
Je pense que c'est correct mais j'aimerais que quelqu'un le vérifie si possible.
Bonne journée
J'ai tenté une expérience pour calculer un SL basé sur la tickvalue, un max dd et un pourcentage par transaction.
double lotSize = NormalizeDouble(Kellylot(),2);
double Pip = Point;
if(Digits==3 || Digits==5) Pip = 10*Point;
double Bal = AccountBalance(); // $1000
double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1
double Risk = 2; // 2%
double MaxDD = 10; // 10%
double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100
double RPT = Bal*Risk/100; // 2% of $1000 = $20
double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000
double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20
L'idée est qu'en fonction de la paire, de la valeur de tick individuelle de la paire et de la taille du lot, le SL de 2% peut être défini.
Je pense que c'est correct mais j'aimerais que quelqu'un le vérifie si possible.Bon travail Beno,
Il est toujours mieux de donner une canne à pêche que du poisson. Je suis très heureux d'avoir pu vous aider avec quelques commentaires.
En ce qui concerne le stop loss, l'idée est bonne, mais essayez aussi de le considérer de manière inverse :
d'abord fixer le stop loss
Dans un deuxième temps, fixez la taille de la transaction.
De cette façon, vous adapterez l'entrée/sortie du système aux conditions du marché, et vous ne risquerez pas plus de X% de votre compte, mais la sortie dépendra de la logique du système plutôt que du pourcentage de risque.
Bon travail Beno,
Il est toujours préférable de donner une canne à pêche plutôt qu'un poisson. Je suis très heureux d'avoir pu vous aider avec quelques commentaires.
En ce qui concerne le stop loss, l'idée est bonne, mais essayez aussi de le considérer de manière inverse :
d'abord fixer le stop loss
Ensuite, fixez la taille de la transaction.
De cette façon, vous adapterez l'entrée/sortie du système aux conditions du marché, et ne risquerez pas plus de X% de votre compte, mais la sortie dépendra de la logique du système plutôt que du pourcentage de risque.Bonjour Kalenzo
J'obtiens une erreur d'ouverture d'ordre de vente ( Error opening SELL order: invalid stops) avec l'EA sur le compte démo et le compte réel et aucune transaction ne s'ouvre. Mais il fonctionne bien sur le testeur et n'a aucun message d'erreur.
EURUSD,Daily : modify #1 buy 0.01 EURUSD at 1.43348 sl : 1.43895 tp : 0.00000 ok
Le SL a une différence de 0.00547 points
J'ai vérifié le
MODE_FREEZELEVEL 0.0000
MODE_STOPLEVEL 0.0000
double Bal = AccountFreeMargin();
double TV = MarketInfo(Symbol(), MODE_TICKVALUE);
double Risk = 0.3;
double MaxDD = 10;
double RiskCapital = Bal*MaxDD/100;
double RPT = Bal*Risk/100;
double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);
double Positions = MathAbs(RiskCapital/RPT);
double SL;
//---- sell conditions
if(sellsig && ttime!=Time[0]){
double bid = NormalizeDouble(Bid, Digits);
SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);
res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);
if( res<0 )
{
Print("Error opening SELL order : ",ErrorDescription(GetLastError()));
Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));
res=0;
}
else //now enter in the SL and TP via OrderModify to make compatible with ECN broker
{
if (OrderSelect(res, SELECT_BY_TICKET))
{
if (!OrderModify(res, Bid, SL, 0, 0, Red))
Print("Error modifying order");
}
}
ttime=Time[0];
return;
}
//---- buy conditions
if(buysig && ttime!=Time[0]) {
double ask = NormalizeDouble(Ask, Digits);
SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);
res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);
if( res<0 )
{
Print("Error opening BUY order : ",ErrorDescription(GetLastError()));
Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));
res=0;
}
else //now enter in the SL and TP via OrderModify to make compatible with ECN broker
{
if (OrderSelect(res, SELECT_BY_TICKET))
{
if (!OrderModify(res, Ask, SL, 0, 0, Blue))
Print("Error modifying order");
}
}
ttime=Time[0];
return;
}
}Je n'ai jamais rencontré ce problème auparavant.
Merci
Beno
Fonction de verrouillage/déverrouillage
Existe-t-il un moyen de coder une fonction de verrouillage/déverrouillage dans mq4. Vous pourriez verrouiller un bit vrai en fonction d'une condition et il stockerait cette valeur jusqu'à ce qu'il soit déverrouillé par une autre condition.
cmfxtrader
Bonjour Kalenzo
Je reçois un message d'erreur "Error opening SELL order : invalid stops" avec l'EA sur le compte démo et le compte réel et aucune transaction ne s'ouvre. Mais il fonctionne bien sur le testeur et n'a aucun message d'erreur.
EURUSD,Daily : modify #1 buy 0.01 EURUSD at 1.43348 sl : 1.43895 tp : 0.00000 ok
Le SL a une différence de 0.00547 points
J'ai vérifié le
MODE_FREEZELEVEL 0.0000
MODE_STOPLEVEL 0.0000
double Bal = AccountFreeMargin();
double TV = MarketInfo(Symbol(), MODE_TICKVALUE);
double Risk = 0.3;
double MaxDD = 10;
double RiskCapital = Bal*MaxDD/100;
double RPT = Bal*Risk/100;
double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);
double Positions = MathAbs(RiskCapital/RPT);
double SL;
//---- sell conditions
if(sellsig && ttime!=Time[0]){
double bid = NormalizeDouble(Bid, Digits);
SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);
res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);
if( res<0 )
{
Print("Error opening SELL order : ",ErrorDescription(GetLastError()));
Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));
res=0;
}
else //now enter in the SL and TP via OrderModify to make compatible with ECN broker
{
if (OrderSelect(res, SELECT_BY_TICKET))
{
if (!OrderModify(res, Bid, SL, 0, 0, Red))
Print("Error modifying order");
}
}
ttime=Time[0];
return;
}
//---- buy conditions
if(buysig && ttime!=Time[0]) {
double ask = NormalizeDouble(Ask, Digits);
SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);
res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);
if( res<0 )
{
Print("Error opening BUY order : ",ErrorDescription(GetLastError()));
Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));
res=0;
}
else //now enter in the SL and TP via OrderModify to make compatible with ECN broker
{
if (OrderSelect(res, SELECT_BY_TICKET))
{
if (!OrderModify(res, Ask, SL, 0, 0, Blue))
Print("Error modifying order");
}
}
ttime=Time[0];
return;
}
}Je n'ai jamais rencontré ce problème auparavant.
Merci
BenoProbablement que votre stop loss est trop proche. Essayez de multiplier la valeur du stop loss par 10. C'est un problème fréquent lorsque vous testez le système sur un courtier à 4 chiffres, et que vous le tradez sur un courtier à 5 chiffres. Vous pouvez également le tester sur un courtier à 5 chiffres, mais sans jamais vous connecter au courtier (en mode hors ligne) et alors metatrader aura les anciens paramètres (de 4 chiffres).
D'abord à partir de cette ligne :
NormalizeDouble(Ask - stopLoss * pips2dbl, Digits) ;
Imprimez cette valeur => stopLoss*pips2dbl
alors vous connaîtrez la valeur réelle du stop loss.
Si la valeur est de 20 ou 10, cela signifie que vous devez la multiplier par la valeur du point.
NormalizeDouble(Ask - (stopLoss * pips2dbl) *Point, Digits) ;
si la valeur est de 0.00009, vous devez la multiplier par 10 car elle devrait être de 0.0009 (bien sûr si vous souhaitez définir un stop loss de 9 pips).
Existe-t-il un moyen de coder une fonction de verrouillage/déverrouillage dans mq4. Vous verrouilleriez un bit vrai en fonction d'une condition et il stockerait cette valeur jusqu'à ce qu'il soit déverrouillé par une autre condition. cmfxtrader
Je ne suis pas sûr d'avoir bien compris. Vous souhaitez activer/désactiver une partie spécifique de l'ea(fonction) ou vous souhaitez désactiver la fonction de l'ea A par l'action prise dans l'ea B ? D'une manière ou d'une autre, les deux sont possibles.
Convertir une valeur monétaire en prix (pour le calcul de l'objectif de profit)
Je voudrais programmer une fonction qui renvoie une valeur de prix pour un objectif de profit donné d'un panier de transactions, mais j'ai des difficultés. L'objectif que je voudrais atteindre est une simple ligne horizontale à tracer à l'écran qui indique l'objectif de profit. Cependant, l'objectif de profit est une variable définissable par l'utilisateur sous la forme d'une valeur monétaire et non d'une valeur de prix. (par exemple, cible = 100 € au lieu de cible = 1.2000).
La routine que j'ai jusqu'à présent :
(Mon compte est en EUR !)
1) Disons que j'ouvre plusieurs positions d'achat pour l'USDJPY (à des positions aléatoires afin de créer une situation d'exemple).
2) Je calcule le prix moyen d'ouverture du panier (disons 1.1500, encore une fois hypothétiquement) et affiche une ligne horizontale pour l'indiquer
3) J'ai une variable avec un objectif de profit défini : disons que l'objectif = 100 €.
4) Je peux fermer avec succès toutes les positions ouvertes lorsque le profit du panier >= l'objectif.
L'étape intermédiaire est manquante. J'ai besoin d'une fonction : double targetPrice(){} qui renvoie le prix cible. Le tracé de la ligne horizontale n'est pas le problème : le calcul du prix cible l'est !
Le prix cible = prix ouvert moyen + valeur monétaire cible (100 €).
Ce que j'aimerais savoir, c'est comment convertir une valeur monétaire en pips. De cette façon, je peux ajouter les pips au prix moyen et voilà, j'ai mon prix cible. N'oubliez pas que je dois également prendre en compte le fait que j'ai un compte en EUR et que je négocie en USDJPY. Je suppose qu'il y a là aussi des pièges ?
ECN SL ne fonctionne pas
Bonjour
J'essaie de mettre en place un EA qui fonctionnera sur un ECN, je comprends que le SL et le TP doivent être placés / modifiés et je pense que la mise en place est correcte, l'ordre s'ouvre maintenant mais le SL n'est pas placé extern double StopLoss = 100 ; toute aide serait grande.
if(buysig && ttime!=Time[0]) {
ticket = OrderSend(Symbol(), OP_BUY, lotSize, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);
if(ticket > -1){
if (!OrderSelect(ticket, SELECT_BY_TICKET)) {
error_code = GetLastError();
Print("Error: " + ErrorDescription(error_code));
return(-1);
}
Print("order "+ticket+" successfully opened");
//now enter in the SL and TP via OrderModify to make compatible with ECN broker
SL = MarketInfo(Symbol(), MODE_ASK) - (StopLoss * pips2points);
Print("Ask = " + DoubleToStr(Ask,Digits) + " : SL = " + DoubleToStr(SL,Digits));
//round to nearest Tickvalue
SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKSIZE));
Print("SL rounded: " + SL);
if(!OrderModify(ticket, entry_price, SL, 0, Blue)) {
error_code = GetLastError();
Print("Error: " + ErrorDescription(error_code));
return(-1);
}
Print("Stoploss successfully set");
ttime=Time[0];
return(0);
}
}
}
//Tickvalue Rounding
double DoubleRound(double number, double step){
double mod = MathMod(number, step);
if(mod < step/2.0)
step = 0;
double rounded = number - mod + step;
return (rounded);
},,,,,,,,,,,,,.,,,,,,,,,