Работаем с файлами настроек *.set

Был у меня один интересный заказ, который заключался в объединении большого количества однотипных советников в один. Для удобной работы с настройками советников было решено использовать set файлы, которые можно сохранить по каждому инструменту и советнику. Область применения  это мультивалютные советники входящие в единый торговый комплекс.

Сегодня я решил поделиться простым механизмом позволяющим читать любые параметры из файлов указанного формата.

Рассмотрим любой set файл изнутри:

order.magic=910
risk=0.01000000
startdepo=10000.00000000
order.lot=0.01000000
slippage=3.00000000
Delay=600
ma.period=34
ma.method=1

Рассмотрим более внимательно на формат, у нас есть наименование параметра и после знака равенства (=) его значение. Ничего сложного в этом на самом деле нет и можно сделать примитивный разбор строки с разделителем =/

Все значения можно разбить по типу int,  double,  string,  есть еще тип color и time, но мы эти типы анализировать не будем, оставлю вам это в качестве домашнего задания 🙂
Разобьем задачу получения значения переменной из set файла на подзадачи:

  1. чтение файла и загрузка всех его элементов
  2. поиск нужного параметра и выдача его результата
  3. Преобразование в нужный тип данных

Чтение файла и загрузка его элементов

int load.set(string name,string &lines[]){
   int h=FileOpen(StringConcatenate(name,".set"),FILE_READ|FILE_CSV);
   ArrayResize(lines,0);
   int l=0;
   if(h!=-1){
      //загрузка файла set
      while(!FileIsEnding(h)){
         string s=FileReadString(h);
         if(s=="" || StringFind(s,",")>0) continue;
         ArrayResize(lines,l+1);
         lines[l]=s; //сохраним все переменные из файла в массив для последующего поиска и выборки
         l++;
      }   
 
      FileClose(h);
   }
 
   return (l);
}

Данная функция позволит нам считать указанный файл set и загрузить все его строки в один динамический массив lines в файле мы сразу отбрасываем переменные, которые содержат «,». Это сделано специально для возможности работы с настройками из тестера стратегий.

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

string get.setFileString(string lines[],string match){
   for(int i=0;i0){
            return (StringSubstr(lines[i],pos+1));
         }
      }
   }
}

Данная функция осуществляет поиск в пассиве параметра с учетом регистра и возвращает значение параметра как строку.

Преобразование типов данных

string paramString(string lines[],string match){ return (get.setFileString(lines,match));}
int paramInt(string lines[],string match){ return (StrToInteger(get.setFileString(lines,match)));}
double paramDouble(string lines[],string match){return (StrToDouble(get.setFileString(lines,match)));}
bool paramBool(string lines[],string match){ return (StrToInteger(get.setFileString(lines,match)));}

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

Как использовать?

Использовать можно например так:

string lines[];
load.set("test",lines); //грузим нужный сет
if(ArraySize(lines)>0){ //параметры загружены в массив lines
   //грузим опции
   risk = paramDouble(lines,"risk");
   ma.period = paramInt(lines,"ma.period");
   //... и т.д.
}

Отправить ответ

Оставьте первый комментарий!

Notify of
wpDiscuz