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
Quelqu'un peut-il me dire ce que j'ai fait de mal, le code ci-dessous est 2 EMA cross over avec des alertes. il refuse de fonctionner. Pls quelqu'un peut-il aider à compiler et à travailler sur mt4 build 600 + :
#property copyright "wnk"
#property link "www.wnk.com"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//--- tampons
double ExtMapBuffer1[] ;
double ExtMapBuffer2[] ;
//variable externe......
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé |
//+------------------------------------------------------------------+
int init()
{
//---- indicateurs
SetIndexStyle(0,DRAW_ARROW) ;
SetIndexArrow(0,217) ;
SetIndexBuffer(0,ExtMapBuffer1) ;
SetIndexEmptyValue(0,0.0) ;
SetIndexStyle(1,DRAW_ARROW) ;
SetIndexArrow(1,217) ;
SetIndexBuffer(1,ExtMapBuffer2) ;
SetIndexEmptyValue(1,0.0) ;
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| Fonction personnalisée de désinitialisation de l'indicateur |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0) ;
}
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisée |
//+------------------------------------------------------------------+
int start()
{
static datetime LastAlertTime = TimeCurrent() ;
int counted_bars=IndicatorCounted(),
limite ;
if(counted_bars<0)
retour(-1) ;
si(barres_comptées>0)
barres comptées-- ;
limit=Bars-compté_barres ;
while(limite)
{
double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0) ;
double ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0) ;
double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1) ;
double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1) ;
double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0) ;
double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1) ;
//surveiller les alertes
if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591))
ExtMapBuffer1[limite]=High[limite]+5*Point ;
LastAlertTime = Time[0] ;
Alert(Symbol()," ",Period(), "M Price UP") ;
//des alertes de vente
if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872))
ExtMapBuffer2[limit]=Low[limit]-5*Point ;
LastAlertTime = Time[0] ;
Alert(Symbol()," ",Period(), "M Price Down") ;
}
return(0) ;
}
//+------------------------------------------------------------------+Mastercash
Essayez-le maintenant
Axel
Cela peut être fait.
Il suffit de rechercher le type d'ordre ouvert souhaité et de comparer son prix d'ouverture au nouveau prix d'ouverture souhaité ou de comparer la barre à laquelle il a été ouvert à la barre qui sert de critère d'ouverture.EDIT : Il semble que j'ai oublié d'ajouter la fonction.
Serait-il possible d'écrire une fonction comme celle ci-dessous une vingtaine de fois pour différents "i=OrdersTotal()-1", puis d'appeler toutes les fonctions et de les comparer au nouveau prix d'ouverture?
double OpenOrderPrice()
{
double TempOrderPrice = 0 ;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice() ;
}
}
return(TempOrderPrice) ;
}
EDIT : Il semble que j'ai oublié d'ajouter la fonction.
Serait-il possible d'écrire une fonction comme celle ci-dessous une vingtaine de fois pour différents "i=OrdersTotal()-1", puis d'appeler toutes les fonctions et de les comparer au nouveau prix d'ouverture ?
double OpenOrderPrice()
{
double TempOrderPrice = 0 ;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice() ;
}
}
return(TempOrderPrice) ;
}Essayez quelque chose comme ceci :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Vous devez passer le prix auquel il doit être ouvert et l'écart maximal (une valeur absolue: par exemple pas 5 pour cinq points, mais 5*_Point) par rapport au prix, et si la différence est inférieure ou égale à cet écart de prix, il retournera le prix de l'ordre ouvert à ce prix approximatif. Sinon, il renverra -1 comme résultat (ce qui signifie dans ce cas qu'il n'y a pas d'ordres avec des prix similaires).
Essayez quelque chose comme ceci :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Vous devez passer le prix auquel il doit être ouvert et l'écart maximal (une valeur absolue : par exemple pas 5 pour cinq points, mais 5*_Point) par rapport au prix, et si la différence est inférieure ou égale à cet écart de prix, il retournera le prix de l'ordre ouvert à ce prix approximatif. Dans le cas contraire, il renverra -1 comme résultat (ce qui signifie dans ce cas qu'il n'y a pas d'ordre à un prix similaire).Donc si je veux vérifier s'il y a des ordres ouverts qui s'écartent de 2 pips du prix auquel je veux acheter, j'appelle cette fonction :
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1 ;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
si (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice() ;
priceDeviation = 2*Point ;
priceToCompareTo = Ask ;
pause ;
}
}
return(TempOrderPrice) ;
}
Et ensuite en faire un autre pour les shorts ?
Donc si je veux vérifier s'il y a des ordres ouverts qui s'écartent de 2 pips du prix auquel je veux acheter, j'appelle cette fonction :
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1 ;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
si (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice() ;
priceDeviation = 2*Point ;
priceToCompareTo = Ask ;
pause ;
}
}
return(TempOrderPrice) ;
}
Et puis en faire un autre pour les shorts ?Non
Vous appelez la fonction comme ceci :
if (OpenOrderPrice(OP_BUY,Ask ,2.0*_Point) == -1) autorise les longs et
if (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) autorise les short.
L'appel devrait provenir de votre partie de code où vous avez une logique pour ouvrir un ordre.
Mais alors la fonction doit être différente (comme ceci) :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
La fonction couvre les deux cas maintenant et vous ne devez pas changer le code dans la fonction.
___________________
PS : La variable _Point n'existe pas dans les anciennes versions de metatrader 4. L'exemple ci-dessus est écrit pour le nouveau metatrader4. Si vous utilisez une ancienne version (509 ou antérieure), "_Point" doit être "Point".
Non
Vous appelez la fonction comme ceci :
L'appel doit se faire à partir de votre partie de code où vous avez une logique pour ouvrir un ordre.
Mais alors la fonction doit être différente (comme ceci) :
La fonction couvre les deux cas maintenant et vous ne devez pas changer le code dans la fonction.
___________________
PS : La variable _Point n'existe pas dans les anciennes versions de metatrader 4. L'exemple ci-dessus est écrit pour le nouveau metatrader4. Si vous utilisez une ancienne version (509 ou antérieure), "_Point" doit être "Point".Merci. J'ai copié la fonction dans l'EA et l'ai appelée comme vous l'avez écrit, mais pour une raison quelconque, elle ouvre des positions même s'il y en a d'autres dans l'écart du nouveau prix. Cette fonction vérifie-t-elle tous les prix ouverts, ou seulement le dernier ?
Y compris l'EA ci-dessous.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Merci. J'ai copié la fonction dans l'EA et l'ai appelée comme vous l'avez écrit, mais pour une raison quelconque, elle ouvre des positions même s'il y en a d'autres dans l'écart du nouveau prix. Cette fonction vérifie-t-elle tous les prix ouverts, ou seulement le dernier ?
Y compris l'EA ci-dessous.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Il y a une erreur dans le code de cette fonction. J'ai supposé que l'OrderSelect() fonctionnait sur la position et je ne l'ai pas vérifié. Utilisez celui-ci :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Il devrait fonctionner correctement maintenant
Il y a une erreur dans le code de cette fonction. J'ai supposé que la fonction OrderSelect() fonctionnait sur la position et je ne l'ai pas vérifié. Utilisez celui-ci :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Et c'est ce qui se passe. Merci encore pour votre excellent travail, Mladen.
Bonjour Mladen ,
J'essaie de sélectionner le dernier ordre et d'ouvrir des ordres supplémentaires basés sur le dernier prix ouvert. Tout semble fonctionner sauf que
IfOrderDoesNotExist7() ; IfOrderDoesNotExist5() ;
semblent interférer l'une avec l'autre ; si je commente l'une des deux comme ci-dessous, l'ordre fonctionnera correctement.
// IfOrderDoesNotExist7() ;
IfOrderDoesNotExist5() ;
Pouvez-vous me dire ce que je fais de mal ?
Bonjour Mladen ,
J'essaie de sélectionner le dernier ordre et d'ouvrir des ordres supplémentaires en fonction du dernier prix ouvert. Tout semble fonctionner sauf que
IfOrderDoesNotExist7() ; IfOrderDoesNotExist5() ;
semblent interférer l'une avec l'autre ; si je commente l'une des deux comme ci-dessous, l'ordre fonctionnera correctement.
// IfOrderDoesNotExist7() ;
IfOrderDoesNotExist5() ;
Pouvez-vous me dire ce que je fais mal.sulaimoney
Je pense que le problème n'était pas dans ces deux fonctions mais dans la façon dont le nouveau metatrader 4 vérifie les conditions booléennes (si vous utilisez certaines des nouvelles constructions de metatrader 4). J'ai simplifié un peu le code et résolu le seul endroit où les conditions booléennes devaient être strictement définies. Essayez-le