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

 
hini #:

Можно использовать только разные имена переменных? Например, начальный лот. Я хочу, чтобы название параметра для всех стратегий было одинаковым — InitialLot, чтобы не нужно было придумывать разные имена для каждой стратегии, да и это не обязательно.

Если у вас одинаковое имя (и функционал) для разных ТС, то подключайте этот input через один и тот же mqh.

У меня в боевой ТС для задействования всех входных параметров используется около десятка соответствующих mqh. Это очень удобно!

 
fxsaber #:

Если у вас одинаковое имя (и функционал) для разных ТС, то подключайте этот input через один и тот же mqh.

У меня в боевой ТС для задействования всех входных параметров используется около десятка соответствующих mqh. Это очень удобно!

Стратегии имеют одинаковые функции, но содержание различается.

//--- input parameters
namespace name_of_space { 
  #define name_of_space_AAA aaa
  input string            title_ea_options = "=== EA Options1 ==="; //strategy1
  input double            initialLot = 0.01; //strategy1 Lot
  struct A {
    int aa;
  };
}
namespace name_of_space2 { 
  #define name_of_space2_AAA aaa
  input string            title_ea_options = "=== EA Options2 ==="; //strategy2
  input double            initialLot = 0.02; //strategy2 Lot
  struct A {
    int aa;
  };
}
int name_of_space2_AAA;
name_of_space2::A a;

int OnInit() {
  Print(name_of_space::initialLot);
  Print(name_of_space2::initialLot);
  Print(aaa);
  
  return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) {

}
void OnTick() {

}


 
hini #:

Стратегии имеют одинаковые функции, но содержание различается.

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

Мне нужно, чтобы можно было элементарно создавать новые ТС для Тестера и добавлять их в портфель ТС боевого советника.


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

Это основная причина, почему была написана данная библиотека.

 
Библиотека обновлена под изменения MQL5_b5200+.
Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Версия MetaTrader 5 расширила поддержку библиотеки линейной алгебры OpenBLAS.
Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Версия MetaTrader 5 расширила поддержку библиотеки линейной алгебры OpenBLAS.
  • 2025.07.31
  • www.mql5.com
SylvesterEquationTriangular решает уравнение Сильвестра для вещественных квазитреугольных или комплексных треугольных матриц верхнетреугольные. SylvesterEquationTriangularBlocked решает уравнение Сильвестра для вещественных квазитреугольных или комплексных треугольных матриц верхнетреугольные матрицы
 

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

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

fxsaber, 2025.02.23 07:19

Я бы очень хотел иметь возможность создавать комментарии к input-переменным. Но, к сожалению, это невозможно.

После обновления компилятора кодобазы будет доступна такая возможность.

#property script_show_inputs

#define iInput01 Amount
#define dInput01 Koef
#include <fxsaber\Input_Struct\Input_Struct.mqh> // https://www.mql5.com/ru/code/47932

// Задали инпут-переменные.
MACROS_INPUTS(int, Amount, 1, "Amount Name");
MACROS_INPUTS(double, Koef, 2, "Koef Name");

void OnStart()
{
  Print(inInputsAll); // Все input-переменные в одной строке.
}

 
fxsaber #:

После обновления компилятора кодобазы будет доступна такая возможность.

Очень хорошо
 
fxsaber #:

После обновления компилятора кодобазы будет доступна такая возможность.

Готово.
 
Обновлен. Используется в этом проекте.
BestInterval
BestInterval
  • 2018.10.12
  • www.mql5.com
Вычисление лучшего интервала торговли.
 

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

#property strict
#property script_show_inputs
#define COMMON_FIELDS(_INPUT, DINPUT, SINPUT, INPUT, HINPUT, GROUP, INSTANCE, PREFIX) \
  GROUP("Common") \
  INPUT(INSTANCE, PREFIX, IsEnable, bool, true, Common Enable) \
  SINPUT(INSTANCE, PREFIX, Lots, double, 0.10, Common Lots) \
  HINPUT(INSTANCE, PREFIX, HiddenRisk, int, 7, Common Hidden Risk) \
  INPUT(INSTANCE, PREFIX, Comment, string, "common", Common Comment) \
  DINPUT(INSTANCE, PREFIX, DisabledValue, int, 99, Common Disabled Value) \
  _INPUT(INSTANCE, PREFIX, StandaloneRawInput, int, 3, Standalone Raw Param)

#define GRID_FIELDS(_INPUT, DINPUT, SINPUT, INPUT, HINPUT, GROUP, INSTANCE, PREFIX) \
  GROUP("Grid") \
  INPUT(INSTANCE, PREFIX, IsEnable, bool, true, Grid Enable) \
  INPUT(INSTANCE, PREFIX, Lots, double, 0.01, Grid Lots)

#define MARTIN_FIELDS(_INPUT, DINPUT, SINPUT, INPUT, HINPUT, GROUP, INSTANCE, PREFIX) \
  GROUP("Martin") \
  INPUT(INSTANCE, PREFIX, IsEnable, bool, false, Martin Enable) \
  INPUT(INSTANCE, PREFIX, Lots, double, 0.02, Martin Lots)

#define INPUT_STRUCT_BLOCKS(BLOCK) \
  BLOCK(CommonInputs, g_commonInputs, Common, COMMON_FIELDS) \
  BLOCK(GridInputs, g_gridInputs, Grid, GRID_FIELDS) \
  BLOCK(MartinInputs, g_martinInputs, Martin, MARTIN_FIELDS)

