Sur le sujet. J'ai l'habitude d'ouvrir les documents problématiques dans Notepad++. Cela aide. Mais pas toujours ))))
J'ai également décidé de le parcourir avec Notepad++ et il n'y avait presque que des zéros, bien que le fichier ait une taille normale comme il devrait l'être...
J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.
Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :
enum opp_mode {
DoClose, // Close and reverse with initial lot
DoReverse, // Close and reverse (continue Martingale last lot)
DoHedge, // No closing reversal (Hedge mode)
};
// Trade & MM Sectioninput opp_mode Mode_opp = DoHedge; // Trading Mode//+------------------------------------------------------------------+//| Check for Open function |//+------------------------------------------------------------------+void CheckForOpen() {
if (!IsBarNew) return;
double lot=0;
positions=Positions();
if (Signal==OP_BUY) {
if (longs>0) return;
if (shorts==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (shorts>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode SELL by opposite signal.");
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing SELL by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_SELL);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging SELL by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
}
}
}
if (Signal==OP_SELL) {
if (shorts>0) return;
if (longs==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (longs>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode BUY by opposite signal.");
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing BUY by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_BUY);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging BUY by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
}
}
}
}
//+------------------------------------------------------------------+
La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.
//+------------------------------------------------------------------+//| Place Market Order function |//+------------------------------------------------------------------+bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) { // mn - Magic Numberdouble d_sl=0, d_tp=0;
MqlTick stTick;
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));
if (MathAbs(lot-Lot)<1 e-5) {MartinCounterB=0; MartinCounterS=0;}
if (oper==OP_BUY) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_ask=stTick.ask;
d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
if (oper==OP_SELL) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_bid=stTick.bid;
d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
return(false);
}
//+------------------------------------------------------------------+
La fonction de contrôle de l'ouverture d'un nouveau bar :
//+------------------------------------------------------------------+//| Global Variables |//+------------------------------------------------------------------+bool IsBarNew=false;
//+------------------------------------------------------------------+//| Bar refreshing function |//| true - new bar opened, false - not opened |//+------------------------------------------------------------------+bool IsNewBar() {
staticdatetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
datetime curTime =iTime(NULL,PERIOD_CURRENT,0);
if (curTime>SavedTime) {
SavedTime=curTime;
return(true);
}
elsereturn(false);
}
//+------------------------------------------------------------------+
La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.
J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.
La fonction OnTick()
Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :
La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.
La fonction de contrôle de l'ouverture d'un nouveau bar :
La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.
L'ensemble de l'EA.
J'utilise cette fonction pour contrôler la nouvelle barre - parfois il y a des erreurs lors de la copie de la date de la barre.
//+------------------------------------------------------------------------------------------------------------------+//| Возвращает TRUE, если появился новый бар на текущем ТФ//+------------------------------------------------------------------------------------------------------------------+bool isNewBar()
{
datetime tm[];
staticdatetime prevBarTime=0;
if(CopyTime(_Symbol,0,0,1,tm)<0)
{
Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
}
else
{
if(prevBarTime!=tm[0])
{
prevBarTime=tm[0];
returntrue;
}
returnfalse;
}
returntrue;
}
J'utilise une telle fonction pour contrôler une nouvelle barre - il arrive que des erreurs se produisent lors de la copie de la date de la barre.
Merci. Je vais essayer de le remplacer. Bien que jusqu'à présent, la fonction que j'ai utilisée a bien fonctionné aussi. J'ai une idée pour imprimer l'heure d'ouverture de la barre et le prix, alors il serait clairement vu que l'erreur est dans ce cas particulier.
Cependant, je suis confus par le fait que les duplots n'apparaissent qu'à l'ouverture de la première position alors que les positions suivantes sont ouvertes correctement et que l'EA fonctionne pendant des heures en en générant des dizaines. Et la fonction de contrôle de l'ouverture du bar fonctionne à chaque fois. Et selon les conditions, le conseiller expert ouvre la première position lorsqu'il n'y en a pas et les suivantes seulement lorsque le prix a suffisamment bougé après l'ouverture de la première position.
J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.
La fonction OnTick()
Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :
La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.
La fonction de contrôle de l'ouverture d'un nouveau bar :
La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.
L'ensemble de l'EA.
Et comment vérifier qu'une position n'a pas déjà été ouverte sur cette barre ?
Et comment vérifier qu'aucune position n'a encore été ouverte sur cette barre ?
Non, ce contrôle n'existe pas.
Il existe de tels contrôles :
Si une nouvelle barre s'est ouverte, avec son premier tick, une position peut être ouverte,
S'il n'y a pas de position, la première position peut être ouverte.
En d'autres termes, pour une raison quelconque, deux positions s'ouvrent en même temps sur le premier tick d'une nouvelle barre. Et seuls les premiers postes sont ouverts. Par ailleurs, un tel phénomène n'est pas observé.
Si une nouvelle barre s'est ouverte, avec son premier tick, une position peut être ouverte,
S'il n'y a pas de position, la première position peut être ouverte.
C'est-à-dire que pour une raison quelconque, deux positions s'ouvrent en même temps sur le premier tick d'une nouvelle barre. Et seuls les premiers postes sont ouverts. Par ailleurs, un tel phénomène n'est pas observé.
Je n'ai pas le temps d'analyser ce qui se passe là-bas. Mais essayez de vérifier le nombre de positions ouvertes sur la nouvelle barre. Sinon, ouvrez.
......
EA fonctionne, mais lorsque j'essaie de l'ouvrir dans l'éditeur
......
ce n'est pas un exécutable, c'est un fichier mq5...
voici mon code...
Formulez donc vos phrases correctement.
Sur le sujet. J'ai l'habitude d'ouvrir les documents problématiques dans Notepad++. Cela aide. Mais pas toujours ;))
Formulez donc vos phrases correctement.
Sur le sujet. J'ai l'habitude d'ouvrir les documents problématiques dans Notepad++. Cela aide. Mais pas toujours ))))
J'ai également décidé de le parcourir avec Notepad++ et il n'y avait presque que des zéros, bien que le fichier ait une taille normale comme il devrait l'être...
J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.
La fonction OnTick()
Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :
La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.
La fonction de contrôle de l'ouverture d'un nouveau bar :
La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.
L'ensemble de l'EA.
J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.
La fonction OnTick()
Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :
La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.
La fonction de contrôle de l'ouverture d'un nouveau bar :
La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.
L'ensemble de l'EA.
J'utilise cette fonction pour contrôler la nouvelle barre - parfois il y a des erreurs lors de la copie de la date de la barre.
J'utilise une telle fonction pour contrôler une nouvelle barre - il arrive que des erreurs se produisent lors de la copie de la date de la barre.
Merci. Je vais essayer de le remplacer. Bien que jusqu'à présent, la fonction que j'ai utilisée a bien fonctionné aussi. J'ai une idée pour imprimer l'heure d'ouverture de la barre et le prix, alors il serait clairement vu que l'erreur est dans ce cas particulier.
Cependant, je suis confus par le fait que les duplots n'apparaissent qu'à l'ouverture de la première position alors que les positions suivantes sont ouvertes correctement et que l'EA fonctionne pendant des heures en en générant des dizaines. Et la fonction de contrôle de l'ouverture du bar fonctionne à chaque fois. Et selon les conditions, le conseiller expert ouvre la première position lorsqu'il n'y en a pas et les suivantes seulement lorsque le prix a suffisamment bougé après l'ouverture de la première position.
J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.
La fonction OnTick()
Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :
La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.
La fonction de contrôle de l'ouverture d'un nouveau bar :
La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.
L'ensemble de l'EA.
Et comment vérifier qu'une position n'a pas déjà été ouverte sur cette barre ?
Et comment vérifier qu'aucune position n'a encore été ouverte sur cette barre ?
Non, ce contrôle n'existe pas.
Il existe de tels contrôles :
- Si une nouvelle barre s'est ouverte, avec son premier tick, une position peut être ouverte,
- S'il n'y a pas de position, la première position peut être ouverte.
En d'autres termes, pour une raison quelconque, deux positions s'ouvrent en même temps sur le premier tick d'une nouvelle barre. Et seuls les premiers postes sont ouverts. Par ailleurs, un tel phénomène n'est pas observé.Non, ce contrôle n'existe pas.
Il existe de tels contrôles :
- Si une nouvelle barre s'est ouverte, avec son premier tick, une position peut être ouverte,
- S'il n'y a pas de position, la première position peut être ouverte.
C'est-à-dire que pour une raison quelconque, deux positions s'ouvrent en même temps sur le premier tick d'une nouvelle barre. Et seuls les premiers postes sont ouverts. Par ailleurs, un tel phénomène n'est pas observé.Je n'ai pas le temps d'analyser ce qui se passe là-bas. Mais essayez de vérifier le nombre de positions ouvertes sur la nouvelle barre. Sinon, ouvrez.