Помогите прочитать .set файл

 

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

//+------------------------------------------------------------------+
//|                                                Buldozer_v4.0.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com/ru/users/sergey1294"
#property version   "1.00"
#define OP_BUY (ORDER_TYPE_BUY)
#define OP_SELL (ORDER_TYPE_SELL)

#include<Trade\Trade.mqh>
#include<Trade\AccountInfo.mqh>

input int                 Magic=1;// Identification number
input double              Deposit_Load=50.0;// Deposit load
input double              Risk=0.01; // Risk
input double              Ret=15.0;
input double              StartDepo=10000.0;

sinput string             s1=NULL; // Setting indicator Moving Average
input bool                ma_of_on=false; // ON/OFF indicator
input bool                ma_revers=false; // ON/OFF revers signal
input int                 ma_type_signal=1; //Type signal Moving Average
input int                 ma_period_slow=32;    //Period slow ma
input int                 ma_period_fast=16;     //Period fast ma
input ENUM_MA_METHOD      ma_method=MODE_SMA;//Method calculation
input ENUM_APPLIED_PRICE  ma_price=PRICE_CLOSE;//Price calculation

sinput string             s2=NULL; //Setting indicator Bollinger Bands
input bool                bb_of_on=true; //ON/OFF indicator
input bool                bb_revers=false; // ON/OFF revers signal
input int                 bb_type_signal=1; //Type signal Bollinger Bands
input int                 bb_period=20;             //Period
input double              bb_deviation=2.0;            //Deviation
input ENUM_APPLIED_PRICE  bb_price=PRICE_CLOSE;//Price calculation

sinput string             s3=NULL; //Setting indicator Stochastic
input bool                st_of_on=false; //ON/OFF indicator
input bool                st_revers=false; // ON/OFF revers signal
input int                 st_type_signal=1; //Type signal Stochastic
input int                 st_k_period=5; //K Period
input int                 st_d_period=3; //D Period
input int                 st_slowing=2; //Slowing
input ENUM_MA_METHOD      st_method=MODE_SMA; //Method calculation
input ENUM_STO_PRICE      st_price=STO_LOWHIGH; //Price calculation
input int                 st_level_up=80; //Up level
input int                 st_level_dw=20; //Down level

sinput string             s4=NULL; //Setting indicator Relative Strength Index
input bool                rsi_of_on=false; //ON/OFF indicator
input bool                rsi_revers=false; // ON/OFF revers signal
input int                 rsi_type_signal=1; //Type signal RSI
input int                 rsi_period=14;           //Period
input ENUM_APPLIED_PRICE  rsi_applied_price=PRICE_CLOSE; //Price calculation
input int                 rsi_level_up=70; //Up level
input int                 rsi_level_dw=30; //Down level

sinput string             s5=NULL; //Setting indicator Commodity Channel Index
input bool                cci_of_on=false; //ON/OFF indicator
input bool                cci_revers=false; // ON/OFF revers signal
input int                 cci_type_signal=1; //Type signal CCI
input int                 cci_period=13; //Period
input ENUM_APPLIED_PRICE  cci_price=PRICE_CLOSE; //Price calculation
input double              cci_level_up=100;//Up level
input double              cci_level_dw=-100;//Down level

CTrade            trade;
CPositionInfo     Position;
CAccountInfo      AccountInfo;
CDealInfo         deal;

string InpFilter="*";
string Symbols[];
string TimeFrames[];
string Procent[];

bool                m_ma_of_on[]; // ON/OFF indicator
bool                m_ma_revers[]; // ON/OFF revers signal
int                 m_ma_type_signal[]; //Type signal Moving Average
int                 m_ma_period_slow[];    //Period slow ma
int                 m_ma_period_fast[];     //Period fast ma
ENUM_MA_METHOD      m_ma_method[];//Method calculation
ENUM_APPLIED_PRICE  m_ma_price[];//Price calculation

