Библиотеки: MultiTester - страница 57

 
klycko #:

В чем же здесь проблема?

Я не стал возиться с изучением флагов и решил написать рабочий код сохранения и загрузки set-файлов Тестера.

// Load/Save Tester's set-file.
#property script_show_inputs

input bool inLoad = true; // Settings Load/Save - true/false

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

void OnStart()
{
  const string FileName = __FILE__ + ".set";
  
  string Settings;
  ushort Words[];  
      
  if (inLoad) // Load settings.
  {
    Print("Load: " + (string)FileLoad(FileName, Words));
    Settings = ShortArrayToString(Words, 1); // 1 - Unicode
    
    Print(MTTESTER::SetSettings(Settings));
  
  }
  else if (MTTESTER::GetSettings(Settings)) // Save settings.
  {
    Words[ArrayResize(Words, 1) - 1] = 0xFEFF; // 1 - Unicode
    
    StringToShortArray(Settings, Words, ArraySize(Words));    
    Print("Save: " + (FileSave(FileName, Words) ? (string)ArraySize(Words) : "error"));
  }
}


Вы можете через скрипт сохранить (inLoad = false) set-файл, затем что-нибудь руками в нем изменить и загрузить (inLoad = true) его в Тестер через скрипт.

Если будет работать, возьмите соответствующие куски исходника себе.

 

Большое Вам спасибо за Ваши подсказки!

Удалось сделать запись в робота, но криво.

Извините, что снова к Вам обращаюсь, но сам не могу понять ситуацию.

Я написал скрипт с вашими функциями. Он находит первый сет в папке ___SET и правильно определяет его имя 214-10000 HEX-449.set (в нем prHEX=true).

Потом выполняются команды:

      Print(first_set_filename);

      Print("Load: " + (string)FileLoad(first_set_filename, Words,0));  // Печатаем длину считанного файла FileName FILE_COMMON

      Settings = ShortArrayToString(Words, 1); // 1 - Unicode

      Print("\nSettings \n", Settings);

      Print(MTTESTER::SetSettings(Settings));

 

Распечатанный файл Settings совсем другой (в нем prWPR=true). Не могу понять, откуда он взялся. И он же загрузился в робота, т.е. загрузка сработала!!!, половина проблемы решена, но сет все же не тот.

Qwen мне подсказал, что надо записываемый сет поместить в tester\files.

Я так и сделал. Но это не помогло. Почему-то в Settings записывается какой-то другой сет, не тот, что был найден при поиске first_set_filename:

214-10000 HEX-449.set

Наверное, он где-то остался в памяти из прежних запусков.

 

Помогите, пожалуйста, понять причину этого.

 

С уважением, Александр

 
klycko #:

      Print("Load: " + (string)FileLoad(first_set_filename, Words,0));  // Печатаем длину считанного файла FileName FILE_COMMON

FileLoad(first_set_filename, Words, FILE_COMMON)
 

      Print("Load: " + (string)FileLoad(first_set_filename, Words,FILE_COMMON));  // Печатаем длину считанного файла FileName FILE_COMMON


С этим изменением печатает: Load: -1


 

Если в этой строке менять параметр, то:

При FILE_COMMON   Load: -1        Settings не печатаются

При 0                           Load: 3556    Settings не верный (другой, не понятно откуда взявшийся)

 
fxsaber #:

Может я просто забыл FileOpen?

Print("Load: " + (string)FileLoad(first_set_filename, Words,FILE_COMMON));  // Печатаем длину считанного файла FileName FILE_COMMON

Если в этой строке менять параметр, то:

При FILE_COMMON   Load: -1        Settings не печатаются

При 0                           Load: 3556    Settings не верный (другой, не понятно откуда взявшийся)

 
klycko #:

Помогите, пожалуйста, понять причину этого.

Дополнительно к вышесказанному.

         Print("Save: " + (FileSave(source_path, Words, FILE_COMMON) ? (string)ArraySize(Words) : "error"));


Вам нужно научиться пользоваться дебагом. За минуту увидели бы причину.

 
fxsaber #:
Вам нужно научиться пользоваться дебагом. За минуту увидели бы причину.

Благодарю за присланное исправление строки кода.

Вы правы относительно рекомендаций мне повышать мастерство и освоить дебаг. Тем не менее даже без его использования, конечно не за минуту, а часа за 2-3, я написал отладочный скрипт SetLoad с использованием рекомендованных Вами функций, и с его помощью установил, что ошибка возникает после строки:

Print("Load: " + (string)FileLoad(first_set_filename, Words,0)); 

Если в этой строке менять последний параметр, то:

При FILE_COMMON   Load: -1        Settings не печатаются

При 0                           Load: 3556    Settings не верный (другой, не понятно откуда взявшийся).

В настоящий момент я исследую процесс Load, поэтому я прерываю работу скрипта при помощи return сразу после строки:

      Print(MTTESTER::SetSettings(Settings));


Сейчас Вы мне прислали исправленную строку:

Print("Save: " + (FileSave(source_path, Words, FILE_COMMON) ? (string)ArraySize(Words) : "error"));

Я ее поставил в скрипт и скомпилировал.

Но она относится не к процессу Load, а к процессу Save и никак не влияет на ошибку загрузки Settings по-прежнему там посторонние настройки в результате.

 

 
klycko #:

по-прежнему там посторонние настройки в результате.

Первая и вторая правка - и у меня работет.

 
fxsaber #:

Первая и вторая правка - и у меня работет.

Поразительно!

Я уже год пользуюсь скриптом Nocturne1.

где команда MTTESTER::SetSettings(Settings) выполняется тысячи раз.

А в новом скрипте не могу добиться с помощью этой команды записи Settings в робота. Вот в этой строке в SetLoad:

      Print("\nУдалась ли загрузка в робота от FileLoad: ",MTTESTER::SetSettings(Settings));

 

Просто Муму не постижимое!!!

 

Я перенес папку с сетами в песочницу.            MQL5\Files\___SET

Теперь там стабильно ищется первый сет и загружается в Settings.

Даже двумя возможными способами через FileLoad и GetKthFileContent.

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

Но в робота этот сет не загружается!

Не могу понять, почему в SetLoad не срабатывает команда:

MTTESTER::SetSettings(Settings) и MTTESTER::SetSettings2(Settings)

хотя и возвращает true, но настройки робота не меняются.

Может у меня не последняя версия MTTESTER ?

Помогите, пожалуйста, добиться правильной отработки команды:

MTTESTER::SetSettings(Settings)