Aide au codage - page 242

 
Mastercash:
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

Dossiers :
_test_mc.mq4  3 kb
 
mladen:
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) ;

}

 
BlackCoq:
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 OpenOrderPrice(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)

{

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

 
mladen:
Essayez quelque chose comme ceci :
double OpenOrderPrice(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)

{

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 ?

 
BlackCoq:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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".

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

//+------------------------------------------------------------------+//| expert start function |

//+------------------------------------------------------------------+

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)

//----
 
BlackCoq:
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.

//+------------------------------------------------------------------+//| expert start function |

//+------------------------------------------------------------------+

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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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

 
mladen:
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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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

}

Cela devrait fonctionner correctement maintenant

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 ?

Dossiers :
564.mq4  10 kb
 
sulaimoney:
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

Dossiers :
564_1.mq4  10 kb