MqlRates bars[]; // массив для хранения данных цен OHLC int start_bar=0; // с какого бара копируем int count_bar=4; // сколько баров копируем //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ intOnInit() { //--- ArraySetAsSeries(bars, true); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ voidOnDeinit(constint reason) { //---
酒吧[]
称其为Bars,编译器把它骂到天上去了。你有没有测试过这种设计,或者只是假设它应该工作,还是我做错了什么?
是的,我的错误。命名吧。一般来说,我们的想法是给变量起一个有表现力的名字,那么你就不需要创建额外的变量,这些变量的存在并不总是合理的。
原因不是为了表达什么,而是为了在使用它们时缩短代码。
其余的以同样的方式,否则线的长度会 增加
谢谢大家的澄清!
我打电话给他们不是为了表达什么,而是为了在与他们合作时减少代码。
其余的以同样的方式,否则线的长度会 增加
谢谢大家的澄清!
如果你想把代码减少到最低限度,可以直接引用数据阵列
//| test09.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"
MqlRates bars[]; // массив для хранения данных цен OHLC
int start_bar=0; // с какого бара копируем
int count_bar=4; // сколько баров копируем
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
ArraySetAsSeries(bars, true);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(CopyRates(Symbol(),PERIOD_CURRENT, start_bar, count_bar, bars)<count_bar) return;
if(bars[1].open<bars[1].close && bars[2].close>bars[3].close && bars[1].close>bars[2].close)
{
}
}
//+------------------------------------------------------------------+
下午好!
在卸载(删除)专家顾问时,在哪里以及如何正确删除已下订单和未结头寸?如果这不难,请分享一个例子。
谢谢你。
其中一个EA有一些奇怪的胡说八道。正常测试EA,点击 "运行单个测试 "只运行一个,第一次。然后,当你点击单个测试或点击优化中的任何一行,它就会显示在日志中。
2017.02.08 13:31:05.165 测试人员无法获得4234087422336号通行证的输入。
2017.02.08 13:31:34.829 测试人员无法获得4076312468706号通行证的输入。
2017.02.08 13:31:47.973 测试员无法获得通行证1004506640527的输入。
其他EA表现正常。会是什么呢?
先生们,记录一个巨大的10000*10000矩阵
{
//--- запишем файл
ResetLastError();
int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
//---
if(handle!=INVALID_HANDLE)
{
for(int z=ARRAY_SIZE_Y; z>0; z--) // Перебор по барам, колонка Y
{
for(int q=0; q<ARRAY_SIZE_X; q++) // Перебор по периоду, колонка X
{
arra[q]=sm.d[q].m[nBar-z]; // M(I) SMA
}
//--- запишем данные массива в конец файла FileTell IsFileLineEnded
FileSeek(handle,0,SEEK_END);
FileWriteArray(handle,arra);
}
FileClose(handle);
}
else
Print("Failed to open the file, error ",GetLastError()," handle ",handle);
//---
count=1;
}
你认为这种算法在速度方面的效率如何?
因为当矩阵是1000*1000时,速度是几秒钟,当增加到10000*10000时,系统就会上升。
先生们,记录一个巨大的10000*10000矩阵
{
//--- запишем файл
ResetLastError();
int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
//---
if(handle!=INVALID_HANDLE)
{
for(int z=ARRAY_SIZE_Y; z>0; z--) // Перебор по барам, колонка Y
{
for(int q=0; q<ARRAY_SIZE_X; q++) // Перебор по периоду, колонка X
{
arra[q]=sm.d[q].m[nBar-z]; // M(I) SMA
}
//--- запишем данные массива в конец файла FileTell IsFileLineEnded
FileSeek(handle,0,SEEK_END);
FileWriteArray(handle,arra);
}
FileClose(handle);
}
else
Print("Failed to open the file, error ",GetLastError()," handle ",handle);
//---
count=1;
}
你认为这种算法在速度方面的效率如何?
因为当矩阵是1000*1000时,速度是几秒钟,当增加到10000*10000时,系统就会上升。
是否有任何混淆?
如果不允许超过四维的数组,怎么可能得到这样的矩阵呢?
难道没有任何混淆吗?
10000 x 10000不是一个二维矩阵吗?
和所有这些...
如果不允许超过四维的数组,怎么可能得到这样的矩阵呢?
是否有任何混淆?