Как получить список советников, запущенных на терминале?

 

Здравствуйте!

Написал утилиту, которая должна быть только одна на терминале.

Поэтому вопрос: "Как получить список советников, запущенных на терминале?"

или как проверить, что эта утилита уже запущена?

 
Aleksander Gladkov:
или как проверить, что эта утилита уже запущена?

Использовать глобальную переменную терминала?

https://www.mql5.com/ru/docs/globals

 

Можно использовать такой подход: при запуске создаем на графике Label с определённым названием, если такой метки ни на одном из открытых графиков ещё нет. Если же она уже есть, то этот экземпляр завершаем.

В коде это может выглядеть примерно так:

#include <Controls\Label.mqh>

string         lockLabelName;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   ...
    
   lockLabelName = "SomeIdentifier";

   long chartID = FindLock(lockLabelName);
   if(chartID > 0 && chartID != ChartID()) {
      res = INIT_FAILED;
   } else {
      CreateLock(lockLabelName);
      ...

   }

   return res;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
   
... 

   if(reason != REASON_INITFAILED) {
      DestroyLock();
   }
   ChartRedraw();
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
//---
   if(ObjectFind(0, lockLabelName) == -1) {
      if(!CreateLock(lockLabelName)) {
         return;
      }
   }


   ... 
}

bool CreateLock(string p_lockLabelName) {
   if(!labelLock.Create(0, p_lockLabelName, 0, 0, 0, 1, 1))
      return(false);
   return(true);
}

void DestroyLock() {
   labelLock.Destroy();
}

long FindLock(string p_lockLabelName) {
   long currChart, prevChart = ChartFirst();
   int i = 0, limit = 1000;

   currChart = prevChart;

   while(i < limit) { // у нас наверняка не больше 1000 открытых графиков
      if(ObjectFind(currChart, p_lockLabelName) != -1) {
         return currChart;
      }
      currChart = ChartNext(prevChart); // на основании предыдущего получим новый график
      if(currChart < 0)
         break;        // достигли конца списка графиков
      prevChart = currChart; // запомним идентификатор текущего графика для ChartNext()
      i++;
   }

   return -1;
}
 
Aleksander Gladkov:

Здравствуйте!

Написал утилиту, которая должна быть только одна на терминале.

Поэтому вопрос: "Как получить список советников, запущенных на терминале?"

или как проверить, что эта утилита уже запущена?

перебрать чарты через ChartFirst(), ChartNext() для каждого спросить ChartGetString(chartID,CHART_EXPERT_NAME); Будет список экспертов

 
Maxim Kuznetsov #:

перебрать чарты через ChartFirst(), ChartNext() для каждого спросить ChartGetString(chartID,CHART_EXPERT_NAME); Будет список экспертов

Когда-то давно пробовал, получал пустые строки, кроме текущего графика. Может, сейчас что поменялось.

 
Maxim Kuznetsov #:

перебрать чарты через ChartFirst(), ChartNext() для каждого спросить ChartGetString(chartID,CHART_EXPERT_NAME);

Спасибо, попробую!

Все работает, огромное спасибо!

 

А вдогонку!

Как проверить какие сервисы запущена?

ChartGetString(chartID, ??? );   

есть только  CHART_EXPERT_NAME , CHART_SCRIPT_NAME ?

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