Сервисы. Уже работают? - страница 19

 
Sergey Golubev:

Много лет назад в англ части в ветке (сейчас просто долго искать извиняюсь) был советник, который при торговле (и анализе рынка) генерировал и обновлял текстовый файл, который с определенной периодичностью считывал другой советник, работающий на том же Метатрейдере, но на другой паре (или на той же, но на другом графике). И оба торговали, общаясь друг с другом этим файлом.

У меня так сделано для общения скальпера-master с скальперами-slave на других терминалах. Но там передаются только команды управления от трейдера, чтобы одни и те же кнопки на всех терминалах вручную не щелкать. Хотя ничто не мешает передавать и данные.

Можно общаться через memory mapping, то тогда прощай маркет

 

Много работаю с кастомными символами. Почти всегда нужно грохнуть кастомный, но делать это приходится руками. Решил автоматизировать.

И оказалось, что это как раз сценарий для Сервиса. Возможно, это не совсем стандартный подход к Сервисам, но мне нужен был скрипт, который не привязан к чартам. И вот почему

// Удаляет символ активного графика из Обзора рынка (кастомный - удаляет полностью).

#property service

// Находит чарт в фокусе.
long GetFocusChart()
{
  long Chart = ChartFirst();

  for (; Chart != -1; Chart = ChartNext(Chart))
    if (ChartGetInteger(Chart, CHART_BRING_TO_TOP))
      break;

   return(Chart);
}
   
// Удаляет чарты символа.
int DeleteCharts( const string Symb )
{
  int Res = 0;
  
  for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart))
    if (ChartSymbol(Chart) == Symb)
      Res += ChartClose(Chart);
  
  return(Res);
}

// Удаляет символ из Обзора рынка (кастомный - удаляет полностью).
bool DeleteSymbol( const string Symb )
{
  DeleteCharts(Symb);

  return(SymbolSelect(Symb, false) && (!SymbolInfoInteger(Symb, SYMBOL_CUSTOM) || CustomSymbolDelete(Symb)));
}

void OnStart()
{
  const long Chart = GetFocusChart();
  
  if (Chart != -1)
    DeleteSymbol(ChartSymbol(Chart));
}

 

Думал, повесить на этот скрипт/сервис горячую клавишу и прибивать символ через нее, когда вижу чарт неугодного символа. Было бы очень удобно. Однако столкнулся с трудностями.

  • Невозможно повесить горячую клавишу на Сервис.
  • Чтобы Сервис повторно запустить, нужно его перед этим удалить. Предполагалось, что это нужно для запуска Сервисов на первом этапе старта Терминала. Но у меня другой случай.
  • SymbolSelect не срабатывает - не может удалить символ. Баг, видимо.
По итогу облом. Возможно ли как-то порешать практическую сторону Сервисов?


ЗЫ Есть обходной путь решения задачи удаления символа активного чарта.

 
fxsaber:

Много работаю с кастомными символами. Почти всегда нужно грохнуть кастомный, но делать это приходится руками. Решил автоматизировать.

И оказалось, что это как раз сценарий для Сервиса. Возможно, это не совсем стандартный подход к Сервисам, но мне нужен был скрипт, который не привязан к чартам. И вот почему

 

Думал, повесить на этот скрипт/сервис горячую клавишу и прибивать символ через нее, когда вижу чарт неугодного символа. Было бы очень удобно. Однако столкнулся с трудностями.

  • Невозможно повесить горячую клавишу на Сервис.
  • Чтобы Сервис повторно запустить, нужно его перед этим удалить. Предполагалось, что это нужно для запуска Сервисов на первом этапе старта Терминала. Но у меня другой случай.
  • SymbolSelect не срабатывает - не может удалить символ. Баг, видимо.
По итогу облом. Возможно ли как-то порешать практическую сторону Сервисов?


ЗЫ Есть обходной путь решения задачи удаления символа активного чарта.

Невозможно повесить горячую клавишу на Сервис, потому что там не работает функция OnChartEvent(); Но, полагаю Вы в курсе. Значит, советник должен работать с горячими клавишами и через ресурсы перередавать в Сервис комманды. Попробуйте управлять сервисом через ресурсы.

ЗЫ. Конечно, при этом теряется смысл использования Сервиса. Ведь можно из советника закрывать чарты при нажатии на горячие клавиши... 

ЗЫЫ. Единственный смысл в том, чтобы не плодить лишний функционал в советниках. Скидываем общий функционал разных совеников в Сервис и обращаемся к нему через ресурс. Даем комманду что делать.

 
Реter Konow:

Невозможно повесить горячую клавишу на Сервис, потому что там не работает функция OnChartEvent()


 
fxsaber:


Спасибо. Тогда в чем проблема?

Вам же нужно, чтобы сам Сервис (работающий нон-стоп) реагировал на нажатия клавиш. 

 
Реter Konow:

Спасибо. Тогда в чем проблема?

Вам же нужно, чтобы сам Сервис (работающий нон-стоп) реагировал на нажатия клавиш. 

Нет. Нужно, чтобы Сервис мог работать в режиме Скрипта без привязки к чарту.

 
fxsaber:

Нет. Нужно, чтобы Сервис мог работать в режиме Скрипта без привязки к чарту.

А разве он работает как то иначе?

 
Реter Konow:

А разве он работает как то иначе?

Да.

 
fxsaber:

Да.

Чтобы он мог управлять любым чартом? Легко. 

 
Сервис оперирует данными(котировками) с возможностью их корректировки, но не позволяет управлять чем-либо; в частности - окнами терминала, а нужно именно это. Отсюда очевидный вывод: при необходимости закрытия того, или иного окна, сервис генерирует очевидно невозможную котировку для этого окна, а скрипт, прикрепленный к этому окну, закрывает его при получении этой котировки.