не используйте WebRequest :-)
его сделали по большим просьбам, в меру необходимости; там много ограничений и он от природы длительный. Он синхронный.
для получения расписаний новостищ или редких обменов - вполне годен. Для постоянных трансляций котировок, которые потом требуется в CopyRates и прочего real-time- отнюдь нет
Есть вроде бы Sockets - более низкий уровень, возможно там улыбнётся удача
---
И мы не знаем деталей вашего кода - может там просто ошибки некорректно отработаны и всех делов.
Поведение то вполне логично - WebReq куда-то ткнулся, не вышло и (от полученных ошибок)потом пока таймеры не стикнут повторятся не будет. Таймеры большие, минут по 15-20
Где конкретно в вашем коде пересеклись CopyRates и WebReq ?
не используйте WebRequest :-)
его сделали по большим просьбам, в меру необходимости; там много ограничений и он от природы длительный. Он синхронный.
для получения расписаний новостищ или редких обменов - вполне годен. Для постоянных трансляций котировок, которые потом требуется в CopyRates и прочего real-time- отнюдь нет
Есть вроде бы Sockets - более низкий уровень, возможно там улыбнётся удача
---
И мы не знаем деталей вашего кода - может там просто ошибки некорректно отработаны и всех делов.
Поведение то вполне логично - WebReq куда-то ткнулся, не вышло и (от полученных ошибок)потом пока таймеры не стикнут повторятся не будет. Таймеры большие, минут по 15-20
Где конкретно в вашем коде пересеклись CopyRates и WebReq ?
Я попытался сделать минимальный код где это воспроизводится, не уверен что воспроизвел именно то что хотел но тем не менее тут похожее поведение. В коде по таймеру я вызываю CopyTicksRange и WebRequest.
Все работает пока сервер отвечает 200, но когда перезагружаю сервер -> WebRequest отдает 1001 код ответа, последующий GetLastError() отдает код 5203. Но когда сервер опять продолжает нормально отдавать код 200 -> GetLastError() продолжает отдавать 5203
"2023.10.25 09:27:48.354 test (AUDUSD,M15) ResponseCode: 1001
2023.10.25 09:27:48.354 test (AUDUSD,M15) Error occurred while making http request to http://mypchost.com:8080/test, errorCode: 5203
2023.10.25 09:27:53.461 test (AUDUSD,M15) ResponseCode: 200
2023.10.25 09:27:53.461 test (AUDUSD,M15) Error occurred while making http request to http://mypchost.com:8080/test, errorCode: 5203
2023.10.25 09:27:58.465 test (AUDUSD,M15) ResponseCode: 200
2023.10.25 09:27:58.465 test (AUDUSD,M15) Error occurred while making http request to http://mypchost.com:8080/test, errorCode: 5203
"
Код
//+------------------------------------------------------------------+ //| TickExporter | //| Copyright 2023, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2023, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #property description "Tick exporter for MT5" int OnInit() { EventSetMillisecondTimer(1000); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("Deinitializing the tick exporter"); EventKillTimer(); } void OnTimer() { Print("Timer"); getTicks(); HttpGetRequest("http://mypchost.com:8080/test", ""); } void getTicks() { MqlTick ticks[]; PrintFormat("Copying ticks for symbol %s from %I64d to %I64d.", "EURUSD", 1697780464000, 1697866864000); int copied = CopyTicksRange("EURUSD", ticks, COPY_TICKS_ALL, 1697780464000, 1697866864000); if (copied <= 0) { int errorCode = GetLastError(); if (errorCode != 0) { PrintFormat("Error occurred while calling CopyTicksRange for symbol %s: error code %d", "EURUSD", errorCode); } } PrintFormat("tick: %I64d", ticks[0].time_msc); } bool HttpGetRequest(string url, string headers) { int timeoutMillis = 10000; string nonConstUrl = url; uchar emptyData[]; int responseCode; string resultHeaders; uchar response[]; while (true) { responseCode = WebRequest("GET", nonConstUrl, headers, timeoutMillis, emptyData, response, resultHeaders); PrintFormat("ResponseCode: %d", responseCode); int errorCode = GetLastError(); if (errorCode != 0) { PrintFormat("Error occurred while making http request to %s, errorCode: %d", url, errorCode); Sleep(5000); // Wait for 5 seconds before retrying continue; } if (responseCode == 200) { return true; } else { PrintFormat("Failed to get data. Response code: %d, Error: %s", responseCode, GetLastError()); Sleep(5000); // Wait for 5 seconds before retrying } } return false; }
Возможно тут не дело в CopyTicksRange, но пожалуйста помогите разобраться
- 2023.10.25
- www.mql5.com
т.е. надо каждый раз перед вызовом WebRequest сбрасывать код ошибки ?
Как выше сказали, про ResetLastError
и Sleep(5000) в цикле, внутри милисек.таймера 1000 - это серьёзная заявка на успех :-)
Как выше сказали, про ResetLastError
и Sleep(5000) в цикле, внутри милисек.таймера 1000 - это серьёзная заявка на успех :-)
а что не так с таймером ? так понимаю что он однопоточный и не будет такого что один заснет на 5 секунд и при єтом вызовуться еще 4 других)
а что не так с таймером ? так понимаю что он однопоточный и не будет такого что один заснет на 5 секунд и при єтом вызовуться еще 4 других)
сразу по выходу будет очень быстро снова вызван. Разве что OnTick проскочит
внутри OnTimer всё-таки надо стараться всё завершить быстрее чем промежуток таймера
архитектурная ошибка
Наблюдаю странное поведение. У меня в коде используются функции CopyRates и WebRequest и происходит так что если WebRequest единожды вернет ошибку -> все последующие вызовы к CopyRates тоже будут возвращать ошибку.
Кто-то сталкивался с таким ?
Какая ошибка возвращается после CopyRates?
Єто моя первая програма на mql и первое обращение в форум. Всем огромное спасибо)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Кто-то сталкивался с таким ?