- Общайтесь с разработчиками через Сервисдеск!
- Обсуждение статьи "Как стать поставщиком сигналов для MetaTrader 4 и MetaTrader 5"
- Сервисы. Уже работают?
Любой новый программный продукт неизбежно содержит в себе ошибки, которые не всегда можно выявить даже при самом тщательном тестировании внутри компании. И поэтому мы придаем огромное значение всем сообщениям пользователей о найденных в наших программах проблемах и стараемся ответить на каждое из них.
Как-же общаться, если сначала идёт ошибочный ответ, а потом игнорирование. Заявка 2016.06.22 08:06, #1499568
Может что сообщество сможет объяснить?
Вот часть кода советника. Внутри 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) // Продолжение кода... // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.
Это содержимое вкладки "Эксперты"
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
Первые строки логфайла за 21.06 где чётко видно, что вышеприведённый код работал исправно.
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)
До начала следующих суток советник отдыхает.
Последние 2 строки логфайла за 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
и начало лога за 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
Если у вас одновременно и NewDay, и NewHour распечатываются принтом, то в логах они должны быть рядом, друг за другом. С одним и тем же временем
Простите за беспокойство, на время я и не обратил внимания. Но!!! Тогда почему при появлении первого бара нового дня, он-же и первый бар нового часа и новой минуты одна и та-же функция возвращает кому-то true кому-то false а когда захочет может вернуть всем всё правильно?
Разъясните пожалуйста что в этой функции может быть не так?
/*****************Определение появления нового бара******************/ 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); } }; /********************************************************************/Почему так могло случиться, что не одну неделю всё работало исправно и вдруг вот такая беда???
Support Team 2016.06.22 11:31
Эта функция не может использоваться многократно из-за
m_tOld = tNew;
Alexey Viktorov 2016.06.23 10:17
Что-то я вчера не сразу сообразил... Ведь в переменную m_tOld передаётся переменная по ссылке которая объявлена на уровне глобальных переменных и никак не должна влиять на многократный вызов если в функцию передаются по ссылке разные переменные. Разве не так? Это во-первых, а во-вторых - почему-же в тестере и дебаге всё отрабатывает правильно, а на демосчёте так чудит, то отрабатывает, то нет.
А вот эта проверка?
if(tNew > m_tOld)
Support Team 2016.06.23 10:24
Вызовите Вашу функцию 2 раза подряд. Если в первый вызов она возвратит true, то в следующий вызов она возвратит false, несмотря на то, что Вы её вызываете на том же самом тике
Alexey Viktorov 2016.06.23 10:36
Ну так вызывается-же. Весь необходимый код я предоставил. Почему в тестере и дебаге это не мешает, а на демке как вздумается? Вот чего я не могу понять. Ну если-бы в тестере временами проскакивала такая проблема, можно и нужно было искать новые пути, но ведь нет проблем в тестере...
При всём при том, сейчас не сохранился, советник использующий такую-же функцию на mql4, но проблем не возникало. Эта проблема вылезла только на mql5.Alexey Viktorov 2016.06.23 10:41
И что? Ну проверка... Ведь перед проверкой переменной tNew присваивается значение и оно сравнивается с переменной переданной по ссылке, а не с самой переменной m_tOld а она, эта m_tOld может иметь значение времени предыдущего бара указанного периода, или 01.01.1970 если это первый вызов. И только на следующем тике для каждого периода будет сравниваться значения одного и того-же бара.
Alexey Viktorov 2016.06.23 10:57
Обратите внимание, в функцию передаются разные переменные и разные периоды
newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);
И ВСЁ... После этого полный игнор. Спасибо что сразу ответили без задержки, но ответа вразумительного так и не последовало. Если есть баг в mql5 то можно-же просто написать типа "разбираемся, ждите"... А так, получается просто игнорирование проблемы.
Аналогичной функцией в mql4 определялось изменение времени кратно 15 секундам, а в mql5 вдруг такая проблема...
Вот что значит неправильная организация наблюдения при проведении эксперимента.
...
Чтобы ответить - нужен код. У вас отрывки кода. Сделайте минимальный код - такой, чтобы любой человек мог запустить у себя этот код.
Хорошо бы ещё в коде принтовать значения переменных - на входе в функцию и на выходе из функции.
Дмитрий, опять началось? Может проще ответить на вопрос "Почему 21.06.2016 ордера открылись без проблем, а 22.06.2016 вдруг неправильная организация наблюдения" или какие-то другие проблемы...
Если отвечу просто прямо и как есть, меня, скорее всего, за это забанят.
навсегда...
Прям даже спать покоя нет, так сильно мечтается?
А смысл? Ведь, вы от этого не поумнеете.
Прикольно жить наверно, когда смысл жизни - ненависть? А?
Чтобы ответить - нужен код. У вас отрывки кода. Сделайте минимальный код - такой, чтобы любой человек мог запустить у себя этот код.
Хорошо бы ещё в коде принтовать значения переменных - на входе в функцию и на выходе из функции.
Не вопрос.
Но обратите внимание, что проблем не возникало и вдруг... с чего-бы? Кроме отрывков кода есть логи в которых видно что 21.06.2016 и до этого не одну неделю отрабатывало как и должно быть, но вот 22.06.2016 вдруг появились проблемы. Перед тем как написать в СД я неоднократно прогнал в тестере, дебаге по истории и никаких проблем не обнаружено.
Потому и сомневаюсь в полезности выкладывания кода. Разве что для развлечения.
#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(""); }/*******************************************************************/
Раз автор не желает, попробую я:
//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+
Осталось решить, что есть за структура "mqlDateTime" и где объявлять переменные "oldDay" и "oldHour"...
Раз автор не желает, попробую я:
Осталось решить, что есть за структура "mqlDateTime" и где объявлять переменные "oldDay" и "oldHour"...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования