Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

Input_Struct - библиотека для MetaTrader 5

Просмотров:
878
Рейтинг:
(4)
Опубликован:
2024.01.16 23:28
Обновлен:
2024.02.14 18:48
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Данная библиотека уменьшает рутинные действия при работе со входными параметрами.


ООП.

В качестве примера использования возьмем торговый советник. Разумно при написании торговой логики использовать ООП-подход, поскольку это облегчает встраивание ТС в более сложные системы.


Архитектурно ООП-советник для Тестера выглядит так.

    class SYSTEM
    {
    public:
      virtual void OnTick() {}
    
      // Входные данные выводятся в строку.
      virtual string ToString( void ) const = NULL;
      
      // Входные данные задаются строкой.
      virtual int FromString( const string Str ) = NULL;
    };
    
    SYSTEM* System = NULL;
    
    void OnInit()
    {
      System = new SYSTEM;
    }
    
    void OnTick()
    {
      System.OnTick();
    }
    
    void OnDeinit( const int )
    {
      delete System;
    }

    Этот советник ничего не делает. Но когда заходит речь не о торговой логике, а лишь только о работе со входными параметрами, код серьезно разрастается, что ухудшает читаемость и повышает вероятность ошибки. Фактически требуется производить неприятную рутинную работу.


    Все входные параметры в виде строки.

    Немного отвлечемся на выделенные в коде строки.

    Торговая практика показывает, что входные параметры удобно сохранять/читать в строковом виде, чтобы можно было быстро и наглядно видеть интересуемые (найденные) наборы входных параметров.

    Amount = 1, Count = 2, Period = 3, Koef = 4.5, Log = 6.7, Flag = true
    Amount = 2, Count = 3, Period = 4, Koef = 4.56, Log = 7.89, Flag = false

    Например, в тексте выше два набора входных параметров.


    ООП-классика работы со входными параметрами.

    input int inAmount = 1;
    input int inCount = 2;
    input int inPeriod = 3;
      
    input double inKoef = 4.56;
    input double inLog = 7.89;
      
    input bool inFlag = true;
    
    struct INPUT_STRUCT
    {
      int Amount;
      int Count;
      int Period;
      
      double Koef;
      double Log;
      
      bool Flag;
      
      string ToString( void ) const
      {
        string Str = NULL;
    
      #define TOSTRING(A) Str += (::StringLen(Str) ? ", " : NULL ) + #A + " = " + (string)(this.A);
        TOSTRING(Amount);
        TOSTRING(Count);
        TOSTRING(Period);
    
        TOSTRING(Koef);
        TOSTRING(Log);
        
        TOSTRING(Flag);
      #undef TOSTRING
        
        return(Str);
      }
      
      // Не стал писать.
      int FromString( const string Str )
      {
        return(0);
      }  
    } inInputs = {inAmount, inCount, inPeriod, inKoef, inLog, inFlag};
    
    #include <fxsaber\Input_Struct\Example_OnTick.mqh>
    
    void EXAMPLE::OnTick( void )
    {
      // Код Системы...
      // this.Inputs содержит входные параметры.
    }

    Выше громоздкий код - все тот же советник-пустышка, но только с добавлением (выделенный текст) работы со входными параметрами. Код неприятный, да еще и без реализации важного метода INPUT_STRUCT::FromString.

    Если захотите добавить/убрать один входной параметр, то придется в пяти местах этого кода делать соответствующие изменения. И так каждый раз!


    ООП-альтернатива работы со входными параметрами.

    #include <fxsaber\Input_Struct\Input_Struct.mqh> // Структура входных параметров.
    INPUT_STRUCT inInputs;
    
    MACROS_INPUT(int, Amount, 1);
    MACROS_INPUT(int, Count, 2);
    MACROS_INPUT(int, Period, 3);
    
    MACROS_INPUT(double, Koef, 4.56);
    MACROS_INPUT(double, Log, 7.89);
    
    MACROS_INPUT(bool, Flag, true);
    
    #include <fxsaber\Input_Struct\Example_OnTick.mqh>
    
    void EXAMPLE::OnTick( void )
    {
      // Код Системы...
      // this.Inputs содержит входные параметры.
    }

    Выделенного текста стало заметно меньше. При этом все методы реализованы.


    Сценарии использования.

    • Минимальные время и вероятность ошибки при изменении набора входных параметров.
    • Больше уделения времени торговой логике, а не техническим особенностям.
    • Сохранение/чтение наборов входных параметров через строку.
    • Значительное упрощение написания сложных систем (портфели и т.д.).
    • Легкое подключения кастомных алгоритмов оптимизации.

    Обратите внимание, что при ООП-подходе много повторяющегося текста можно спрятать в mqh-файлы - как это сделано в обоих примерах выше. ООП может быть еще и лаконичным.


    Особенности.

    • Предложенная структура входных параметров является простой, что значительно расширяет возможности применения.
    • "Измененные" структуры могут передаваться друг в друга через оператор присваивания. И всегда имеют один и тот же размер.
    • Библиотека кроссплатформенная.
    MA Price display MA Price display

    Индикатор написан по просьбе по просьбе на форуме.

    MT4Orders QuickReport MT4Orders QuickReport

    Быстрая JavaScript версия библиотеки Report от fxsaber для торговых команд в стиле MT4 реализованных через MT4Orders или Virtual. Работает до 10 раз быстрее, размер НТМL файлов меньше, может выгрузить и отобразить до 5.4 млн. строк отчета.

    Simple_Pending_Orders_Time Simple_Pending_Orders_Time

    Советник работает с отложенными ордерами Buy Stop и Sell Stop по времени, заданному в его входных параметрах.

    Simple_Price_EA Simple_Price_EA

    Простейший советник, который анализирует движение цены на заданном количестве баров и открывает соответствующую позицию.