или как проверить, что эта утилита уже запущена?
Использовать глобальную переменную терминала?
Можно использовать такой подход: при запуске создаем на графике 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; }
Здравствуйте!
Написал утилиту, которая должна быть только одна на терминале.
Поэтому вопрос: "Как получить список советников, запущенных на терминале?"
или как проверить, что эта утилита уже запущена?
перебрать чарты через ChartFirst(), ChartNext() для каждого спросить ChartGetString(chartID,CHART_EXPERT_NAME); Будет список экспертов
А вдогонку!
Как проверить какие сервисы запущена?
ChartGetString(chartID, ??? );
есть только CHART_EXPERT_NAME , CHART_SCRIPT_NAME ?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте!
Написал утилиту, которая должна быть только одна на терминале.
Поэтому вопрос: "Как получить список советников, запущенных на терминале?"
или как проверить, что эта утилита уже запущена?