![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Utilisation de fichiers *.set externes
J'ai essayé et essayé mais je n'arrive pas à comprendre. J'espère que quelqu'un pourra voir l'arbre dans la forêt.
Je veux programmer un EA pour qu'il utilise soit ses paramètres programmés, soit un fichier *.set externe.
Donc si :
extern bool UseExternSet = true ;
il utilisera les paramètres du fichier set externe plutôt que les paramètres programmés.
Je sais que c'est possible, mais je suis perdu ici.
N'importe quel exemple fera l'affaire.
Bernard
Problème de compilateur ou problème de code ?
extern int ma1method=1;
extern int ma1tf=0;
extern int ma2period=5;
extern int ma2method=1;
extern int ma2tf=10080;
extern double lots=1;
int init(){}
int deinit(){}
double CMA (int tf,int period, int shift, int method)
{
double MA=iMA(NULL,tf,period,0,method,0,shift)
return(MA)
}
int start()
{
int BarsCount=0;
if (Bars> BarsCount)
{
BarsCount=Bars;
double ma1.1=CMA(ma1tf,ma1period,1,ma1method);
double ma1.2=CMA(ma1tf,ma1period,2,ma1method);
double ma2.1=CMA(ma2tf,ma2period,1,ma2method);
double ma2.2=CMA(ma2tf,ma2period,2,ma2method);
bool ma1upsignal =ma1.2<ma1.1;
bool ma1downsignal =ma1.2>ma1.1;
bool ma2upsignal =ma2.2<ma2.1;
bool ma2downsignal =ma2.2>ma2.1;
if (ma1upsignal&&ma2upsignal)
{
OrderSend(Symbol(),OP_BUY,lots,Ask,3,NULL,NULL,NULL,NULL,0,Green);
}
if (ma1downsignal&&ma2downsignal)
{
OrderSend(Symbol(),OP_SELL,lots,Bid,3,NULL,NULL,NULL,NULL,0,Green);
}
if ((ma1upsignal&&ma2downsignal)||(ma1downsignal&&ma2upsignal))
{
int total=OrdersTotal(); //Script to close all open orders.
for(int i=total-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
switch(type)
{
//Close opened long positions
case OP_BUY : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;
//Close opened short positions
case OP_SELL : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
}
}
}
}
Voici le morceau de code sur lequel je travaille. Le compilateur dit "la variable BarsCount n'est pas définie". Que dois-je faire ? Pour autant que je puisse voir, la variable a été initialisée et a reçu une valeur.
Est-ce un problème de compilateur ou de code ?
[CODE]
double CMA (int tf,int period, int shift, int method)
{
double MA=iMA(NULL,tf,period,0,method,0,shift);
return(MA);
}
[CODE]
double CMA (int tf,int period, int shift, int method)
{
double MA=iMA(NULL,tf,period,0,method,0,shift);
retour(MA);
}Michel,
Merci. Cela a résolu le problème :-)
Compter les barres consécutives
Quelqu'un a t-il un code pour compter les barres d'achat/vente consécutives dans une rangée ? Je veux compter combien de fois sur un graphique (entrez le nombre de barres à vérifier) il y a 1 barre de vente à la suite, 32 barres de vente à la suite, 3 barres de vente à la suite, 4 barres de vente à la suite (comme pour l'achat), etc.
Je sais que je dois faire une boucle, mais je n'arrive pas à trouver comment.
Les résultats peuvent aller dans un Comment().
Merci.
Pourquoi mon programme ne fonctionne-t-il pas ?
J'ai écrit un programme simple.
Il est censé entrer un seul ordre à la fois, et sortir avec un take profit ou un stop loss.
Il est configuré pour M30 sur GBPUSD.
C'est à dire que certaines des constantes du programme sont trouvées par des estimations "à l'œil". Cela ne devrait pas affecter le programme de manière significative... mais il ne fonctionne pas non plus avec des constantes différentes. (Du moins, lorsqu'il est testé avec le Strategy Tester, réglé sur rapide ou moyen : pas sur "tick by tick". (trop lent...)
Quoi qu'il en soit, le programme, lorsqu'il est testé, n'entre pas d'ordre ET ne vérifie jamais dans la direction de la "hausse". (Ceci, via le "print"/trace)
(il est censé vérifier : entrer avec un achat ou entrer avec une vente).
Logique incidente : vérifier 2 barres consécutives. Si la barre 1 a à la fois : un haut plus élevé et un bas plus élevé, le prog pense que la barre suivante sera à la hausse.
(Symétriquement pour la baisse).
Le Take Profit et le Stop Loss sont fixés en conséquence.
Le programme ne fonctionne pas non plus lorsque les instructions "if" sont imbriquées. ....
Merci de l'avoir examiné.
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation experte |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage expert |
//+------------------------------------------------------------------+
int start()
{
//----
bool TrendUp1 ; double TakeProfitUp ; double EE = .00500 ;
bool OrdTot_OK;double lot;double slip ;
double SL_Trailing_Up;bool High2Up;bool Low2Up ;
int ticketup;int ticketdown;bool DownAndBig ; bool UpAndBig ;
bool TrendDown ; double SL_Trailing_Down;double TakeProfitDown ;
bool High2down ; bool Low2down ;
int ABC = OrdersTotal() ;
double Size1 = .00630;bool BigUp ; double A = High[1];double B= Low[2];//41
double C= High[2] ; double D= Low[1];bool BigDown ;
//------------------------------------ début de l'ordre de descente
if (ABC == 0)// aucun ordre de sortie est vrai
OrdTot_OK = true ;
si (ABC == 0)// aucun ordre n'est sorti est vrai
Print ("sur la séquence d'ordre de descente, aucun ordre n'est sorti") ;
if ((C-D) > Size1)//high of 2 less low of 1 > .0063
BigDown = true ;
si ((C-D) > Taille1)//haut de 2 moins bas de 1 > .0063
Print ("on down order sequence, found a big breakout down") ;
si (High[1]< High[2])
High2down=true ;
si (High[1]< High[2])
Print ("sur la séquence d'ordre à la baisse, les barres consécutives ont des hauts décroissants") ;
if(Low[1]< Low[2])
Low2down=true ;
si(Low[1]< Low[2])
Print ("sur la séquence d'ordre descendant, les barres consécutives ont des bas décroissants") ;
if (High2down && Low2down)
TrendDown=true ;
si (High2down && Low2down)
Print ("sur une séquence d'ordre à la baisse, le drapeau TrendDown est activé") ;
if (TrendDown)
SL_Trailing_Down = High[1] ;
si (TrendDown)
Print ("sur la séquence d'ordres à la baisse, le stop_loss est activé") ;
if (TrendDown)
TakeProfitDown = Bid - (.005) ;
si (TrendDown)
Print ("sur la séquence d'ordre à la baisse, a obtenu un takeprofit", TakeProfitDown) ;
si (TrendDown && BigDown)
DownAndBig = true ;
if (DownAndBig && OrdTot_OK)
ticketdown= OrderSend(Symbol(),OP_SELL,lot, Bid,slip,SL_Trailing_Down,TakeProfitDown,Blue) ;
if (DownAndBig && OrdTot_OK)
Print ("on down order sequence, tried to enter a ticket", ticketdown) ;
if (ticketdown < 0)
Print("OrderSend_Down a échoué avec l'erreur #",GetLastError()) ;
return(0) ;
//----------------------------------------------down order done
//---------------------------------------------------up order start
si (ABC == 0)
OrdTot_OK = true ;
si (ABC == 0)
Print ("sur la séquence montante, aucun ordre n'est sorti") ;
si ((A - B) > Taille1)
BigUp = true ;
si ((A - B) > Taille1)
Print ("sur la séquence ascendante, le test de taille pour les deux barres était correct") ;
si (High[1] > High[2])
High2Up = true;//44
si (Haut[1] > Haut[2])
Print ("sur la séquence montante, le test pour les hauts croissants était correct") ;
if(Low[1] > Low[2])
Low2Up=vrai ;
si(Low[1] > Low[2])
Print ("sur la séquence ascendante, le test pour les bas croissants était correct") ;
if (High2Up && Low2Up)
TrendUp1=vrai ;
if (High2Up && Low2Up)
Print ("sur la séquence de hausse, le drapeau de hausse a été activé") ;
si (TrendUp1)
SL_Trailing_Up = Low[1] ;
if (TrendUp1)
Print ("sur la séquence ascendante, a établi le stoploss") ;
if (TrendUp1)
TakeProfitUp = Ask + (.005) ;
si (TrendUp1)
Print ("sur la séquence ascendante, le takeprofit a été établi", TakeProfitUp) ;
if (TrendUp1 && BigUp)
UpAndBig = true ;
if ( UpAndBig && OrdTot_OK)
ticketup = OrderSend(Symbol(), OP_BUY,lot, Ask,slip, SL_Trailing_Up,TakeProfitUp,Red) ;
if (UpAndBig && OrdTot_OK)
Print ("sur la séquence en hausse, a essayé d'envoyer un ordre", ticketup) ;
si (ticketup < 0)
Print("OrderSend_Up failed with error #",GetLastError()) ;
return(0) ;
//-------------------------------------------------up order done
//----
return(0);// pas sûr de cette ligne
//+------------------------------------------------------------------+
//----
return(0) ;
}
//+------------
Nombre minimum de barres avant/après la transaction
Salut,
Bonjour, je suis nouveau sur MT4 . Quelqu'un pourrait-il me dire comment placer une restriction dans un EA qui exige un minimum de "x" barres pour ouvrir une nouvelle position ou fermer une position précédente ?
(sans utiliser la commande sleep)
Merci.
aide au codage mql
si (iMA(NULL, 0, 24, 0, MODE_LWMA, PRICE_WEIGHTED, 1) > iMA(NULL, 0, 120, 1, MODE_LWMA, PRICE_WEIGHTED, 1)) gi_268 = 2 ;
---------------------------------------------------------------
qu'est-ce que cela signifie ?
2 LWMA utilisés ?
LWMA période =24 shift =0 sur prix pondéré (hcll4) cross over LWMA période 120 shift =1 sur prix pondéré (hcll4) alors acheter ou vendre ? ??
Problème de fermeture de la position
Bonjour,
Je viens de commencer avec mon nouvel EA et l'ouverture des positions est OK, j'ai configuré tp et sl. L'EA ouvre et ferme une position par une et il n'y a jamais plus d'un ordre. Mais je voudrais fermer une position si certains indicateurs m'alertent avant la limite sl ou tp.
Si j'essaie quelque chose comme ceci :
for (int i=1; i<=OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, 2)) {
if (OrderSymbol()==Symbol()) {
Ans=OrderClose(OrderTicket(),alLots,Bid,2);// Order closing
}
}
}[/CODE]
Nothing happened. Doesn't find any opened positions and I know there is 1.
If I try something like this:
for (int i=1; i<=OrdersTotal(); i++) {
CloseOrder(OrderValue(i,VAL_TICKET),OrderValue(i,VAL_LOTS),Bid,3);
}Compiler report error message that VAL_TICKER and VAL_LOTS are not defined and in examples I found they are nowhere declared.
If I try direcly by number to close:
[CODE]
Ans=OrderClose(0,alLots,Bid,2);// Order closingJe reçois le message d'erreur 4107 ou 4105 indiquant que le ticker n'est pas valide.
Quelqu'un peut-il vérifier ce message et mon application en pièce jointe et m'aider s'il vous plaît ?
Merci beaucoup
iHighest iLowest Clarification
Supposons 3 barres : Barre [2], Barre [1] et Barre [0] (actuelle).
La fonction "stop_low()" suivante permet-elle de trouver le plus bas niveau de la barre [2] et [3] ?
double stop_low = iLowest(Symbol(),0,1,2,1) ;
------------------------------------------------------------
Référence :
int iLowest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)
Renvoie le décalage de la plus petite valeur sur un nombre spécifique de périodes en fonction du type.
Paramètres :
symbol - Symbole dont les données doivent être utilisées pour calculer l'indicateur. NULL signifie le symbole actuel.
timeframe - Période de temps. Il peut s'agir de n'importe quelle valeur de l'énumération Timeframe. 0 signifie la période actuelle du graphique.
type - Identificateur de tableau de séries. Il peut s'agir de l'une des valeurs de l'énumération Series array identifier.
count - Nombre de périodes (dans le sens de la barre de départ vers la barre d'arrivée) sur lesquelles le calcul est effectué.
start - Décalage indiquant la barre, par rapport à la barre actuelle, à partir de laquelle les données doivent être prises.
Exemple :
// calcul de la valeur la plus basse sur les 10 barres consécutives de l'intervalle
// de l'indice 10 à l'indice 19 inclus sur le graphique actuel.
double val=Low ;