file - FileReadString 在 MQL5 中返回空值
问题描述
我正在尝试在 MQL5 中读取文件 (ativos.txt) 并打印其中的资产。但是,它似乎读取它们但不打印(空)。任何人都可以帮忙吗?
//+------------------------------------------------------------------+
//| Expert functions |
//+------------------------------------------------------------------+
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
{
datetime first_date=0;
datetime times[100];
//--- check symbol & period
if(symbol==NULL || symbol=="") symbol=Symbol();
if(period==PERIOD_CURRENT) period=Period();
//--- check if symbol is selected in the Market Watch
if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
{
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
SymbolSelect(symbol,true);
}
//--- check if data is present
SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
if(first_date>0 && first_date<=start_date) return(1);
//--- don't ask for load of its own data if it is an indicator
if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
return(-4);
//--- second attempt
if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//--- there is loaded data to build timeseries
if(first_date>0)
{
//--- force timeseries build
CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//--- check date
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}
//--- max bars in chart from terminal options
int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- load symbol history info
datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
Sleep(5);
//--- fix start date for loading
if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print("Warning: first server date ",first_server_date," for ",symbol,
" does not match to first series date ",first_date);
//--- load data step by step
int fail_cnt=0;
while(!IsStopped())
{
//--- wait for timeseries build
while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//--- ask for built bars
int bars=Bars(symbol,period);
if(bars>0)
{
if(bars>=max_bars) return(-2);
//--- ask for first date
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(0);
}
//--- copying of next part forces data loading
int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//--- check for data
if(times[0]<=start_date) return(0);
if(bars+copied>=max_bars) return(-2);
fail_cnt=0;
}
else
{
//--- no more than 100 failed attempts
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}
}
//--- stopped
return(-3);
}
//+------------------------------------------------------------------+
//| Returns string value of the period |
//+------------------------------------------------------------------+
string GetPeriodName(ENUM_TIMEFRAMES period)
{
if(period==PERIOD_CURRENT) period=Period();
//---
switch(period)
{
case PERIOD_M1: return("M1");
case PERIOD_M2: return("M2");
case PERIOD_M3: return("M3");
case PERIOD_M4: return("M4");
case PERIOD_M5: return("M5");
case PERIOD_M6: return("M6");
case PERIOD_M10: return("M10");
case PERIOD_M12: return("M12");
case PERIOD_M15: return("M15");
case PERIOD_M20: return("M20");
case PERIOD_M30: return("M30");
case PERIOD_H1: return("H1");
case PERIOD_H2: return("H2");
case PERIOD_H3: return("H3");
case PERIOD_H4: return("H4");
case PERIOD_H6: return("H6");
case PERIOD_H8: return("H8");
case PERIOD_H12: return("H12");
case PERIOD_D1: return("Daily");
case PERIOD_W1: return("Weekly");
case PERIOD_MN1: return("Monthly");
}
//---
return("unknown period");
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnStart()
{
ENUM_TIMEFRAMES InpLoadedPeriod=PERIOD_CURRENT; // Period to be loaded
datetime InpStartDate=D'2017.01.01';
bool f_exists=false;
int n_ativos=0;
string ativos[];
ResetLastError();
f_exists=FileIsExist("ativos.txt", FILE_COMMON);
Print(f_exists);
if (f_exists == true)
{
int fhandle;
fhandle=FileOpen("ativos.txt",FILE_TXT|FILE_READ|FILE_COMMON|FILE_SHARE_READ);
if(fhandle!=INVALID_HANDLE)
{
n_ativos=0;
while(!FileIsEnding(fhandle))
{
FileReadString(fhandle);
n_ativos++;
}
ArrayResize(ativos, n_ativos);
for (int i=0;i<n_ativos;i++)
{
ativos[i]=FileReadString(fhandle);
Print(FileReadString(fhandle));
Print("Start load",ativos[i]+","+GetPeriodName(InpLoadedPeriod),"from",InpStartDate);
//---
int res=CheckLoadHistory(ativos[i],InpLoadedPeriod,InpStartDate);
switch(res)
{
case -1 : Print("Unknown symbol ",ativos[i]); break;
case -2 : Print("Requested bars more than max bars in chart ", ativos[i]); break;
case -3 : Print("Program was stopped ", ativos[i]); break;
case -4 : Print("Indicator shouldn't load its own data ", ativos[i]); break;
case -5 : Print("Load failed ", ativos[i]); break;
case 0 : Print("Loaded OK ", ativos[i]); break;
case 1 : Print("Loaded previously ", ativos[i]); break;
case 2 : Print("Loaded previously and built ", ativos[i]); break;
default : Print("Unknown result ", ativos[i]);
}
//---
datetime first_date;
SeriesInfoInteger(ativos[i],InpLoadedPeriod,SERIES_FIRSTDATE,first_date);
int bars=Bars(ativos[i],InpLoadedPeriod);
Print("First date ",first_date," - ",bars," bars");
}
FileClose(fhandle);
}
else
PrintFormat("Erro, código = %d",GetLastError());
}
}
结果是:
2019.12.24 12:35:01.927 OnStart (IBOV,D1) Start load,Dailyfrom2017.01.01 00:00:00
2019.12.24 12:35:01.927 OnStart (IBOV,D1) Loaded previously
2019.12.24 12:35:01.927 OnStart (IBOV,D1) First date 2016.07.11 00:00:00 - 856 bars
2019.12.24 12:35:01.927 OnStart (IBOV,D1)
2019.12.24 12:35:01.927 OnStart (IBOV,D1) Start load,Dailyfrom2017.01.01 00:00:00
2019.12.24 12:35:01.927 OnStart (IBOV,D1) Loaded previously
2019.12.24 12:35:01.927 OnStart (IBOV,D1) First date 2016.07.11 00:00:00 - 856 bars
2019.12.24 12:35:01.927 OnStart (IBOV,D1)
2019.12.24 12:35:01.927 OnStart (IBOV,D1) Start load,Dailyfrom2017.01.01 00:00:00
2019.12.24 12:35:01.927 OnStart (IBOV,D1) Loaded previously
2019.12.24 12:35:01.927 OnStart (IBOV,D1) First date 2016.07.11 00:00:00 - 856 bars
解决方案
推荐阅读
- javascript - 无法列出 window.document 属性 - 为什么?
- dynamics-crm - Mobile Offline Dynamics CRM 应用程序错误
- javascript - 通过 lambda 函数将 CSV 记录发送到 Amazon Sagemaker
- android - 如何在 Visual Studio Emulator 上删除设备的框架?
- c++ - 检索事件日志在 DATA 标记中包含特定字符串
- android - 无法解析 Titanium 中的推送有效负载消息
- php - Cakephp 3 保存关联属于ToMany
- continuous-integration - 用于 CI/CD 的 Travis
- angular - 从服务中编写的 API 获取 JSON,必须将其转换为表行
- google-chrome - 如何重新加载网页并阻止它更改为另一个?