Comment coder ? - page 287

 

...

Jetez un coup d'oeil à ce post : https://www.mql5.com/en/forum/174385/page12

Il s'agissait d'un problème similaire et vous pouvez utiliser la même fonction countOpenedOnACurrentBar

pour limiter l'ouverture d'un seul trade par crossover.

dipu:
Bonjour mes amis, je suis un nouveau venu. J'ai une stratégie simple. Je ne fais que du scalping lorsque les EMA se croisent. Je ne prends qu'un seul trade à chaque croisement. J'ai besoin d'un code qui puisse prendre un seul trade à chaque croisement d'EMA. S'il vous plaît......
 

Simplement le code de croisement des EMA a besoin de ........

Merci beaucoup, MLADEN...

Je viens de vérifier votre fonction. Elle semble bonne. J'ai aussi besoin d'aide. J'ai besoin d'ajouter la valeur RSI(50) avec EMA crossover.... comment je peux.. ?

Paires : GBP/USD & EUR/USD

Timeframe : 15min, 1 heure et plus ;

-------------------------------

ACHAT : EMA 5 Croisement de l'EMA 12 à la hausse, RSI supérieur à 50

VENTE : croisement EMA 5 EMA 12 à la baisse, RSI inférieur à 50

(un seul trade pour chaque croisement d'EMA)

J'attends une réponse. S'il vous plaît.......

 

Vous pouvez le faire de plusieurs façons.

L'une d'elles (directement dans l'EA) pourrait être quelque chose comme ceci :

double macdc = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,0)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,0);

double macdp = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,1)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,1);

double rsi = iRSI(NULL,0,RsiPeriod,RsiPrice,0);

if (macdc*macdp<0) // change of sign, signal for a new order

{

if (macdc>0 && rsi>50) ... code for buy

if (macdc<0 && rsi<50) ... code for sell

}

[/PHP]

The good thing about it is that it is small (the code) and does not take any significant process time. The bad thing when using conditions like that in an EA is that you have to imagine (and test, test, test ...) what is it going to perform like. I prefer making a "binary" indicator with which the it is very easy to visually inspect if the condition has any logic in it and if it is going to be profitable or not and then call that indicator (using iCustom()) from the EA.

Here is how would the indicator with the above conditions look like in "binary" form :

Vous avez toutes les informations nécessaires : la ligne grise est la "tendance". Les lignes verte et rouge peuvent être utilisées comme points d'entrée et de retour. Vous pouvez l'"optimiser" visuellement en un instant, puis utiliser ces paramètres dans l'EA (une "optimisation" visuelle beaucoup plus rapide que le pénible "changer les paramètres, l'exécuter, voir ce que vous obtenez et puis la même chose encore et encore". Et il est assez facile de l'appeler depuis l'EA. Cela se passe comme ceci :

[PHP] double trendc = iCustom(NULL,0, "ema + rsi binaire",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0) ;

double trendp = iCustom(NULL,0, "ema + rsi binaire",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1) ;

si (trendc!=trendp)

{

si (trendc== 1) ... signal d'achat

si (trendc==-1) ... signal de vente

}

