Библиотеки: Input_Struct - страница 2

 

Добавлено перечисление.

Удобно использовать для визуализации нужного поля из БД.

#property script_show_inputs

#define iInput01 Num
#define dInput01 Koef

#include <fxsaber\Input_Struct\Input_Struct.mqh> // https://www.mql5.com/ru/code/47932

input bool inLoad = true;        // Load/Save
input ENUM_INPUT_STRUCT inIndex; // Выбор поля

void OnStart()
{
  INPUT_STRUCT Inputs[5];

  if (inLoad) // Прочли БД
    for (int i = (int)FileLoad(__FILE__, Inputs) - 1; i >= 0; i--)
      Print(Inputs[i][inIndex]); // Взяли нужное поле из БД
  else // Сохранили БД
  {
    Inputs[0] = "Num = 50, Koef = 1.023";
    Inputs[1] = "Num = 51, Koef = 1.123";
    Inputs[2] = "Num = 52, Koef = 1.223";
    Inputs[3] = "Num = 53, Koef = 1.323";
    Inputs[4] = "Num = 54, Koef = 1.423";
    
    FileSave(__FILE__, Inputs);
  }
}


Результат.


1.423
1.323
1.223
1.123
1.023


Самое простое применение - выбор поля из БД для формирования индикаторного буфера нужным значением.

 

fxsaber, извиняюсь, что не совсем по теме, но может вы сможете объяснить почему разработчики терминала так упорно отказываются от выпадающих меню в input параметрах? Все эти варианты со множеством параметров в одной строке конечно хороши, но у этого подхода есть один важный минус, их нельзя простым способом подключить к оптимизатору тестера.

И то, что вы доказываете, что при определенном подходе опытный(!) программист может сам замутить кастомный оптимизатор (хоть какую-то оптимизацию, прописав изменяемые параметры прямо в коде) тоже выглядит прекрасным... но блин почему все-таки не предлагается решения с менюшками? Была бы возможность делать выпадающие меню, можно было бы как угодно формировать любое(!) количество внешних параметров (в удобочитаемой и удобноиспользуемой форме), и все они при желании легко могли бы быть доступны в официальном оптимизаторе.

Почему этого не делают? Какова настоящая причина? Это же не должно быть сложным...

 
How Do I Add a Sinput Parameter?
 
hini #:
How Do I Add a Sinput Parameter?

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

Библиотеки: Input_Struct

fxsaber, 2024.02.14 19:39

#define TYPENAME_INPUT INPUT_STRUCT

#define MACROS_MULTI      \
  SINPUT(Amount, int, 1)  \
  SINPUT(Koef, double, 2)
 
  I tried it, but it didn't work. I modified it like this and it worked.
 
What is the purpose of the macro definition INPUT_STRUCT_ADDON_TMP ?
 

hini #:
  I tried it, but it didn't work. I modified it like this and it worked.

What is the purpose of the macro definition INPUT_STRUCT_ADDON_TMP ?

Я плохо объяснил использование данной библиотеки.


Допустим, вы решили написать MACD-советника. Тогда делаете следующие шаги.

  1. Создаете папку для исходников советника.
  2. Копируете туда Input_Struct.mqh.
  3. Переименовываете этот файл (в примере ниже это MACD_Input.mqh - прикреплен) и правите ТОЛЬКО его верхние строки.

#define TYPENAME_INPUT MACD_INPUT

#define MACROS_MULTI               \
  SINPUT(InpLots, double, 0.1)     \
  INPUT(InpTakeProfit, int, 50)    \
  INPUT(InpTrailingStop, int, 30)  \
  INPUT(InpMACDOpenLevel, int, 3)  \
  INPUT(InpMACDCloseLevel, int, 2) \
  INPUT(InpMATrendPeriod, int, 26)

/*
sinput double InpLots          =0.1; // Lots
input  int    InpTakeProfit    =50;  // Take Profit (in pips)
input  int    InpTrailingStop  =30;  // Trailing Stop Level (in pips)
input  int    InpMACDOpenLevel =3;   // MACD open level (in pips)
input  int    InpMACDCloseLevel=2;   // MACD close level (in pips)
input  int    InpMATrendPeriod =26;  // MA trend period
*/  


После этого подключаете этот mqh к советнику следующим образом (ООП-пример).

#define INPUT_STRUCT_ADDON
#include "MACD_Input.mqh"

// Вы можете менять список входных параметров в MACD_Input.mqh.
// При этом строки ниже останутся неизменными.

class SYSTEM
{
public: 
  SYSTEM( const string sInputs = NULL ) {}
  
  virtual void OnTick( void ) = NULL;
};

class MACD : public SYSTEM
{
private:
  MACD_INPUT Inputs;
  
public:
  MACD( const string sInputs = NULL ) : SYSTEM(sInputs)
  {
    this.Inputs.Default();
    this.Inputs = sInputs;
    
    Print(this.Inputs[]); // Распечатали содержимое структуры.
  }
  
  virtual void OnTick( void ) {}
};

SYSTEM* System = NULL;

void OnInit()
{
  System = new MACD(inInputsAll);
}

void OnDeinit( const int )
{
  delete System;
}

void OnTick()
{
  System.OnTick();
}


В Тестере этот советник будет выглядеть так.


Огромный исходник MACD_Input.mqh править не нужно. Об этом там прямым текстом написано.

// Copy-Paste update from here:

// INPUT_STRUCT_ADDON / INPUT_STRUCT_ADDON_WITHOUT_FILENAME
#define DINPUT(NAME, TYPE, DEFAULT)                             // disable input
#define _INPUT(NAME, TYPE, DEFAULT)                             // input without struct
#define SINPUT(NAME, TYPE, DEFAULT) MACROS(NAME, TYPE, DEFAULT) // sinput
#define  INPUT(NAME, TYPE, DEFAULT) MACROS(NAME, TYPE, DEFAULT) // input
#define  GROUP(NAME)                                            // group

#define MACROS_ENUM_NAME(A) MACROS_ENUM_NAME2(A)
#define MACROS_ENUM_NAME2(A) ENUM_##A

enum MACROS_ENUM_NAME(TYPENAME_INPUT)
{
#define MACROS(A, B, C) A,
  MACROS_MULTI
#undef MACROS
};

struct TYPENAME_INPUT
....

Меняются только верхние строки задания входных параметров.

Файлы:
MACD_Input.mqh  35 kb
 
Thank you for your response. Yes, I am aware of how to use the library in general. What I hope to achieve is that the parameters used with do not participate in the optimizer of the MT5 tester. I looked at your screenshot, could you please turn on the optimization switch in the MT5 Tester and let me know if can be checked off? SINPUT SINPUT(InpLots, double, 0.1)
 
hini #:
could you please turn on the optimization switch in the MT5 Tester and let me know if can be checked off? SINPUT SINPUT(InpLots, double, 0.1)

Это sinput-параметр.

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

Библиотеки: Input_Struct

fxsaber, 2024.07.31 08:24

#define TYPENAME_INPUT MACD_INPUT

#define MACROS_MULTI               \
  SINPUT(InpLots, double, 0.1)     \
  INPUT(InpTakeProfit, int, 50)    \
  INPUT(InpTrailingStop, int, 30)  \
  INPUT(InpMACDOpenLevel, int, 3)  \
  INPUT(InpMACDCloseLevel, int, 2) \
  INPUT(InpMATrendPeriod, int, 26)
 
Thank you, I made a mistake; I didn't add  #define INPUT_STRUCT_ADDON . Also, there's another question: do I need to copy a new  Input_Struct.mqh  file every time I create a new EA? Can I use a shared file instead?