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
Entrée de temps personnalisée à MQL4
Est-il possible d'écrire un code avec MQL4 qui puisse dessiner une ligne horizontale à partir d'une barre définie par l'utilisateur jusqu'à la fin du graphique ?
Voici le même code avec Metastock
Dy:=Input("Day",1,31,1);
Mn:=Input("Month",1,12,1);
Yr:=Input("Year",2000,2012,2010);
{Time Calculation}
Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();
{Formula}
Start:= ValueWhen(1,Time,CLOSE);
{Output}
Start;Et voici le résultat
J'espère pouvoir faire la même chose avec MQL4
Essayez comme ceci :
extern string startFrom = "2012.07.06 00:00";
int init() { return(0); }
int deinit() { ObjectDelete("hLine"); return(0); }
int start()
{
string name = "hLine";
int barShift = iBarShift(NULL,0,StrToTime(startFrom));
ObjectCreate(name,OBJ_TREND,0,0,0,0,0);
ObjectSet(name,OBJPROP_PRICE1,Close);
ObjectSet(name,OBJPROP_PRICE2,Close);
ObjectSet(name,OBJPROP_TIME1,Time);
ObjectSet(name,OBJPROP_TIME2,Time[0]);
return (0);
}Copiez et collez le code dans un indicateur (c'est un indicateur qui fonctionne déjà) et attachez-le au graphique.
Est-il possible d'écrire un code avec MQL4 qui puisse dessiner une ligne horizontale à partir d'une barre définie par l'utilisateur jusqu'à la fin du graphique ?
Voici le même code avec Metastock
Dy:=Input("Day",1,31,1);
Mn:=Input("Month",1,12,1);
Yr:=Input("Year",2000,2012,2010);
{Time Calculation}
Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();
{Formula}
Start:= ValueWhen(1,Time,CLOSE);
{Output}
Start;Et voici le résultat
J'espère pouvoir faire la même chose avec MQL4.Essayez comme ceci :
extern string startFrom = "2012.07.06 00:00";
int init() { return(0); }
int deinit() { ObjectDelete("hLine"); return(0); }
int start()
{
string name = "hLine";
int barShift = iBarShift(NULL,0,StrToTime(startFrom));
ObjectCreate(name,OBJ_TREND,0,0,0,0,0);
ObjectSet(name,OBJPROP_PRICE1,Close);
ObjectSet(name,OBJPROP_PRICE2,Close);
ObjectSet(name,OBJPROP_TIME1,Time);
ObjectSet(name,OBJPROP_TIME2,Time[0]);
return (0);
}Vous êtes le meilleur merci beaucoup mladen
Bonjour Mladen,
Pouvez-vous m'en dire plus sur le raisonnement qui sous-tend ces fonctions? Je ne comprends toujours pas très bien. Merci
Terrance
Essayez cette fonction :
{
int openedOrders = 0;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderType() == type) openedOrders++;
}
return(openedOrders);
}
[/PHP]
To count opened buy orders, call it like this :
to count opened sell orders, call it like this :
[PHP]int openedSells = countOpened(OP_SELL);tkuan77
Vous vouliez limiter les ordres à 1 achat et 1 vente à la fois.
Donc, si vous appelez le compteur d'ordres ouverts avant d'ouvrir l'une des positions, vous pouvez contrôler le nombre d'achats ou de ventes ouverts que vous avez.
un exemple :
si openedBuys uis est autre chose que 0, vous n'ouvrez pas de nouvel ordre d'achat. La même logique s'applique aux ventes (c'est le deuxième exemple dans ce post).
Salut Mladen,
Pouvez-vous m'en dire plus sur le raisonnement qui sous-tend ces fonctions ? Je n'ai toujours pas compris. Merci
TerranceBonjour Mladen,
Je me suis peut-être mal exprimé. Ce que j'essaie de faire, c'est que lorsque mes critères d'achat sont remplis, cela déclenche un achat et si un autre critère d'achat est à nouveau rempli, cela déclenche un autre achat OU une vente si le critère de vente est rempli. Cependant, le nombre maximum de transactions que je pourrai avoir à tout moment sera de 2.
J'ai essayé votre méthode précédemment et je rencontre toujours le système ouvrant 2 transactions en même temps, c'est pourquoi j'ai essayé de le limiter avec la fonction Bars avec le même problème d'ouverture de 2 transactions en même temps par l'EA.
Quelle pourrait être la cause de ce problème ? Est-ce que cela a quelque chose à voir avec ma logique ?
Salutations
Terrance
tkuan77
Vous vouliez limiter les ordres à 1 achat et 1 vente à la fois.
Donc, si vous appelez le compteur d'ordres ouverts avant d'ouvrir l'une des positions, vous pouvez contrôler combien d'achats ou de ventes ouverts vous avez.
un exemple :
Vous pouvez ajouter une vérification pour savoir si un ordre d'un certain type a déjà été ouvert sur une barre actuelle et de cette façon vous empêcherez l'ouverture d'un nouvel ordre sur un prochain tick. Si oui (un ordre a été ouvert sur la barre actuelle), alors il n'est pas possible d'ouvrir un nouvel ordre. Si non, vous pouvez ouvrir un nouvel ordre. Voici une fonction qui peut compter les ordres de type rewuired ouverts sur la barre actuelle.
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != type) continue;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
break;
}
return(openedAtBar);
}
Bonjour Mladen,
Je me suis peut-être mal exprimé. Ce que j'essaie d'accomplir, c'est que lorsque mes critères d'achat sont remplis, cela déclenche un achat et si un autre critère d'achat est à nouveau rempli, cela déclenche un autre achat OU une vente si le critère de vente est rempli. Cependant, le nombre maximum de transactions que je pourrai avoir à tout moment sera de 2.
J'ai essayé votre méthode précédemment et je rencontre toujours le système ouvrant 2 transactions en même temps, c'est pourquoi j'ai essayé de le limiter avec la fonction Bars avec le même problème d'ouverture de 2 transactions en même temps par l'EA.
Quelle pourrait être la cause de ce problème ? Est-ce que cela a quelque chose à voir avec ma logique ?
Salutations
TerranceBonjour Mladen,
Peut-être me suis-je mal exprimé. Ce que j'essaie de faire, c'est que lorsque mes critères d'achat sont remplis, cela déclenche un achat et si un autre critère d'achat est à nouveau rempli, cela déclenche un autre achat OU une vente si le critère de vente est rempli. Cependant, le nombre maximum de transactions que je pourrai avoir à tout moment sera de 2.
J'ai essayé votre méthode précédemment et je rencontre toujours le système ouvrant 2 transactions en même temps, c'est pourquoi j'ai essayé de le limiter avec la fonction Bars avec le même problème d'ouverture de 2 transactions en même temps par l'EA.
Quelle pourrait être la cause de ce problème ? Est-ce que cela a quelque chose à voir avec ma logique ?
Salutations
TerranceC'est parce que vous n'avez pas spécifié comment vous voulez que le deuxième trade soit différent du premier. La différenciation peut prendre la forme d'un nombre x de barres ou d'un prix différent du FirstBuyPrice.
Merci Mladen pour l'aide, mais je veux juste vérifier avec vous, dois-je mettre le code avant ma fonction long/short, entre les deux ou ailleurs ? Parce qu'il semble qu'une erreur continue d'apparaître et je n'arrive pas à en trouver la source. Et est-ce que MagicNumber est censé être un nombre entier ?
Terrance
total = OrdersTotal() ;
si(total < 2)
{
int countOpenedOnACurrentBar(int type)
{
int openedAtBar = 0 ;
datetime startTime = Time[0] ;
datetime endTime = Time[0]+Period()*60 ;
for(int i=0 ; i < OrdersTotal() ; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break ;
if(OrderMagicNumber() != MagicNumber) continue ;
if(OrderSymbol() != Symbol()) continue ;
if(OrderType() != type) continue ;
if(OrderOpenTime()=endTime) continue ;
openedAtBar++ ;
pause ;
}
return(openedAtBar) ;
}
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"My EA",12345,0,Green) ;
if(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(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,
"My EA",12345,0,Red) ;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;
return(0) ;
}
return(0) ;
}
Vous pouvez ajouter une vérification pour savoir si un ordre d'un certain type a déjà été ouvert sur une barre actuelle et ainsi empêcher l'ouverture d'un nouvel ordre au prochain tick. Si oui (il y a eu un ordre ouvert sur une barre courante), alors il n'y a pas d'ouverture de nouvel ordre. Si non, vous pouvez ouvrir un nouvel ordre. Voici une fonction qui peut compter les ordres de type rewuired ouverts sur la barre actuelle.
{
int openedAtBar = 0;
datetime startTime = Time[0];
datetime endTime = Time[0]+Period()*60;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
if(OrderMagicNumber() != MagicNumber) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderType() != type) continue;
if(OrderOpenTime()=endTime) continue;
openedAtBar++;
break;
}
return(openedAtBar);
}
...
Terrance
Il s'agit d'une fonction. Placez-la à la fin de votre EA et placez des appels à cette fonction là où vous pensez qu'il est approprié de vérifier si un ordre est déjà ouvert sur une barre courante.
Merci Mladen pour votre aide, mais je veux juste vérifier avec vous, dois-je mettre le code avant ma fonction long/short, entre les deux ou ailleurs ? Parce qu'il semble qu'une erreur continue d'apparaître et je n'arrive pas à en trouver la source. Et est-ce que MagicNumber est censé être un nombre entier ?
Terrance
total = OrdersTotal() ;
if(total < 2)
{
int countOpenedOnACurrentBar(int type)
{
int openedAtBar = 0 ;
datetime startTime = Time[0] ;
datetime endTime = Time[0]+Period()*60 ;
for(int i=0 ; i < OrdersTotal() ; i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break ;
if(OrderMagicNumber() != MagicNumber) continue ;
if(OrderSymbol() != Symbol()) continue ;
if(OrderType() != type) continue ;
if(OrderOpenTime()=endTime) continue ;
openedAtBar++ ;
pause ;
}
return(openedAtBar) ;
}
if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"My EA",12345,0,Green) ;
if(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(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,
"My EA",12345,0,Red) ;
if(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) ;
}