Donc, dans l'ensemble, je recommande toujours d'utiliser un indicateur à partir d'un Ea. Vous pouvez même changer la logique de l'EA sans y toucher, juste en modifiant et en affinant le code de vos indicateurs, auquel cas l'EA est "juste" un cadre pour les ordres et la gestion de l'argent (puisque les signaux proviennent de l'indicateur), ce qui, à mon avis, est la manière la plus efficace d'utiliser les EA. Joindre l'indicateur aussi, pour que vous décidiez quelle méthode (la méthode directe ou la méthode "par indicateur") vous voulez utiliser dans votre EA.

PS : dans les exemples ci-dessus, les tests sont effectués sur la barre courante (encore ouverte). Si vous voulez tester une barre fermée, remplacez les 0 et 1 par 1 et to dans les appels à iCustom(), iMa() et iRSI().

dipu:
Merci beaucoup, MLADEN...

Je viens de vérifier votre fonction. Elle semble bonne. J'ai aussi besoin d'aide. J'ai besoin d'ajouter la valeur RSI(50) avec le croisement EMA.... comment je peux.. ?

Paires : GBP/USD & EUR/USD

Timeframe : 15min, 1 heure et plus ;

-------------------------------

ACHAT : EMA 5 Croisement de l'EMA 12 à la hausse, RSI supérieur à 50

VENTE : croisement de l'EMA 5 et de l'EMA 12 à la baisse, RSI inférieur à 50

(un seul trade pour chaque croisement d'EMA)

J'attends une réponse. S'il vous plaît.......
Dossiers :
 

Solde du 1er du mois ?

Bonjour, je suis assis ici et je cherche à savoir s'il existe un moyen d'extraire le solde de départ du 1er du mois pour l'afficher à l'écran.

Ce que j'essaie de faire, c'est d'obtenir la différence en pourcentage entre le solde du 1er et le solde actuel.

J'ai la différence globale en pourcentage.

(Solde - Dépôt)/Dépôt*100

Je voudrais ajouter une différence mensuelle.

(Solde - 1er)/1er*100

N'importe quel conseil, astuce ou code réel serait le bienvenu.

Merci

Beno

 

Merci encore, MALADEN...

Merci pour votre indicateur et vos conseils. J'ai essayé de suivre vos instructions. Mais comme je ne suis pas habile sur mq4, je n'ai pas réussi à le faire.................

ICI EST MON..............

------------------------------------

-----------------------------------

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 LimeGreen

#property indicator_color2 PaleVioletRed

#property indicateur_color3 DarkGray

#property indicator_width1 2

#property indicator_width2 2

#property indicator_minimum -1.1

#property indicator_maximum +1.1

extern int EmaFast = 5 ;

extern int EmaSlow = 12 ;

extern int EmaPrice = PRICE_CLOSE ;

extern int RsiPeriod = 14 ;

extern int RsiPrice = PRICE_CLOSE ;

double signup[] ;

double signdn[] ;

double trend[] ;

extern double TakeProfit=15.0 ;

extern double Lots=0.1 ;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

retour(0) ;

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int count,counted_bars=IndicatorCounted() ;

si (barres comptées < 0) retour (-1) ;

if(counted_bars>0) counted_bars-- ;

int limit = MathMin(Bars-counted_bars,Bars-1) ;

int cnt, ticket, total ;

double trendc = iCustom(NULL,0, "ema + rsi binaire",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0) ;

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1) ;

si (trendc!=trendp)

total = OrdersTotal() ;

si(total < 1)

{

if (trendc== 1) //... signal d'achat

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green) ;

si(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;

return(0) ;

}

if (trendc==-1) //... signal de vente

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red) ;

si(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre VENTE : ",GetLastError()) ;

return(0) ;

}

}

return(0) ;

}

---------------------------------------

---------------------------------------

J'ai besoin de votre aide....

Je me suis excusé auprès de toi si je t'ai semblé plus préoccupé que tu ne l'es. Mais je suis vraiment impuissant...

J'attends une réponse. S'il vous plaît.......

 

...

Essayez d'utiliser quelque chose comme ceci :

double balanceAtStartOfMonth(int forMonth)