#include <InputStructBlocks.mqh>

int OnStart()
{
  if (g_commonInputs.Lots != CommonLots) return INIT_FAILED;
  if (g_gridInputs.Lots != GridLots) return INIT_FAILED;
  if (g_martinInputs.Lots != MartinLots) return INIT_FAILED;
  if (g_commonInputs.HiddenRisk != CommonHiddenRisk) return INIT_FAILED;
  if (StandaloneRawInput != 3) return INIT_FAILED;

  if (g_commonInputs.IsEnable != CommonIsEnable) return INIT_FAILED;
  if (g_gridInputs.IsEnable != GridIsEnable) return INIT_FAILED;
  if (g_martinInputs.IsEnable != MartinIsEnable) return INIT_FAILED;

  CommonInputs common;
  if (common.GetAmount() != 3) return INIT_FAILED;

  common.Lots = 1.23;
  common.HiddenRisk = 11;
  common.Default();
  if (common.Lots != 0.10) return INIT_FAILED;
  if (common.HiddenRisk != 7) return INIT_FAILED;

  const string commonText = common.ToString();
  Print(commonText);
  if (StringFind(commonText, "IsEnable = true") < 0) return INIT_FAILED;
  if (StringFind(commonText, "Lots = 0.1") < 0) return INIT_FAILED;
  if (StringFind(commonText, "HiddenRisk = 7") < 0) return INIT_FAILED;
  if (StringFind(commonText, "Comment = common") < 0) return INIT_FAILED;

  if (common.FromString("IsEnable=false, Lots=0.25, HiddenRisk=9, Comment=changed") != 4) return INIT_FAILED;
  if (common.IsEnable != false) return INIT_FAILED;
  if (common.Lots != 0.25) return INIT_FAILED;
  if (common.HiddenRisk != 9) return INIT_FAILED;
  if (common.Comment != "changed") return INIT_FAILED;

  if (common.FromString("Common Lots=0.28, Common Comment=changed2") != 2) return INIT_FAILED;
  if (common.Lots != 0.28) return INIT_FAILED;
  if (common.Comment != "changed2") return INIT_FAILED;

  double values[];
  if (common.ToArray(values) != 3) return INIT_FAILED;
  if (ArraySize(values) != 3) return INIT_FAILED;

  const double newValues[] = {1, 0.33, 12};
  if (common.FromArray(newValues) != 3) return INIT_FAILED;
  if (common.IsEnable != true) return INIT_FAILED;
  if (common.Lots != 0.33) return INIT_FAILED;
  if (common.HiddenRisk != 12) return INIT_FAILED;

  CommonInputs copied;
  copied = common;
  if (copied.Lots != common.Lots) return INIT_FAILED;
  copied = "Lots=0.47, HiddenRisk=17";
  if (copied.Lots != 0.47) return INIT_FAILED;
  if (copied.HiddenRisk != 17) return INIT_FAILED;

  CommonInputs fromInputs;
  if (!fromInputs.Default2()) return INIT_FAILED;
  if (fromInputs.Lots != CommonLots) return INIT_FAILED;

  bool mask[] = {true, false, true};
  const string maskedText = common.ToString(mask);
  if (StringFind(maskedText, "IsEnable") < 0) return INIT_FAILED;
  if (StringFind(maskedText, "Lots") >= 0) return INIT_FAILED;
  if (StringFind(maskedText, "HiddenRisk") < 0) return INIT_FAILED;
  if (StringFind(maskedText, "Comment") >= 0) return INIT_FAILED;

  const string mergedText = common.ToString("External=1, Lots=0.55, Comment=merge");
  if (StringFind(mergedText, "Lots = 0.55") < 0) return INIT_FAILED;
  if (StringFind(mergedText, "Comment = merge") < 0) return INIT_FAILED;
  if (StringFind(mergedText, "External=1") < 0) return INIT_FAILED;

  const double moreValues[] = {0, 0.66, 21};
  const string arrayText = common[moreValues];
  if (StringFind(arrayText, "Lots = 0.66") < 0) return INIT_FAILED;

#ifdef __MQL5__
  if (common[CommonInputs::eCommonLots] != 0.33) return INIT_FAILED;
#else 
  if (common[eCommonLots] != 0.33) return INIT_FAILED;
#endif   
  if (StringFind(common + "Tail=1", "Tail=1") < 0) return INIT_FAILED;

  GridInputs gridCopy;
  gridCopy = common;
  if (gridCopy.IsEnable != common.IsEnable) return INIT_FAILED;
  if (gridCopy.Lots != common.Lots) return INIT_FAILED;
  
  Print("InputStructBlockPrototype OK");
  return INIT_SUCCEEDED;
}


Файлы:
 

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

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

hini, 2026.06.17 12:25

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

#define INPUT_STRUCT_BLOCKS(BLOCK) \
  BLOCK(CommonInputs, g_commonInputs, Common, COMMON_FIELDS) \
  BLOCK(GridInputs, g_gridInputs, Grid, GRID_FIELDS) \
  BLOCK(MartinInputs, g_martinInputs, Martin, MARTIN_FIELDS)

У меня сценарий, при котором, вроде, такой подход не будет работать.


В оригинальной версии я могу подключить много Input1.mqh и Input2.mqh, при этом мне не нужно прописывать BLOCKS. Т.е. я могу какие-то mqh подключать, какие-то - отключать. При этом выделенный макрос не потребуется создавать/править.