Думал графические объекты имеются в виду - удивился и стал смотреть. Оказалось объекты классов) И в чем новизна?
Да просто хороший подход к реализации в статье, ничего нового, просто не плохое решение задачи.
Ваша статья была очень хорошей 😁 ... но, как вы упомянули, есть небольшая проблема, связанная с производительностью. В большинстве случаев это ни на что не влияет, и вы можете жить с этим без проблем. Но в моменты сильной волатильности система может упасть или работать очень медленно из-за большого количества вызовов, которые может получить OnCalculate. Но проблема не в функции, а во взаимодействиях, которые происходят внутри нее. Ведь при каждом вызове MetaTrader будет вынужден считывать буфер индикаторов, и если их количество велико, то могут возникнуть проблемы. Одним из способов решения этой проблемы было бы использование вызова OnTime, чтобы немного облегчить нагрузку, так как вызовы будут выполняться не при каждом событии расчета, а в течение заданного периода времени. Если речь идет о ручном или полуавтоматическом управлении, это не будет проблемой, поскольку каждое вычисление может выполняться, например, в течение 200 миллисекунд. Но использовать события OnTime в индикаторах не очень удобно, так как они могут повлиять на поток вычислений, особенно если рынок очень волатилен. Одним из способов решения этой проблемы может быть принудительное выполнение вычислений в самом OnCalculate, чтобы не делать вызовов CopyBuffer. Еще один момент, который позволит снизить потребление процессора на несколько машинных циклов, - это изменение следующей строки в функции OnCalculate:
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit = MathMax(0, prev_calculated-1);
для этого:
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit = (prev_calculated <= 0 ? 0 : prev_calculated - 1);
Может показаться, что это не так много, но использование троичного оператора в данном случае будет более эффективным, чем вызов функции. Эти маленькие детали имеют большое значение в периоды высокой волатильности ... 😁👍
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Простое создание сложных индикаторов с помощью объектов:
В статье представлен метод создания сложных индикаторов, позволяющий избежать проблем при работе с несколькими графиками и буферами, а также при объединении данных из нескольких источников.
Финальный результат выглядит так:
Автор: Manuel Alejandro Cercos Perez