bool                m_bb_of_on[]; //ON/OFF indicator
bool                m_bb_revers[]; // ON/OFF revers signal
int                 m_bb_type_signal[]; //Type signal Bollinger Bands
int                 m_bb_period[];             //Period
double              m_bb_deviation[];            //Deviation
ENUM_APPLIED_PRICE  m_bb_price[];//Price calculation

bool                m_st_of_on[]; //ON/OFF indicator
bool                m_st_revers[]; // ON/OFF revers signal
int                 m_st_type_signal[]; //Type signal Stochastic
int                 m_st_k_period[]; //K Period
int                 m_st_d_period[]; //D Period
int                 m_st_slowing[]; //Slowing
ENUM_MA_METHOD      m_st_method[]; //Method calculation
ENUM_STO_PRICE      m_st_price[]; //Price calculation
int                 m_st_level_up[]; //Up level
int                 m_st_level_dw[]; //Down level

bool                m_rsi_of_on[]; //ON/OFF indicator
bool                m_rsi_revers[]; // ON/OFF revers signal
int                 m_rsi_type_signal[]; //Type signal RSI
int                 m_rsi_period[];           //Period
ENUM_APPLIED_PRICE  m_rsi_applied_price[]; //Price calculation
int                 m_rsi_level_up[]; //Up level
int                 m_rsi_level_dw[]; //Down level

bool                m_cci_of_on[]; //ON/OFF indicator
bool                m_cci_revers[]; // ON/OFF revers signal
int                 m_cci_type_signal[]; //Type signal CCI
int                 m_cci_period[]; //Period
ENUM_APPLIED_PRICE  m_cci_price[]; //Price calculation
double              m_cci_level_up[];//Up level
double              m_cci_level_dw[];//Down level
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

   FileSeting();

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   Comment("Путь: ");
  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=0.0;
//---

//---
   return(ret);
  }
//+------------------------------------------------------------------+
//| TesterInit function                                              |
//+------------------------------------------------------------------+
void OnTesterInit()
  {
//---

  }
//+------------------------------------------------------------------+
//| TesterPass function                                              |
//+------------------------------------------------------------------+
void OnTesterPass()
  {
//---

  }
//+------------------------------------------------------------------+
//| TesterDeinit function                                            |
//+------------------------------------------------------------------+
void OnTesterDeinit()
  {
//---

  }
