//+------------------------------------------------------------------+//| Demo_FileWiteStruct.mq5 |//| Copyright 2013, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2013, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"//--- покажем окно входных параметров при запуске скрипта#property script_show_inputs//--- параметры для получения данных из терминалаinputstring InpSymbolName="EURUSD"; // валютная параinputENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1; // таймфреймinputdatetime InpDateStart=D'2013.01.01 00:00'; // дата начала копирования данных//--- параметры для записи данных в файлinputstring InpFileName="EURUSD.txt"; // имя файлаinputstring InpDirectoryName="Data"; // имя директории//+------------------------------------------------------------------+//| Структура для хранения данных свечи |//+------------------------------------------------------------------+struct candlesticks
{
double open; // цена открытияdouble close; // цена закрытияdouble high; // максимальная ценаdouble low; // минимальная ценаdatetime date; // дата
};
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
datetime date_finish=TimeCurrent();
int size;
datetime time_buff[];
double open_buff[];
double close_buff[];
double high_buff[];
double low_buff[];
candlesticks cand_buff[];
//--- сбросим значение ошибкиResetLastError();
//--- получим время появления баров из диапазонаif(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
{
PrintFormat("Не удалось скопировать значения времени. Код ошибки = %d",GetLastError());
return;
}
//--- получим максимальные цены баров из диапазонаif(CopyHigh(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,high_buff)==-1)
{
PrintFormat("Не удалось скопировать значения максимальных цен. Код ошибки = %d",GetLastError());
return;
}
//--- получим минимальные цены баров из диапазонаif(CopyLow(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,low_buff)==-1)
{
PrintFormat("Не удалось скопировать значения минимальных цен. Код ошибки = %d",GetLastError());
return;
}
//--- получим цены открытия баров из диапазонаif(CopyOpen(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,open_buff)==-1)
{
PrintFormat("Не удалось скопировать значения цен открытия. Код ошибки = %d",GetLastError());
return;
}
//--- получим цены закрытия баров из диапазонаif(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
{
PrintFormat("Не удалось скопировать значения цен закрытия. Код ошибки = %d",GetLastError());
return;
}
//--- определим размерность массивов
size=ArraySize(time_buff);
//--- сохраним все данные в массиве структурыArrayResize(cand_buff,size);
for(int i=0;i<size;i++)
{
cand_buff[i].open=open_buff[i];
cand_buff[i].close=close_buff[i];
cand_buff[i].high=high_buff[i];
cand_buff[i].low=low_buff[i];
cand_buff[i].date=time_buff[i];
}
//--- откроем файл для записи массива структуры в файл (если его нет, то создастся автоматически)ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN|FILE_COMMON);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
//--- подготовим счетчик количества байтuint counter=0;
//--- в цикле запишем значения массиваfor(i=0;i<size;i++)
counter+=FileWriteStruct(file_handle,cand_buff[i]);
PrintFormat("В файл %s записано %d байт информации",InpFileName,counter);
PrintFormat("Всего байтов: %d * %d * %d = %d, %s",size,5,8,size*5*8,size*5*8==counter ? "Верно" : "Ошибка");
//--- закрываем файлFileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
elsePrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}
不...我总是喜欢女孩。
呃...(轻声呼气) : )
那很好啊!:)
我保证不滥用这些知识。:)
兰。夜--夜!我现在要去睡觉了。
阿特姆的意思是"...条件被触发--放一个标记。",他的意思是在脚本代码中写上条件被触发时设置图标(标记)。
MQL4参考》中有非常好的创建图标的脚本例子。例如,这个脚本 可以在图表上创建和移动 "买入 "图标。好的脚本,从那里拉出所需的功能。
就这样,你拥有了它。
我想写出结构,但我不能!它写在帮助中,FileWriteStruct 写到一个二进制文件,如果没有指定大小,则写整个结构。
谁有什么意见?
它仍然写到二进制。
或者把我送到他们可以帮助的分支机构。
我想写出结构,但我不能!它写在帮助中,FileWriteStruct写到一个二进制文件,如果没有指定大小,则写整个结构。
谁有什么意见?
它仍然写到二进制。
或者指引我到他们可以提供帮助的分支机构。
你在哪里定义阵列的大小?
你在哪里定义阵列的大小?
在" ORD Orders[10]; "声明中或通过"ArrayResize( Orders, 10)",但这并不影响错误。我刚刚检查了一下。(我真的没有在脚本中指定尺寸)。
我认为不存在转换不同类型数据的可能性。
646号航站楼,ME934。
在 "ORD Orders[10]; "声明中或通过 "ArrayResize( Orders, 10)",但这并不影响错误。刚刚检查过。(我真的没有在脚本中指定一个尺寸)。
我认为不存在转换不同类型数据的可能性。
646号航站楼,ME934。
测试实例报告说,文件已经创建。只是找不到它
测试实例报告说,文件已经创建。我只是找不到它。
找到了。虽然我应该把它放在一个完全不同的目录中。所以它是有效的。
找到了。虽然我把它放在一个完全不同的目录中。所以它是有效的。
我可以看一下更正的内容吗?如果该文件是我的。
如果帮助中的那个DEMO_FileWriteStruct,那么它就可以编译了,我试着从它那里提取向文件写入 的功能,但我不需要控制写入的行数。还是我理解为结构是逐个字节写的?
那么我有一个问题,是否也应该逐个字节地读?在结构中,当需要从文件中加载回来时?
我们能不能看一下改正的情况?
我使用了帮助中的例子
我使用了帮助中的例子