CopyRates прекращает работать после ошибки в WebRequest

 
Наблюдаю странное поведение. У меня в коде используются функции CopyRates и WebRequest и происходит так что если WebRequest единожды вернет ошибку -> все последующие вызовы к CopyRates тоже будут возвращать ошибку. 
Кто-то сталкивался с таким ?
 
писал в саппорт брокера и получил ответ "В логику торговой платформы не заложена возможность "реабилитации". Тоесть если платформа единожды получила отрицательный ответ от того ресурса куда вы экспортируете данные, последующие запросы будут отклоняться до перезапуска. ". Кто-то может помочь с интерпретацией этого ?
 

не используйте WebRequest :-) 

его сделали по большим просьбам, в меру необходимости; там много ограничений и он от природы длительный. Он синхронный. 

для получения расписаний новостищ или редких обменов - вполне годен. Для постоянных трансляций котировок, которые потом требуется в CopyRates и прочего real-time- отнюдь нет

Есть вроде бы Sockets - более низкий уровень, возможно там улыбнётся удача

---

И мы  не знаем деталей вашего кода - может там просто ошибки некорректно отработаны и всех делов. 

Поведение то вполне логично - WebReq куда-то ткнулся, не вышло и (от полученных ошибок)потом пока таймеры не стикнут повторятся не будет. Таймеры большие, минут по 15-20

Где конкретно в вашем коде пересеклись CopyRates и WebReq ? 

 
Maxim Kuznetsov #:

не используйте 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, но пожалуйста помогите разобраться 

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.10.25
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

т.е. надо каждый раз перед вызовом WebRequest сбрасывать код ошибки ?

 

Как выше сказали, про ResetLastError

и Sleep(5000) в цикле, внутри милисек.таймера 1000 - это серьёзная заявка на успех :-)

 
Maxim Kuznetsov #:

Как выше сказали, про ResetLastError

и Sleep(5000) в цикле, внутри милисек.таймера 1000 - это серьёзная заявка на успех :-)

а что не так с таймером ? так понимаю что он однопоточный и не будет такого что один заснет на 5 секунд и при єтом вызовуться еще 4 других)

 
Anton Sychov #:

а что не так с таймером ? так понимаю что он однопоточный и не будет такого что один заснет на 5 секунд и при єтом вызовуться еще 4 других)

сразу по выходу будет очень быстро снова вызван. Разве что OnTick проскочит

внутри OnTimer всё-таки надо стараться всё завершить быстрее чем промежуток таймера

архитектурная ошибка

 
Anton Sychov:
Наблюдаю странное поведение. У меня в коде используются функции CopyRates и WebRequest и происходит так что если WebRequest единожды вернет ошибку -> все последующие вызовы к CopyRates тоже будут возвращать ошибку. 
Кто-то сталкивался с таким ?

Какая ошибка возвращается после CopyRates?

 
Всем спасибо, таки дело было просто в том что я не сбрасывал ошибку через ResetLastError. Copy rates тут не причем. 
Єто моя первая програма на mql и первое обращение в форум. Всем огромное спасибо)