{

double current = AccountBalance();

datetime startTime = iTime(NULL,PERIOD_MN1,forMonth);

//

//

//

//

//

for (int k=OrdersHistoryTotal()-1; k>=0; k--)

{

if (!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;

if (OrderCloseTime()<startTime) continue;

current -= (OrderProfit()+OrderSwap());

}

return(current);

}

forMonth est le mois en arrière pour lequel vous souhaitez voir le solde 0 étant le mois en cours. La fonction calcule alors quel était le solde le premier jour du mois requis. La fonction prendra en compte les dépôts et les retraits également (OrderType() == 6) donc cela devrait fonctionner correctement.

Beno:
Bonjour, Je suis assis ici à essayer de comprendre s'il existe un moyen d'extraire le solde de départ pour le 1er du mois pour un affichage à l'écran.

Ce que j'essaie de faire, c'est d'obtenir la différence en pourcentage entre le solde du 1er jour et le solde actuel.

J'ai la différence globale en pourcentage.

(Solde - Dépôt)/Dépôt*100

Je voudrais ajouter une différence mensuelle.

(Solde - 1er)/1er*100

N'importe quel conseil, astuce ou code réel serait le bienvenu.

Salutations

Beno
 

...

Vous ne pouvez pas gérer les ordres depuis un indicateur. Vous pouvez gérer les ordres uniquement à partir de scripts ou d'EAs (ce qui est le cas que vous recherchez). Le code de votre post est un indicateur.

Les exemples que j'ai postés sont à utiliser à partir d'un EA (d'après ce que j'ai compris, vous avez déjà un EA dans lequel vous voulez limiter le nombre d'ordres et souhaitez tester les conditions ema et rsi pour les entrées).

dipu:
Merci encore, MALADEN...

Merci pour votre indicateur et vos conseils. J'essaie de suivre vos instructions. Mais comme je ne suis pas habile sur mq4, je n'ai pas réussi à le faire.................

ICI EST MON..............

------------------------------------

-----------------------------------

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 LimeGreen

#property indicator_color2 PaleVioletRed

#property indicateur_color3 DarkGray

#property indicator_width1 2

#property indicator_width2 2

#property indicator_minimum -1.1

#property indicator_maximum +1.1

extern int EmaFast = 5 ;

extern int EmaSlow = 12 ;

extern int EmaPrice = PRICE_CLOSE ;

extern int RsiPeriod = 14 ;

extern int RsiPrice = PRICE_CLOSE ;

double signup[] ;

double signdn[] ;

double trend[] ;

extern double TakeProfit=15.0 ;

extern double Lots=0.1 ;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

retour(0) ;

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int count,counted_bars=IndicatorCounted() ;

si (barres comptées < 0) retour (-1) ;

if(counted_bars>0) counted_bars-- ;

int limit = MathMin(Bars-counted_bars,Bars-1) ;

int cnt, ticket, total ;

double trendc = iCustom(NULL,0, "ema + rsi binaire",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0) ;

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1) ;

si (trendc!=trendp)

total = OrdersTotal() ;

si(total < 1)

{

if (trendc== 1) //... signal d'achat

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green) ;

si(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;

return(0) ;

}

if (trendc==-1) //... signal de vente

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red) ;

si(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre de vente ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre VENTE : ",GetLastError()) ;

return(0) ;

}

}

return(0) ;

}

---------------------------------------

---------------------------------------

J'ai besoin de votre aide....

Je me suis excusé auprès de toi si je t'ai semblé plus préoccupé que tu ne l'es. Mais je suis vraiment impuissant...

J'attends une réponse. S'il vous plaît.......
 

Merci pour la réponse, MLADEN,

Désolé, je pense que vous m'avez dit de mettre ce code dans un nouvel EA.

Je n'ai pas compris votre réponse....

OUI. Vous avez raison....

J'ai une EA et je voulais la modifier. Avec de nouvelles conditions.......

ma condition est :

------------------------------------------------------

ACHAT : EMA 5 croise EMA 12 à la hausse, RSI supérieur à 50

VENTE : EMA 5 croise EMA 12 à la baisse, RSI inférieur à 50

Sortie : avec un petit Take-Profit

(un seul trade pour chaque croisement d'EMA)

Voici mon EA.....

---------------------

---------------------

extern double Lots=0.1 ;

extern int TakeProfit=5 ;

extern int StopLoss=5 ;

extern int RSIPos=50 ;

extern int RSINeg=50 ;

extern int Slippage=2 ;

extern int abandon=101 ;

datetime bartime=0 ;

int bartick=0 ;

double p ;

int cnt=0 ;

int OrdersPerSymbol=0 ;

double bullMA3=0 ;

double bearMA7=0 ;

double RSI=0 ;

bool RSIPOS=0 ;

bool RSINEG=0 ;

double TP ;

double SL ;

int init()

{

if (Symbol()=="AUDUSD") {TakeProfit= 60 ; StopLoss= 23 ; abandon=103;}

if (Symbol()=="EURAUD") {TakeProfit= 95 ; StopLoss=141 ; abandon=33;}

si (Symbol()=="EURCHF") {TakeProfit= 81 ; StopLoss= 77 ; abandon=97;}

si (Symbol()=="EURGBP") {TakeProfit= 11 ; StopLoss= 77 ; abandon=108;}

si (Symbol()=="EURJPY") {TakeProfit= 38 ; StopLoss= 75 ; abandon=183;}

si (Symbol()=="EURUSD") {TakeProfit=35 ; StopLoss= 35 ; abandon=5;}

si (Symbol()=="GBPCHF") {TakeProfit= 79 ; StopLoss= 98 ; abandon=113;}

if (Symbol()=="GBPJPY") {TakeProfit= 13 ; StopLoss= 98 ; abandon=117;}

si (Symbol()=="GBPUSD") {TakeProfit= 55 ; StopLoss=100 ; abandon=69;}

if (Symbol()=="USDCAD") {TakeProfit= 66 ; StopLoss= 76 ; abandon=106;}

si (Symbol()=="USDCHF") {TakeProfit=117 ; StopLoss= 78 ; abandon=111;}

if (Symbol()=="USDJPY") {TakeProfit= 53 ; StopLoss= 74 ; abandon=110;}

}

int deinit()

{

}

int start()

{

p=Point ;

// Vérification des erreurs et comptage des barres

if(AccountFreeMargin()<(200*Lots)) {Print("-----NO MONEY") ; return(0);}

if(Bars<100) {Print("-----NO BARS ") ; return(0);}

if(bartime!=Time[0]) {bartime=Time[0] ; bartick++;}

bullMA3=iMA(Symbol(),0,3,0,MODE_EMA,PRICE_CLOSE,1) ;

bearMA7=iMA(Symbol(),0,7,0,MODE_EMA,PRICE_CLOSE,1) ;

RSI=iRSI(Symbol(),0,2,PRICE_CLOSE,2) ;

if(RSI>RSIPos) {RSIPOS=true ; RSINEG=false;}

if(RSI<RSINeg) {RSIPOS=false ; RSINEG=true;}

OrdersPerSymbol=0 ;

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;

if( OrderSymbol()==Symbol() )

{

OrdersPerSymbol++ ;

}

}

si(OrdersPerSymbol==0)

{

if(bullMA3>(bearMA7+p) && RSINEG)

{

SL=Ask-(StopLoss*p) ;

TP=Ask+(TakeProfit*p) ;

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White) ;

bartick=0 ;

}

if(bullMA3<(bearMA7-p) && RSIPOS)

{

SL=Bid+(StopLoss*p) ;

TP=Bid-(TakeProfit*p) ;

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red) ;

bartick=0 ;

}

}

