Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1011

 
Sergey Likho:

Как лучше написать алгоритм?


Задача: 

Один советник запускается на разных графиках.

Нужно чтоб в отдельный файл писалась по минутам информация о счете про Баланс, эквити и т.д.

Сейчас получается, что все советники в один файл пишут всю инфу. В итоге, получается много лишних записей. 

Какое можно придумать оригинальное решение, чтоб в файл записи делал только один бот. (А если его например удалили, то записи начинал делать другой бот и т.д.)

Создать графический объект в OnInit() с названием эксперта или любой другой, возможно эксперт уже создаёт объект, то можно использовать его, предположим "MyEA":  ObjectCreate(0,"MyEA",OBJ_...,...))

В OnTick() где идёт запись в файл проверять на каком первом ID-графика есть эта самая метка = значит это самый первый эксперт который установлен в терминале, дальше нас уже не интересует.

Используем перебор:

string ChartGetSymb()
  {
   string symb="";
   long chartID=ChartFirst();
   while(chartID!=-1) 
    {
      if(ObjectGetString(chartID,"MyEA",OBJPROP_NAME)=="MyEA")
       {
        symb=ChartSymbol(chartID);
        break;
       }
      chartID=ChartNext(chartID);
     }
   return(symb);
  }

Получили первый попавшийся график/символ, на котором установлен эксперт

Далее перед записью в файл сравниваем на то, что это первый эксперт:

if(ChartGetSymb() == Symbol()) {
  записываем в файл, если соответствует символу, иначе не записываем
}


Конструкция не лёгкая, но лучше чем дёргать диск записью в глобальную переменную 

 
Artyom Trishkin:

Возьмите стандартную МА, измените тип данных буфера, скомпилируйте и проверьте в окне данных терминала (Ctrl+D)

Этобы не помогло, поскольку в терминале они бы не отображались. Но я проверил на индикаторе ZigZag у которого есть два дополнительных буфера для High и Low, объявленные как INDICATOR_CALCULATIONS. Они из программы тоже берутся, хоть в терминале и не отображаются. Спасибо за совет в любом случае.
 
Sergey Likho:

В глобальные переменные терминала записывается ChartID() с ошибкой. что за ерунда?


Попробуйте такой код:


Результат выполнения этого кода

2019.11.29 15:22:07.453 Script 00 EURUSD,H1: removed
2019.11.29 15:22:07.453 00 EURUSD,H1: uninit reason 0
2019.11.29 15:22:07.453 00 EURUSD,H1: GVAR id:131992895281608496 GV_id:131992895281608496
2019.11.29 15:22:07.453 00 EURUSD,H1: initialized
2019.11.29 15:22:07.433 Script Test\00 EURUSD,H1: loaded successfully
 
Vitaly Muzichenko:

Создать графический объект в OnInit() с названием эксперта или любой другой, возможно эксперт уже создаёт объект, то можно использовать его, предположим "MyEA":  ObjectCreate(0,"MyEA",OBJ_...,...))

В OnTick() где идёт запись в файл проверять на каком первом ID-графика есть эта самая метка = значит это самый первый эксперт который установлен в терминале, дальше нас уже не интересует.

Используем перебор:


Получили первый попавшийся график/символ, на котором установлен эксперт

Далее перед записью в файл сравниваем на то, что это первый эксперт:


Конструкция не лёгкая, но лучше чем дёргать диск записью в глобальную переменную 

Да, хорошая идея. 

Благодарю. 


Вопрос тогда такой: Как быть, если  советник был удален (например из-за ошибки) а объект остался. Как быть, если график закрыт целиком, то нужно как-то переназначить "главного" эксперта?

 
Sergey Likho:

Да, хорошая идея. 

Благодарю. 


Вопрос тогда такой: Как быть, если  советник был удален (например из-за ошибки) а объект остался. Как быть, если график закрыт целиком, то нужно как-то переназначить "главного" эксперта?

Ошибка в едином случае - если эксперт аварийно удалился и остался объект, но такого в мт4 на своей памяти не помню. Во всех остальных случаях главный эксперт будет переназначен, проверка то идёт в ОнТике, и будет всегда поиск актуального графика


P.S. Попробуйте проверить, что выдаст OnDeInit() при ошибке в эксперте и самоудалению с графика. Проверить наверное можно просто, создать переменную и считать тики, на 11 тике разделить 10/0

В OnDeInit() поставить Принт и посмотреть какая будет причина деинициализации, если она будет, то по этой причине/номеру удалять объект "MyEA" с графика

t++;
if(t > 10) {
 int e = 10;
 e /= 0;
}

Можете отписать о результате, так как самому проверить нет времени

 
Vitaly Muzichenko:

Создать графический объект в OnInit() с названием эксперта или любой другой, возможно эксперт уже создаёт объект, то можно использовать его, предположим "MyEA":  ObjectCreate(0,"MyEA",OBJ_...,...))

В OnTick() где идёт запись в файл проверять на каком первом ID-графика есть эта самая метка = значит это самый первый эксперт который установлен в терминале, дальше нас уже не интересует.

Используем перебор:


Получили первый попавшийся график/символ, на котором установлен эксперт

Далее перед записью в файл сравниваем на то, что это первый эксперт:


Конструкция не лёгкая, но лучше чем дёргать диск записью в глобальную переменную 

Я думаю вы ошибаетесь. GV не пишутся на диск каждый раз. Иначе не нужна была-бы функция принудительной записи GV на диск.

void  GlobalVariablesFlush();
Да плюс ко всему перебирать все графики в поисках советника и объекта... Виталий, это жесть...
 
Alexey Viktorov:

Я думаю вы ошибаетесь. GV не пишутся на диск каждый раз. Иначе не нужна была-бы функция принудительной записи GV на диск.

Да плюс ко всему перебирать все графики в поисках советника и объекта... Виталий, это жесть...

Ещё как пишутся: GlobalVariableSet("GV",ID);

profiles -> gvariables.dat

 

 
Vitaly Muzichenko:

Ещё как пишутся: GlobalVariableSet("GV",ID);

profiles -> gvariables.dat

 

При создании может быть и да, но при перезаписи до отключения приложения которое туда пишет, надо проверять. А мне лениво. Всё-же чисто теоретически, если-бы каждый раз писалось на диск, то вышеуказанная функция просто погремушка.

 
Sergey Likho:

Так нельзя. 

Поищите программу для винды, которая синхронизирует данные в папках. И настройте так, чтоб советник автоматом копировался в новый терминал

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

 
Seric29:

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

Обратите внимание в этом сообщении на слова "У всех терминалов есть общие папки."

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Так всё же, к чему привязывается продукт из маркета?

Сергей Таболин, 2019.11.23 08:17

Вы серьёзно думаете, что я не знаю как и куда нужно устанавливать? )))

У всех терминалов есть общие папки

Я скачал бесплатный индикатор из маркета. Он привязывается к железу.

Так почему на одном железе он работает в одном терминале, но не работает в другом?

Очевидный вывод - привязывается, по крайней мере, не только к железу...


Поищите информацию о том как это делается и в путь... Это называется линковка папок.

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