//+------------------------------------------------------------------+
void FileSeting()
  {
   string file_name;
   int    i=1;
   string to_split=""; // строка для разбивки на подстроки
   string sep="_";                  // разделитель в виде символа
   ushort u_sep;                    // код символа разделителя
   string result[];                 // массив для получения строк
   int file_handle;
   ulong pos[];
   int   size;



//--- получим код разделителя
   u_sep=StringGetCharacter(sep,0);

//--- получение хэндла поиска в корне локальной папки
   long search_handle=FileFindFirst(InpFilter,file_name,FILE_COMMON);
//--- проверим, успешно ли отработала функция FileFindFirst()
   if(search_handle!=INVALID_HANDLE)
     {
      //--- в цикле проверим являются ли переданные строки именами файлов или директорий
      do
        {
         ResetLastError();
         //--- если это файл, то функция вернет true, а если директория, то функция генерирует ошибку ERR_FILE_IS_DIRECTORY
         FileIsExist(file_name);
         PrintFormat("%d : %s name = %s",i,GetLastError()==ERR_FILE_IS_DIRECTORY ? "Directory" : "File",file_name);
         //--- разобьем строку на подстроки
         int k=StringSplit(file_name,u_sep,result);
         PrintFormat("Получено строк: %d. Использован разделитель '%s' с кодом %d",k,sep,u_sep);
         if(StartDepo==NormalizeDouble(StringToDouble(result[2]),0))
           {
            ArrayResize(Symbols,i);
            ArrayResize(TimeFrames,i);
            ArrayResize(Procent,i);
            Symbols[i-1]=result[0];
            TimeFrames[i-1]=result[1];
            Procent[i-1]=result[3];
            PrintFormat("Symbols[%d]=\"%s\"",i,Symbols[i-1]);
            PrintFormat("TimeFrames[%d]=\"%s\"",i,TimeFrames[i-1]);
            PrintFormat("StartDepo[%d]=\"%s\"",i,result[2]);
            PrintFormat("Procent[%d]=\"%s\"",i,result[3]);

            ResetLastError();
            file_handle=FileOpen(file_name+".set",FILE_READ|FILE_CSV);
            if(file_handle!=INVALID_HANDLE)
              {
               PrintFormat("Файл %s открыт для чтения",file_name);
               //--- получим позицию начала для каждой строки в файле
               GetStringPositions(file_handle,pos);
               //--- определим сколько всего строк в файле
               size=ArraySize(pos);
               if(!size)
                 {
                  //--- если в файле нет строк, то завершаем работу
                  PrintFormat("Файл %s пуст!",file_name);
                  FileClose(file_handle);
                 }

               //--- сдвинем позицию на начало этой строки
               for(int q=0; q<size; q++)
                 {
                  if(FileSeek(file_handle,q,SEEK_SET)==true)
                    {
                     //--- прочитаем и распечатаем строку с номером ind
                     PrintFormat("Текст строки с номером %d: %s",q,FileReadString(file_handle));
                    }
                 }
               //--- закроем файл
               FileClose(file_handle);
               PrintFormat("Файл %s закрыт",file_name);
              }
            else
               PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",file_name,GetLastError());

            i++;
           }
        }
      while(FileFindNext(search_handle,file_name));
      //--- закрываем хэндл поиска
      FileFindClose(search_handle);
     }
   else
      Print("Files not found!");
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Возвращает таймфрейм по строке                                   |
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES StringToTimeframe(const string timeframe)
  {
   if(timeframe=="M1")
      return(PERIOD_M1);
   if(timeframe=="M2")
      return(PERIOD_M2);
   if(timeframe=="M3")
      return(PERIOD_M3);
   if(timeframe=="M4")
      return(PERIOD_M4);
   if(timeframe=="M5")
      return(PERIOD_M5);
   if(timeframe=="M6")
      return(PERIOD_M6);
   if(timeframe=="M10")
      return(PERIOD_M10);
   if(timeframe=="M12")
      return(PERIOD_M12);
   if(timeframe=="M15")
      return(PERIOD_M15);
   if(timeframe=="M20")
      return(PERIOD_M20);
   if(timeframe=="M30")
      return(PERIOD_M30);
   if(timeframe=="H1")
      return(PERIOD_H1);
   if(timeframe=="H2")
      return(PERIOD_H2);
   if(timeframe=="H3")
      return(PERIOD_H3);
   if(timeframe=="H4")
      return(PERIOD_H4);
   if(timeframe=="H6")
      return(PERIOD_H6);
   if(timeframe=="H8")
      return(PERIOD_H8);
   if(timeframe=="H12")
      return(PERIOD_H12);
   if(timeframe=="D1")
      return(PERIOD_D1);
   if(timeframe=="W1")
      return(PERIOD_W1);
   if(timeframe=="MN")
      return(PERIOD_MN1);
//--- Значение по умолчанию
   return((ENUM_TIMEFRAMES)::Period());
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Функция определяет позиции начала для каждой из строк в файле и  |
//| помещает их в массив arr                                         |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
  {
//--- размер массива по умолчанию
   int def_size=127;
//--- выделим память для массива
   ArrayResize(arr,def_size);
//--- счетчик строк
   int i=0;
//--- если не конец файла, то есть хотя бы одна строка
   if(!FileIsEnding(handle))
     {
      arr[i]=FileTell(handle);
      i++;
     }
   else
      return; // файл пуст, выходим
//--- определим сдвиг в байтах в зависимости от кодировки
   int shift;
   if(FileGetInteger(handle,FILE_IS_ANSI))
      shift=1;
   else
      shift=2;
//--- в цикле перебираем строки
   while(1)
     {
      //--- читаем строку
      string text = FileReadString(handle);
      //PrintFormat("Текст строки с номером %d: %s",i,text);
      //--- проверка на конец файла
      if(!FileIsEnding(handle))
        {
         //--- запомним позицию следующей строки
         arr[i]=FileTell(handle)+shift;
         i++;
         //--- увеличим размер массива, если он переполнен
         if(i==def_size)
           {
            def_size+=def_size+1;
            ArrayResize(arr,def_size);
           }
        }
      else
         break; // конец файла, выходим
     }
//--- установим истинный размер массива
   ArrayResize(arr,i);
  }
//+------------------------------------------------------------------+
Файлы:
 
Извиняюсь не тот файл скинул, сами файлы кидаю сюда C:\Users\Aser\AppData\Roaming\MetaQuotes\Terminal\Common\Files
Файлы:
 

set это текстовый файл. структура <имя переменной> = <значение>. т.е. нужно найти текстовое имя переменной, а за ней будет значение.

в коде выглядит так:

double ReadDouble(string strSec) 
{
 if(!FileSeek(handle,0,SEEK_SET)) {Print(strSec," read failed!!! Empty file!");return(EMPTY_VALUE);}
 while(!FileIsEnding(handle))
 {
  string read=FileReadString(handle);
  if(StringFind(read,strSec+"=")==0)
   {
    double res=StringToDouble(StringSubstr(read,StringFind(read,"=")+1));
    Print(strSec,"=",res);
    return (res);
   }
 }
 Print(strSec," read failed!!! Data not found");
 return(EMPTY_VALUE);
}

это пример для чтения значения типа double. читать так:

deviation2=ReadDouble("deviation2d");

для полноты примера, хэндл получаю так:

handle=FileOpen("your_name.set",FILE_COMMON|FILE_TXT|FILE_SHARE_READ|FILE_ANSI,"\r\n");
 
Igor Zakharov:

set это текстовый файл. структура <имя переменной> = <значение>. т.е. нужно найти текстовое имя переменной, а за ней будет значение.

в коде выглядит так:

это пример для чтения значения типа double. читать так:

для полноты примера, хэндл получаю так:

Спасибо, сейчас попробую

 
Igor Zakharov:

set это текстовый файл. структура <имя переменной> = <значение>. т.е. нужно найти текстовое имя переменной, а за ней будет значение.

в коде выглядит так:

это пример для чтения значения типа double. читать так:

для полноты примера, хэндл получаю так:

При таком запросе

handle=FileOpen("your_name.set",FILE_COMMON|FILE_TXT|FILE_SHARE_READ|FILE_ANSI,"\r\n");


выдает ошибку.

2019.11.08 15:43:50.568 Buldozer_v4.0 (EURUSD_i,M30)    Не удалось открыть файл AUDCAD_M30_10000_13_P.set, Код ошибки = 5004

Можно более точный пример

 
Sergey Gritsay:

Можно более точный пример

Из рабочего кода выдернуто, не могу предположить, что не так :(

Попробуйте убедиться, что

bool  FileIsExist( 
   const string  file_name,       // имя файла 
   int           common_flag=0    // зона поиска 
   );

находит его.

 
Sergey Gritsay:
Извиняюсь не тот файл скинул, сами файлы кидаю сюда C:\Users\Aser\AppData\Roaming\MetaQuotes\Terminal\Common\Files

в этом файле 

; saved on 2019.11.07 21:31:56
; this file contains input parameters for testing/optimizing Buldozer_v3.0 expert advisor
; to use it in the strategy tester, click Load in the context menu of the Inputs tab
;
Magic=1||0||1||10||N
CommentDeals=Buldozer_v3.0
Deposit_Load=50||0.0||0.000000||0.000000||N
Risk=0.01||0.0||0.000000||0.000000||N
Ret=15||0.0||0.000000||0.000000||N
s1=
ma_of_on=false||false||0||true||Y
ma_revers=true||false||0||true||Y
ma_type_signal=3||0||1||6||Y
ma_period_slow=32||0||1||10||N
ma_period_fast=16||0||1||10||N
ma_method=0||0||0||0||N
ma_price=1||0||0||0||N
s2=
bb_of_on=true||false||0||true||Y
bb_revers=false||false||0||true||Y
bb_type_signal=0||0||1||7||Y
bb_period=20||0||1||10||N
bb_deviation=2||0.0||0.000000||0.000000||N
bb_price=1||0||0||0||N
s3=
st_of_on=false||false||0||true||Y
st_revers=false||false||0||true||Y
st_type_signal=2||0||1||9||Y
st_k_period=5||0||1||10||N
st_d_period=3||0||1||10||N
st_slowing=2||0||1||10||N
st_method=0||0||0||0||N
st_price=0||0||0||0||N
st_level_up=80||0||1||10||N
st_level_dw=20||0||1||10||N
s4=
rsi_of_on=false||false||0||true||Y
rsi_revers=false||false||0||true||Y
rsi_type_signal=0||0||1||3||Y
rsi_period=14||0||1||10||N
rsi_applied_price=1||0||0||0||N
rsi_level_up=70||0||1||10||N
rsi_level_dw=30||0||1||10||N
s5=
cci_of_on=true||false||0||true||Y
cci_revers=true||false||0||true||Y
cci_type_signal=2||0||1||3||Y
cci_period=13||0||1||10||N
cci_price=1||0||0||0||N
cci_level_up=100||0.0||0.000000||0.000000||N
cci_level_dw=-100||0.0||0.000000||0.000000||N
 
Aleksandr Klapatyuk:

в этом файле 

 я знаю что в этом файле, у меня задача прочитать эти данные из файла в советнике и загрузить, но ни как не получается

 
Igor Zakharov:

Из рабочего кода выдернуто, не могу предположить, что не так :(

Попробуйте убедиться, что

находит его.

Да находит, вот лог 

2019.11.08 16:36:04.437 Buldozer_v4.0 (EURUSD_i,M30)    1 : File name = AUDCAD_M30_10000_13_P.set
2019.11.08 16:36:04.437 Buldozer_v4.0 (EURUSD_i,M30)    Получено строк: 5. Использован разделитель '_' с кодом 95
2019.11.08 16:36:04.437 Buldozer_v4.0 (EURUSD_i,M30)    Symbols[1]="AUDCAD"
2019.11.08 16:36:04.437 Buldozer_v4.0 (EURUSD_i,M30)    TimeFrames[1]="M30"
2019.11.08 16:36:04.437 Buldozer_v4.0 (EURUSD_i,M30)    StartDepo[1]="10000"
2019.11.08 16:36:04.437 Buldozer_v4.0 (EURUSD_i,M30)    Procent[1]="13"
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Файл AUDCAD_M30_10000_13_P.set открыт для чтения
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    deviation2d read failed!!! Data not found
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Текст строки -1
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Файл AUDCAD_M30_10000_13_P.set закрыт
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    2 : File name = EURUSD_M30_10000_10_P.set
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Получено строк: 5. Использован разделитель '_' с кодом 95
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Symbols[2]="EURUSD"
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    TimeFrames[2]="M30"
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    StartDepo[2]="10000"
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Procent[2]="10"
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Файл EURUSD_M30_10000_10_P.set открыт для чтения
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    deviation2d read failed!!! Data not found
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Текст строки -1
2019.11.08 16:36:04.438 Buldozer_v4.0 (EURUSD_i,M30)    Файл EURUSD_M30_10000_10_P.set закрыт
 
Sergey Gritsay:

Да находит, вот лог 

может не читает - версии разные у вас 4 а в сет 3

; this file contains input parameters for testing/optimizing Buldozer_v3.0 expert advisor

а у вас

//+------------------------------------------------------------------+
//|                                                Buldozer_v4.0.mq5 |
 
Sergey Gritsay:

Да находит, вот лог 

судя по логу, открывает успешно, но у вас нет переменной deviation2d, этоо имя из моего примера. возьмите реальное имя переменной, например, bb_deviation (такая у вас есть)

Причина обращения: