Попробовал создать Service, запускаю он стартует и завершается.

 

Привет

Создал сервис, в котором читаю котировку Brend с сайта и передаю в пользовательский символ.

сервис стартует при пуске MT5 , отрабатывает один раз и завершается.

2020.03.23 21:38:04.253    Services    service 'sSymbolBrent' started
2020.03.23 21:38:05.115    Services    service 'sSymbolBrent' stopped

т. е. принимает одну котировку при старте

Как я понимаю сервис просто отрабатывает один раз.

Вообще идея использовать Сервисы для загрузки котировок в on-line возможно ?   Или использовать советник?, что не очень удобно.


код скрипта

//+------------------------------------------------------------------+
//|                                                 sSymbolBrent.mq5 |
//|                                             Copyright 2018,YuraZ |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property service
#property copyright "Copyright 2018,YuraZ"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Service program start function                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   get();
  }
void get(void)
  {
   string cookie=NULL,headers;
   char   post[],result[];
   string url="https://quoteorg.fxclub.org/info/ru";
//--- для работы с сервером необходимо добавить URL "https://quoteorg.fxclub.org"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
//--- обнуляем код последней ошибки
   ResetLastError();
//--- загрузка html-страницы с Yahoo Finance
   int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
   if(res==200)
     {
      //     {"code":"BRN","name":"Brent Crude Oil","tradable":true,"rate":26.13,"dailyTradedTotalVolume"
      //    int filehandle=FileOpen("yz_Brent_.htm",FILE_WRITE|FILE_BIN);
      //    if(filehandle!=INVALID_HANDLE)
      //      {
      //       //   //--- сохраняем содержимое массива result[] в файл
      //       FileWriteArray(filehandle,result,0,ArraySize(result));
      //       //   //--- закрываем файл
      //       FileClose(filehandle);
      //      }
      string strPars = CharArrayToString(result,0,-1);
      string Brent;
      int iPos1 = StringFind(strPars,"\"code\":\"BRN\",\"name\":\"Brent Crude Oil\",\"tradable\":true,\"rate\":",0); // Найдем начало цены
      if(iPos1 !=0)
        {
         strPars = StringSubstr(strPars, iPos1+61, 500);
         int iPos2 = StringFind(strPars,",\"dailyTradedTotalVolume\"",0);  // найдем <tr class="frow">
         Brent =  StringSubstr(strPars,0, iPos2) ; // вырезаем дивиденды
         printf("[%s]", Brent); //, iPos1 , iPos2 , strPars   );
        }
      double TickBrend ;
      TickBrend = StringToDouble(Brent);
      MqlTick AddTicks[1];
//      MqlRates rates[];
//      ArrayResize(rates,2);
      //ArraySetAsSeries(rates,true);
      datetime time_current= TimeCurrent();
       //rates[0].time        = time_current;   // время начала периода
       //rates[0].tick_volume = 1;              // тиковый объем
       //// rates[1].time        = time_current-60;// время начала периода
       //// rates[1].tick_volume = 1;              // тиковый объем
       // rates[0].close =TickBrend ;              // тиковый объем
       // rates[0].open =TickBrend ;              // тиковый объем
       // rates[0].high =TickBrend ;              // тиковый объем
       // rates[0].low =TickBrend ;              // тиковый объем

      AddTicks[0].time = time_current;
      AddTicks[0].time_msc = time_current*1000;

      AddTicks[0].ask = TickBrend;
      AddTicks[0].bid = TickBrend;
      AddTicks[0].last = TickBrend;
      AddTicks[0].volume= 1;
      AddTicks[0].volume_real = 1;
      CustomTicksAdd("Brent", AddTicks);
//       CustomRatesUpdate( "Brent", rates);
     }
   else
     {
      printf("ERR ");
     }
   printf("TICK");
  }
 

Где то на форуме видел скрин на котором СЕРВИС находится в режиме старт т.е. как бы постоянно работает.

Получается надо циклить скрипт ?

void OnStart()
  {
     bool t = true;
     while ( t = true )
      get();
  }

после чего получил сервис в режиме вечного пуска.


 
Вроде да, как обычный скрипт работает.
 
Rorschach:
Вроде да, как обычный скрипт работает.

Понятно.  Неплохо, вроде вполне удачно можно создавать свои символы , если их нет у брокера, и обновлять тики  в on-line.  Правда не уверен что  бомбежка сайта запросами , с которого читаю котировки будет приятной для владельцев сайта.

 
Yuriy Zaytsev:

Понятно.  Неплохо, вроде вполне удачно можно создавать свои символы , если их нет у брокера, и обновлять тики  в on-line.  Правда не уверен что  бомбежка сайта запросами , с которого читаю котировки будет приятной для владельцев сайта.

Ну так бомбите с паузой, а ещё лучше - используйте websocket (скорее всего, сайт его поддерживает).
 
https://quoteorg.fxclub.org/info/ru?intervals=D1&symbols=BRN

Ну вот - похоже можно и свечи зачитывать

Ответ от сайта

{

    "status": "Success",
    "code": 200,
    "data": {
        "instruments": [
            {
                "code": "BRN",
                "name": "Brent Crude Oil",
                "interval": {
                    "D1": {
                        "o": 28.21,
                        "h": 30.94,
                        "l": 26.81,
                        "c": 27.38,
                        "p": -0.98612125639153
                    }
                },
                "tradable": true,
                "rate": 27.11,
                "dailyTradedTotalVolume": 0,
                "link": "https://libertex.fxclub.org/products/energetics/BRN/?lang=rus",
                "tradelink": "https://libertex.fxclub.org/products/energetics/BRN/?lang=rus#modal_newInvest_BRN"
            }
        ],
        "count": 1
    }

}
 
Serhii Shevchuk:
Ну так бомбите с паузой, а ещё лучше - используйте websocket (скорее всего, сайт его поддерживает).

Мысль интересная, скажем раз в секунду хотя бы.

Но тогда могу пропустить резкие движения.

 
Yuriy Zaytsev:

Мысль интересная, скажем раз в секунду хотя бы.

Но тогда могу пропустить резкие движения.

Я в своё время бомбил криптопию раз в секунду через пул из 5-ти прокси, получалось с одного адреса - раз в 5 секунд, за полгода ни разу не забанили.

Но разумно это делать через WebSockets - и бомбёжки нет, и не пропустите ничего.

 
Serhii Shevchuk:

Я в своё время бомбил криптопию раз в секунду через пул из 5-ти прокси, получалось с одного адреса - раз в 5 секунд, за полгода ни разу не забанили.

Но разумно это делать через WebSockets - и бомбёжки нет, и не пропустите ничего.

А есть пример кода MQl5 через WebSockets ?
 
Yuriy Zaytsev:
А есть пример кода MQl5 через WebSockets ?
У меня - нет. Пока только в планах. Но руки всё никак не дойдут, есть задачи поважнее.
 
В мт нет вебсокетов и говорят не будет(
Причина обращения: