Comment coder ? - page 284

 

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]

int nstarthour,nendhour,nfridayhour;

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.

 
Beno:
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.

 
Kalenzo:
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 lotSize = NormalizeDouble(Kellylot(),2);

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

 
Beno:
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 lotSize = NormalizeDouble(Kellylot(),2);

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

Probablement 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).

 
cmfxtrader:
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.

//---- buy conditions

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);

}
 

,,,,,,,,,,,,,.,,,,,,,,,

Dossiers :
test_ea.txt  10 kb
aizig.ex4  10 kb