Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1432

 

Здравствуйте, @pivomoe

Если вы не будете принудительно назначать числовые значения элементам перечисления (судя по примеру - не будете), то можно сделать, например, так:

// Объявляем перечисление
enum ENUM_NAME {
   ENAME_1,
   ENAME_JSDF,
   ENAME_ERT,
   ENAME_QWERTY,
   ENAME_FEF
};

// Обявляем константу, хранящую количество элементов перечисления
#define ENUM_NAME_SIZE 5

// Массив для хранения элементов перечисления
ENUM_NAME     E_NAME[ENUM_NAME_SIZE];

int OnInit() {
   // Заполняем массив значениями, преобразуя к типу ENUM_NAME
   for(int i = 0; i < ENUM_NAME_SIZE; i++) {
      E_NAME[i] = (ENUM_NAME) i;
   }

   // Пользуемся массивом
   ArrayPrint(E_NAME);
   
   for(int i = 0; i < ENUM_NAME_SIZE; i++) {
      Print(EnumToString(E_NAME[i]));
   }
   
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) {}

В этом случае вам понадобится при добавлении элементов в перечисление изменять еще и константу, хранящую количество элементов.

И еще, префикс ENUM_ лучше использовать только для названия самого перечисления, а для его элементов использовать какой-то другой префикс. Такое соглашение используется во всех стандартных перечислениях MQL.

 
Yuriy Bykov #:

Здравствуйте, @pivomoe

Если вы не будете принудительно назначать числовые значения элементам перечисления (судя по примеру - не будете), то можно сделать, например, так:

В этом случае вам понадобится при добавлении элементов в перечисление изменять еще и константу, хранящую количество элементов.

И еще, префикс ENUM_ лучше использовать только для названия самого перечисления, а для его элементов использовать какой-то другой префикс. Такое соглашение используется во всех стандартных перечислениях MQL.

   Спасибо за помощью. Уже столько лет пользуюсь ENUM, что даже в голову не пришло почитать справку.

 
jeremy10p100 # :
Здравствуйте и спасибо за ваш ответ. Я смог сделать скрипт, который соответствует моим ожиданиям, но, к сожалению, есть две ошибки, которые я не могу понять или исправить. Не могли бы вы знать, к кому обратиться за помощью? Это всего лишь две строки кода, которые регистрируются как ошибки после компиляции...

Вы можете создать вакансию фрилансера и выбирать из разработчиков, которые претендуют на вашу работу

https://www.mql5.com/fr/job

Applications de trading pour MetaTrader 5 à commander
Applications de trading pour MetaTrader 5 à commander
  • 2023.01.08
  • www.mql5.com
Le plus grand service de freelance avec des développeurs d'applications MQL5
 
#include <JAson.mqh>
CJAVal jv;

jv["type"] = "BTCUSD";
jv["title"] = "test";

int result;
char res_data[],post[];
ArrayResize(post,StringToCharArray(jv.Serialize(),post,0,WHOLE_ARRAY)-1);
string headers="Content-Type: application/json\r\nAccept: text/plain";
result=WebRequest("POST",url,headers,3000,post,res_data,res_headers);

Пытаюсь отправить json через WebRequest, сервер возвращает:  "\u0022BTCUSD\u0022 is not a valid bundle type for denormalization."

Т.е. ему не нравится кодировка кавычек  \u0022.
Перепробовал везде указывать все варианты кодировок и в headers и в 
StringToCharArray, ничего не помогает.

Из питона все улетает без проблем:
response = requests.post(url, data=json.dumps(data), headers=headers)
т.е. с сервером все ok

Как решить проблему?

 

Переформулирую вопрос немного иначе. Можно ли оптимизатору дать команду в блоке OnInit при определенных условиях пропустить вариант тестирования/оптимизации.

input group "Входные настройки Стохастик"
input bool Stoch = false; // Стохастик включен/выключен
input int in_StochK = 14; // период основной линии K
input int in_StochD = 3; // период первичного сглаживания D
input int in_StochSlow = 3; // период окончательного сглаживания

int OnInit() {
if ((Stoch = false) && ((StochK != 0) || (StochK != 0) || (StochSlow != 0)))
   {
   // Некая команда, которая говорит, что такой вариант даже не стоит пробовать оптимизировать  
   }
}

Пробовал делать так, но это приводит к некорректным вариантам оптимизации.

if ((Stoch = false) && ((StochK != 0) || (StochK != 0) || (StochSlow != 0))) 
   {
   
Print("Такой вариант тестирования не имеет смысла");
   return(INIT_FAILED);
   }

Цель - чтобы при оптимизации я мог включить перебор вариантов 4-х параметров стохастика  (Stoch, in_StochK, int in_StochD, int in_StochSlow).

  • При включенном стохастике (Stoch = true) оптимизатор перебирает переменные in_StochK, in_StochD, in_StochSlow. В этой части все работает корректно.
  • При выключенном стохастике (Stoch = false) оптимизатор все равно перебирает переменные in_StochK, in_StochD, in_StochSlow. А мне нужно сделать какую-то заглушку в коде, чтобы он их не перебирал, если Stoch = false.
 

Здравствуйте, @taramortom.

Скорее всего, вам поможет просто заменить 

return(INIT_FAILED)

на

return(INIT_PARAMETERS_INCORRECT)
 
Yuriy Bykov #:

Здравствуйте, @taramortom.

Скорее всего вам поможет просто заменить 

на

Пробовал уже. Не помогает. Оптимизатор при такой команде все равно некорректно работает.
 

Возможно, причина некорректной работы оптимизатора в этой неточности в коде:

if ((Stoch = false) && ((StochK != 0) || (StochK != 0) || (StochSlow != 0)))
 
Yuriy Bykov #:

Возможно, причина некорректной работы оптимизатора в этой неточности в коде:


Причина не в этом. Код сделал для примера логики работы. Полная версия кода слишком большая - много разных осцилляторов. При оптимизации хочу добиться - чтобы оптимизатор пробовал разные комбинации (включен один осциллятор, включено два осциллятора, три и т.п.).

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

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

 
Вы используете генетическую или полную оптимизацию?
Я тоже использовал подобный подход для исключения заведомо ненужных комбинаций параметров и не заметил некорректной работы оптимизатора. Наоборот, оптимизатор работал именно так, как ожидалось.
Можно попробовать добавить сохранение пропускаемых комбинаций параметров в БД или общий файл, чтобы проверить, сколько и какие действительно пропускаются и разобраться в причинах.