Советник ест RAM

 

Есть советник MQl4 на MT4

Проблема начинается как только подключается getalert функция, которая использует WebRequest. Если её не использовать, то память используемая не растёт. 

void OnTick()

{

 for (sig=1;sig<50;sig++)

   {

   getalert(sig);

   }

}


 bool getalert(int sig)

     {

    string cookie=NULL,headers;

   char post[],result[];

   int res;

int timeout = 1000;

  string signal_url = "https://www.website.example/alerts.php?signal=" + sig ;

    res=WebRequest("POST",signal_url,cookie,NULL,timeout,post,0,result,headers);

    }

  По каким-то причинам использование RAM постоянно растёт. Никак не могу понять, почему. 

Пробовал обнулять все, например

 ZeroMemory(cookie);

    ZeroMemory(headers);

    ArrayFree(post);

    ArrayFree(result); 

    ZeroMemory(signal_url);


Всё равно. Платформа при открытии сначала есть 50-55 MB, потом начинает расти на 3-4 MB  в час. С учётом того, что на сервере стоят 100 платформ, получается что за сутки на 70 MB вырастает и решается только перезагрузкой. платформы. 

 
Pavel Tsimailo:

Есть советник MQl4 на MT4

Проблема начинается как только подключается getalert функция, которая использует WebRequest. Если её не использовать, то память используемая не растёт. 

void OnTick()

{

 for (sig=1;sig<50;sig++)

   {

   getalert(sig);

   }

}


 bool getalert(int sig)

     {

    string cookie=NULL,headers;

   char post[],result[];

   int res;

int timeout = 1000;

  string signal_url = "https://www.website.example/alerts.php?signal=" + sig ;

    res=WebRequest("POST",signal_url,cookie,NULL,timeout,post,0,result,headers);

    }

  По каким-то причинам использование RAM постоянно растёт. Никак не могу понять, почему. 

Пробовал обнулять все, например

 ZeroMemory(cookie);

    ZeroMemory(headers);

    ArrayFree(post);

    ArrayFree(result); 

    ZeroMemory(signal_url);


Всё равно. Платформа при открытии сначала есть 50-55 MB, потом начинает расти на 3-4 MB  в час. С учётом того, что на сервере стоят 100 платформ, получается что за сутки на 70 MB вырастает и решается только перезагрузкой. платформы. 

а по каким-то причинам вас не зобанили на  https://www.website.example/ ? я бы зобанил :-)

50 запросов на тик, который может быть чаще чем раз в сек. :-) За цикл в 50 обращений прилетает новый тик и всё повторяется вновь..БЕЗ ПАУЗ

да там всяких кешей накопится будь здоров..

--- 

помимо юмора - массивы post[] и result[] стоит делать статическими или выносить в глобальный уровень. Не уверен что компилятор (хоть его и нахваливают) это сделает за вас. Хотя-бы избежите пересоздания и переаллоцирования массивов

PS/ вы даже не успеваете отработать все WebRequest - даже тики копятся в очередях терминала (треда советника). 

 
Pavel Tsimailo #:

1. А за что банить? 

https://www.website.example/&nbsp;в чем здесь проблема? 

2. Ну, а как кеш-то обнулить?

никак не обнулить..нефик лазить в сеть с такой частотой

OnTick() должен отрабатывать полностью до след тика. Аксиоматика

Если вы часто-часто, много-много обращаетесь с POST к стороннему ресурсу, то во первых напрягаете весь сетевой стек и он жрёт память как не в себя, во вторых вас на том конце провода могут отправить в бан. 

в вашем случае получается до 50 запросов/сек с одной "платформы" (процесса), коих по вашим словам 100. 

При таких потребностях, ставят прокси, промежуточные службы и/или договариваются с поставщиком про трансляцию данных потоком. 

 
Pavel Tsimailo #:

Обращение идёт к своему сайту, на котором трейдеры постят сделки. Советник подключается к сайту, чтобы проверять, есть ли новые сделки или нет. То есть забанит никто не может.

Если сделать обращение более редкими, то будет слишком много времени между тем, когда трейдер поставил сделку на сайте и тем, как сделка исполнится на платформе. 

Перебор идёт по 50 разным валютам. Переписывать так, чтобы 1 запрос получал данные с 50 разных пар в принципе можно, но велика возможность всяких ошибок.

Терминал тут не при чём. Кривую архитектуру с его стороны не вылечить.

Причина обращения: