// Индикатор обрубает все попытки торговли через советники. Разрешает только руками торговать.// Чтобы не было соблазна отключить его во время работы Терминала, индикатор находится в невидимом режиме.#property indicator_chart_window#property indicator_buffers0#property indicator_plots0#include <Symbol.mqh> // https://www.mql5.com/ru/code/18855#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003void MyAlert( conststring Str )
{
string StrArray[];
for (int i = StringSplit(Str, '\n', StrArray) - 1; i >= 0; i--)
Alert(StrArray[i]);
}
bool NextOnCalculate( conststring SymbName = NULL )
{
const SYMBOL Symb(SymbName);
MqlRates Rates[1] = {0};
Rates[0].time = TimeCurrent();
return(Symb.IsCustom() ? Symb.CloneRates(Rates) : ChartSetSymbolPeriod(0, _Symbol, _Period));
}
const SYMBOL SymbTimer("Timer");
voidOnInit()
{
if (_Symbol == SymbTimer.Name)
ChartIndicatorGet(0, 0, ChartIndicatorName(0, 0, 0));
elseif (SymbTimer.IsExist() && SymbTimer.On() && NextOnCalculate(SymbTimer.Name))
{
iCustom(SymbTimer.Name, PERIOD_CURRENT,
".." + StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5));
SymbTimer.Off();
}
}
string GetExpertData( constulong Chart = 0 )
{
string Str = NULL;
MqlParam Parameters[];
string Names[];
if (EXPERT::Parameters(Chart, Parameters, Names))
{
Str += "\n" + ::ChartSymbol(Chart) + " " + ::EnumToString(::ChartPeriod(Chart)) + " " + Parameters[0].string_value + "\n";
constint Amount = ::ArraySize(Names);
for (int i = 0; i < Amount; i++)
Str += (string)i + ": "+ Names[i] + " = " + Parameters[i + 1].string_value + "\n";
}
return(Str);
}
void Active( constint AlertTime = 5 )
{
staticconstuint StartTime = GetTickCount();
staticuint PrevInterval = 0;
constuint Interval = (GetTickCount() - StartTime) / 1000;
conststring Str = MQLInfoString(MQL_PROGRAM_NAME) + ": I've been watching you for " + TimeToString(Interval, TIME_SECONDS);
long Chart = ChartFirst();
if (Chart != -1)
do
{
if (EXPERT::Is(Chart))
MyAlert(GetExpertData(Chart) + "Removed - " + (string)EXPERT::Remove(Chart));
ChartSetString(Chart, CHART_COMMENT, Str);
ChartRedraw(Chart);
}
while ((Chart = ChartNext(Chart)) != -1);
elseif (!(Interval % AlertTime) && (Interval != PrevInterval))
{
MyAlert(Str);
PrevInterval = Interval;
}
}
intOnCalculate( constint, constint, constint, constdouble &[] )
{
staticint i = 0;
if ((_Symbol == SymbTimer.Name) && NextOnCalculate())
Active();
elseif (i++ > 0)
ChartIndicatorDelete(0, 0, ChartIndicatorName(0, 0, ChartIndicatorsTotal(0, 0) - 1));
return(0);
}
ЗЫ Если перезагружать Терминал, то можно иногда столкнуться (MT5 build 1881) с его зависанием в процессах. Побороть возможно насильным снятием соответствующего процесса terminal64.exe и удалением MetaTrader 5\Bases\Custom\history\Timer\*.hcc.
В наше время информационных технологий использование различных роботов и электронных экспертов для торговли на финансовых рынках стало довольно обычным явлением. Главными преимуществами электронных экспертов принято считать безукоризненное выполнение алгоритма и безустанная работа 24 часа в сутки. Для их круглосуточного использования арендуются...
Т.е. сохраняем шаблон графика, считываем его, распарсиваем и находим имя эксперта. Костыль ещё тот, но работает пока (около пары месяцев) исправно. Полагаю, что в случае использования обычного HDD слишком часто баловаться этим не следует (к примеру, на каждом тике). Надеюсь, когда-нибудь в MQL4 появится CHART_EXPERT_NAME
Он не очень похож на мой вариант использования. Основной вопрос по примеру - что будет если название музыкального файла указывать в параметре скрипта, а не кидать через глобальные переменные? Могу скинуть свой проект в личку.
Он не очень похож на мой вариант использования. Основной вопрос по примеру - что будет если название музыкального файла указывать в параметре скрипта, а не кидать через глобальные переменные?
Совсем не помню причины, но вариант со входным параметром напрашивается сразу. Раз в примере так вывернулся, видимо, в этом состоит ограничение MT5.
О, эти русские хакеры... Ну зачем останавливать все эксперты, если слегка просрали?
Кстати, у тебя еще и ошибка. Static не работает.
Кстати, у тебя еще и ошибка. Static не работает.
Не увидел здесь ошибки
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопросы от начинающих MQL5 MT5 MetaTrader 5
fxsaber, 2018.08.02 17:09
ЗЫ Если перезагружать Терминал, то можно иногда столкнуться (MT5 build 1881) с его зависанием в процессах. Побороть возможно насильным снятием соответствующего процесса terminal64.exe и удалением MetaTrader 5\Bases\Custom\history\Timer\*.hcc.
В Статье автор очень подробно осветил нюансы результатов исполнения данной библиотеки. Рекомендую ознакомиться.
В МТ4, как оказалось, отсутствует намного больше, чем FileSave и FileLoad (которые пишутся в 3 строках каждая):
У себя, в составе некоего проекта, я решил это так (тегом "name" как раз):
Где SubstringParser имеет такой код:
Т.е. сохраняем шаблон графика, считываем его, распарсиваем и находим имя эксперта. Костыль ещё тот, но работает пока (около пары месяцев) исправно. Полагаю, что в случае использования обычного HDD слишком часто баловаться этим не следует (к примеру, на каждом тике). Надеюсь, когда-нибудь в MQL4 появится CHART_EXPERT_NAME
Будет ли новая версия с поддержкой запуска скриптов?
Этот пример не работает?
Этот пример не работает?
Он не очень похож на мой вариант использования. Основной вопрос по примеру - что будет если название музыкального файла указывать в параметре скрипта, а не кидать через глобальные переменные? Могу скинуть свой проект в личку.
Он не очень похож на мой вариант использования. Основной вопрос по примеру - что будет если название музыкального файла указывать в параметре скрипта, а не кидать через глобальные переменные?
Совсем не помню причины, но вариант со входным параметром напрашивается сразу. Раз в примере так вывернулся, видимо, в этом состоит ограничение MT5.