if(OrdersPerSymbol==1 && bartick==abandon)

{

si(OrderType()==OP_BUY)

{

OrderClose(OrderTicket(),Lots,Bid,Slippage,White) ;

SL=Bid+(StopLoss*p) ;

TP=Bid-(TakeProfit*p) ;

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red) ;

bartick++ ;

}

si(OrderType()==OP_SELL))

{

OrderClose(OrderTicket(),Lots,Ask,Slippage,Red) ;

SL=Ask-(StopLoss*p) ;

TP=Ask+(TakeProfit*p) ;

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White) ;

bartick++ ;

}

}

for(cnt=0;cnt<OrdersTotal();cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;

if( OrderSymbol()==Symbol() )

{

si(OrderType()==OP_BUY))

{

si (OrderMagicNumber()==0)

{

if( Bid-OrderOpenPrice() > 3*Point )

{

OrderClose(OrderTicket(),Lots,Bid,0,White) ;

retour(0) ;

}

}

}

si(OrderType()==OP_SELL))

{

si (OrderMagicNumber()==0)

{

si( OrderOpenPrice()-Ask > (3*Point) )

{

OrderClose(OrderTicket(),Lots,Ask,0,Red) ;

retour(0) ;

}

}

}

}

}

return(0) ;

}

-------------------

---------------------

Comment puis-je le modifier.... ? J'attends une réponse. S'il vous plaît.......

 

dipu

En ce qui concerne les entrées, celui-ci fonctionne bien.

Maintenant, il faut s'occuper des sorties puisque de la façon dont vous l'avez écrit, vous fermez les ordres trop tôt. Le courtier à 5 chiffres est également pris en charge maintenant, et les entrées fonctionnent comme elles le devraient. La période par défaut pour le rsi est fixée à 14 (je ne sais pas laquelle vous voulez utiliser, dans le code vous utilisez la période 2 mais c'est probablement trop court). Les périodes Ema sont par défaut 5 et 12. Aussi, il teste une barre fermée maintenant (il attend jusqu'à ce que la barre se ferme et si le signal d'achat ou de vente existe, il entre l'ordre).

Dossiers :
dipu.mq4  5 kb
 

Merci de votre réponse, MLADEN,

désolé de ne pas avoir donné d'informations claires.......

ACHAT : EMA 5 Croisement EMA 12 à la hausse, RSI[14] supérieur à 50

VENTE : EMA 5 croisement de l'EMA 12 à la baisse, RSI[14] inférieur à 50

Sortie : avec un petit TP/Sl....(5pip)

(un seul trade pour chaque croisement d'EMA)

Je viens de l'essayer et je vous informerai du résultat.....

Peut-il aussi modifier... ou pas...

Merci encore pour votre aide.....