Tout nouveau produit logiciel contient inévitablement des bogues, qui ne peuvent pas toujours être détectés, même par les tests les plus approfondis effectués en interne. C'est pourquoi nous attachons une grande importance à tous les rapports des utilisateurs sur les problèmes rencontrés dans nos logiciels et nous nous efforçons de répondre à chacun d'entre eux.
Comment pouvons-nous communiquer s'il y a d'abord une réponse erronée et ensuite nous l'ignorons. Application 2016.06.22 08:06, #1499568
Peut-être la communauté peut-elle l'expliquer ?
Voici une partie du code de l'EA. Inside void OnTick().
bool openNew, newDay, newHour; if((int)mqlDateTime.hour == startHour) // startHour = 0 Это условие выполнено. { newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); // if(newDay) Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour); if(newHour) Print("***** newHour ", newHour); // Судя по распечатке newHour = true if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ. { openNew = openNew_or_No(); Print("***** openNew ", openNew, " ***** PositionsTotal ", PositionsTotal()); // Эта распечатка отсутствует if(openNew || PositionsTotal() == 0) // Продолжение кода... // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.
Voici le contenu de l'onglet "Experts".
2016.06.22 00:00:44.531 Toad Green (EURUSD,M15) ***** newHour true 2016.06.22 00:00:44.331 Toad Green (USDJPY,M15) ***** newHour true 2016.06.22 00:00:18.361 Toad Green (EURUSD,M15) ***** newDay true mqlDateTime.hour 0 2016.06.22 00:00:12.770 Toad Green (USDJPY,M15) ***** newDay true mqlDateTime.hour 0
Les premières lignes du fichier journal de 21.06 où l'on voit clairement que le code ci-dessus a bien fonctionné.
GM 0 00:00:30.116 Trades '3265046': instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55) NK 0 00:00:30.246 Trades '3265046': accepted instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55) IE 0 00:00:30.246 Trades '3265046': deal #73303810 buy 0.01 EURUSD at 1.13188 done (based on order #87892298) KI 0 00:00:30.246 Trades '3265046': order #87892298 buy 0.01 / 0.01 EURUSD at 1.13188 done in 130 ms ON 0 00:00:30.256 Trades '3265046': instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55) LQ 0 00:00:30.366 Trades '3265046': accepted instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55) HG 0 00:00:30.376 Trades '3265046': deal #73303813 sell 0.01 EURUSD at 1.13093 done (based on order #87892301) RK 0 00:00:30.376 Trades '3265046': order #87892301 sell 0.01 / 0.01 EURUSD at 1.13093 done in 120 ms MJ 0 00:00:30.376 Trades '3265046': modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462 GK 0 00:00:30.476 Trades '3265046': accepted modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462 OK 0 00:00:30.486 Trades '3265046': modify #87608748 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 107 ms OH 0 00:00:30.486 Trades '3265046': modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462 GJ 0 00:00:30.586 Trades '3265046': accepted modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462 KI 0 00:00:30.596 Trades '3265046': modify #87892301 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 109 ms EN 0 04:20:25.608 Trades '3265046': deal #73317674 sell 0.01 EURUSD at 1.13388 done (based on order #87906853)
L'EA se repose jusqu'au début du jour suivant.
Les 2 dernières lignes du fichier journal du 21.06
OD 0 23:09:20.196 Network '3265046': scanning network for access points NR 0 23:09:33.496 Network '3265046': scanning network finished
et début du journal à partir de 22.06
PM 1 02:13:39.422 Network '3265046': connection to MetaQuotes-Demo lost GF 2 02:13:39.582 MQL5.community authorization failed DO 2 02:13:39.682 MQL5.community authorization failed IP 2 02:13:40.052 MQL5.community authorization failed PK 0 02:13:43.252 Network '3265046': authorized on MetaQuotes-Demo through Access Point RU Moscow (ping: 117.48 ms) DI 0 02:13:43.252 Network '3265046': previous successful authorization performed from 31.173.80.184 on 2016.06.21 14:55:11
Si vous avez imprimé simultanément NewDay et NewHour, ils devraient se trouver l'un à côté de l'autre dans les journaux. Dans le même temps
Désolé pour le dérangement, je n'ai pas fait attention à l'heure. Mais ! !! Alors pourquoi à l'apparition de la première barre du nouveau jour, de la première barre de la nouvelle heure et de la nouvelle minute la même fonction renvoie quelqu'un de vrai à quelqu'un de faux et quand elle veut peut renvoyer tout correctement ?
Veuillez expliquer ce qui peut être incorrect dans cette fonction.
/*****************Определение появления нового бара******************/ class cNewBar { public: bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime & m_tOld) { datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE); if(tNew > m_tOld) { m_tOld = tNew; return(true); } return(false); } }; /********************************************************************/Comment se fait-il que tout fonctionnait bien pendant de nombreuses semaines et que, tout à coup, tout se dérègle ?
Équipe de soutien 2016.06.22 11:31
Cette fonction ne peut pas être utilisée de manière répétée en raison de
m_tOld = tNew;
Alexey Viktorov 2016.06.23 10:17
Quelque chose que je n'ai pas compris immédiatement hier... Après tout, la variable m_tOld est passée à la fonction par référence, ce qui est déclaré au niveau des variables globales et ne devrait pas affecter l'appel multiple si différentes variables sont passées à la fonction par référence. N'est-ce pas ? Tout d'abord, pourquoi cela fonctionne-t-il correctement dans le testeur et le débogueur, et pourquoi cela ne fonctionne-t-il pas sur le compte de démonstration ?
Et ce chèque ?
if(tNew > m_tOld)
Équipe de soutien 2016.06.23 10:24
Appelez votre fonction 2 fois de suite. Si le premier appel renvoie un résultat vrai, le suivant renverra un résultat faux, même si vous l'appelez sur le même tick.
Alexey Viktorov 2016.06.23 10:36
Eh bien, il s'appelle. J'ai fourni tous les codes nécessaires. Pourquoi cela n'empêche pas de tester et de déboguer, et d'utiliser la démo comme vous le souhaitez ? C'est ce que je ne peux pas comprendre. Eh bien, si dans le testeur un tel problème se produisait occasionnellement, nous pourrions et devrions chercher de nouveaux moyens, mais il n'y a pas de problèmes dans le testeur...
Tout de même, maintenant je n'ai pas sauvegardé un EA en utilisant la même fonction sur mql4, mais il n'y avait pas de problèmes. Ce problème n'est apparu qu'avec mql5.Alexey Viktorov 2016.06.23 10:41
Et alors ? Donc le test... Parce qu'avant la vérification, une valeur est attribuée à la variable tNew et elle est comparée à la variable passée par référence, et non à la variable m_tOld elle-même. Et cette m_tOld peut avoir la valeur du temps de la barre précédente de la période spécifiée, ou 01.01.1970 si c'est le premier appel. Et ce n'est qu'au prochain tick de chaque période que les valeurs de la même barre seront comparées.
Alexey Viktorov 2016.06.23 10:57
Notez que différentes variables et différentes périodes sont passées à la fonction
newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);
ET TOUT... Après cela, je suis complètement ignoré. Merci pour la réponse rapide sans délai, mais je n'ai reçu aucune réponse intelligible. S'il y a un bogue dans mql5, vous pouvez simplement écrire, "Nous essayons de le corriger, alors attendez...". Mais dans ce cas, vous ignorez simplement le problème.
Une fonction similaire dans mql4 définissait le changement de temps comme un multiple de 15 secondes, et dans mql5 ce problème est soudainement apparu...
C'est ce que signifie une observation mal organisée lors d'une expérience.
...
Pour répondre à cette question, vous avez besoin d'un code. Vous avez des bouts de code. Réaliser le code minimum - de sorte que n'importe qui puisse exécuter ce code chez lui.
Il serait également bon d'imprimer dans le code les valeurs des variables - à l'entrée de la fonction et à la sortie de la fonction.
Dimitri, ça a recommencé ? Peut-être qu'il est plus facile de répondre à la question "Pourquoi le 21.06.2016 les mandats se sont ouverts sans aucun problème, mais le 22.06.2016 soudainement la mauvaise organisation de surveillance" ou un autre problème....
Si je réponds de manière simple et directe, je serai probablement banni pour cela.
pour toujours...
Tu ne peux même pas dormir, tu rêves tellement ?
Quel est l'intérêt ? Parce que ça ne te rend pas plus sage.
N'est-ce pas amusant de vivre quand le sens de la vie est la haine ? А ?
Pour répondre à cette question, vous avez besoin d'un code. Vous avez des bouts de code. Réaliser le code minimum - de sorte que n'importe qui puisse exécuter ce code par lui-même.
Il serait bon d'imprimer les valeurs des variables dans le code - à l'entrée de la fonction et à la sortie de la fonction.
Pas de problème.
Mais notez qu'il n'y avait pas de problèmes et que soudain... Pourquoi ? En dehors des extraits de code, il existe des journaux qui montrent que le 21.06.2016 et avant cela, il a fonctionné comme il se doit pendant des semaines, mais que le 22.06.2016, des problèmes sont soudainement apparus. Avant d'écrire sur SD, j'ai lancé à plusieurs reprises dans le testeur, débogué à travers l'historique et aucun problème n'a été trouvé.
C'est pourquoi je doute de l'utilité de poster le code. C'est juste pour le plaisir.
#property strict datetime oldDay, oldHour; MqlDateTime mqlDateTime; /*******************Expert initialization function*******************/ int OnInit() { return(INIT_SUCCEEDED); }/*******************************************************************/ /************************Expert tick function************************/ void OnTick() { bool newDay, newHour; TimeToStruct(TimeCurrent(), mqlDateTime); if((int)mqlDateTime.hour == 0) { newDay = IsNewBar(_Symbol, PERIOD_D1, oldDay); // Обратите внимание на то, что это отдельная переменная передаваемая в функцию по ссылке if(newDay) Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true newHour = IsNewBar(_Symbol, PERIOD_H1, oldHour); // А это совсем другая переменная if(newHour) Print("***** newHour ", newHour); // Судя по распечатке newHour = true if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ. { Print("Ордер должен откыться. "); } } }/*******************************************************************/ /*****************Определение появления нового бара******************/ bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld) { datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE); if(tNew > m_tOld) { m_tOld = tNew; return(true); } return(false); } /********************************************************************/ /******************Expert deinitialization function******************/ void OnDeinit(const int reason) { Comment(""); }/*******************************************************************/
Puisque l'auteur n'est pas disposé à le faire, je vais essayer :
//+------------------------------------------------------------------+ //| test_1Vc2f.mq5 | //| Copyright © 2016, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2016, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- bool openNew,newDay,newHour; //--- newDay=IsNewBar(_Symbol,PERIOD_D1,oldDay); // if(newDay) Print("***** newDay ",newDay," mqlDateTime.hour ",mqlDateTime.hour); // Судя по распечатке newDay = true newHour=IsNewBar(_Symbol,PERIOD_H1,oldHour); if(newHour) Print("***** newHour ",newHour); // Судя по распечатке newDay = true } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool IsNewBar(string symbol,ENUM_TIMEFRAMES timeframe,datetime &m_tOld) { datetime tNew=(datetime)SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE); if(tNew>m_tOld) { Print("in: m_tOld = ",m_tOld); m_tOld=tNew; Print("out: m_tOld = ",m_tOld); return(true); } return(false); } //+------------------------------------------------------------------+
Ce qui reste à décider est la structure"mqlDateTime" et où déclarer les variables "oldDay" et "oldHour"...
Puisque l'auteur ne veut pas, je vais essayer :
Ce qui reste à décider est la structure"mqlDateTime" et où déclarer les variables "oldDay" et "oldHour"...

- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation