Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=Period(); doubleClose[1]; double close=0; int copied=CopyClose(symbol,timeframe,index,1,Close); if(copied>0) close=Close[0]; return(close); }
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) }
不知何故(来自@fxsaber 的解决方案)。
//| Возвращает смещение бара по времени |
//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
int res=-1;
datetime last_bar;
if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
if(time>last_bar) res=0;
else {
const int shift=Bars(symbol_name,timeframe,time,last_bar);
if(shift>0) res=shift-1;
}
}
return(res);
}
//+------------------------------------------------------------------+
说实话,我没有检查过--我不是一直都能得到它。请检查并写出结果。
我不知道我的解决方案是否 "更简单",但试试这个:https://www.mql5.com/ru/forum/160945#comment_4053382
语言中没有标准 功能,每个人都必须建立自己的自行车,然后衡量他们的表现?
似乎除了这个,我都找到了,但看了不同的解决方案后,很明显,它们是 "谁能做什么"。
语言中没有标准 功能,每个人都必须建立自己的自行车,然后衡量他们的表现?
除了这个,我似乎都找到了,但在看了不同的解决方案后,很明显,它们是 "谁能做什么"。
最后一个问题。今天在代码库中我看到了一个来自 "大师 "的代码,所以它使用了这个。
double open_2=iOpen(2);
double high_0=iHigh(0);
double high_1=iHigh(1);
double high_2=iHigh(2);
double high_3=iHigh(3);
double low_0=iLow(0);
double low_1=iLow(1);
double low_2=iLow(2);
double low_3=iLow(3);
double close_1=iClose(1);
double close_2=iClose(2);
就在昨天,我写了一篇类似的文章,但我是这样写的。
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
open1 = Tick[0].open; open2 = Tick[1].open; open3 = Tick[2].open;
high1 = Tick[0].high; high2 = Tick[1].high; high3 = Tick[2].high;
low1 = Tick[0].low; low2 = Tick[1].low; low3 = Tick[2].low;
close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;
在我今天所看到的一切之后,我不知为何开始怀疑我的决定是否正确。
问题:哪个选项更好,因为我刚开始学习?
最后一个问题。今天在代码库中我看到了一个来自 "大师 "的代码,所以它使用了这个。
double open_2=iOpen(2);
double high_0=iHigh(0);
double high_1=iHigh(1);
double high_2=iHigh(2);
double high_3=iHigh(3);
double low_0=iLow(0);
double low_1=iLow(1);
double low_2=iLow(2);
double low_3=iLow(3);
double close_1=iClose(1);
double close_2=iClose(2);
就在昨天,我写了一个类似的东西,但我是这样写的。
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
open1 = Tick[0].open; open2 = Tick[1].open; open3 = Tick[2].open;
high1 = Tick[0].high; high2 = Tick[1].high; high3 = Tick[2].high;
low1 = Tick[0].low; low2 = Tick[1].low; low3 = Tick[2].low;
close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;
在我今天看到的情况后,我不知为何开始怀疑我的决定是否正确。
问题:哪种变体更好,因为我刚开始学习?
在这种情况下,你的实现应该工作得更快--因为复制的调用更少--你一次复制三个值而不是一个。
虽然没有人阻止你转换代码,一次获得一个值。
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
{
if(symbol==NULL)
symbol=Symbol();
if(timeframe==0)
timeframe=Period();
double Close[1];
double close=0;
int copied=CopyClose(symbol,timeframe,index,1,Close);
if(copied>0) close=Close[0];
return(close);
}
变成一次获得多个值的代码。我只是很懒 :)
在这种情况下,你的实现应该工作得更快--因为复制调用较少--你不是一次复制一个值,而是一次复制三个。
虽然没有人阻止你转换代码,一次得到一个值。
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
}
变成一次获得多个值的代码。我只是很懒 :)
谢谢你的答复
那么,应用我发布的解决方案会更好吗? 只要有一个检查,就不会有错误?
谢谢你的答复
那么,应用我发布的解决方案是否更好呢? 在那里进行一次检查就够了,不会有错误?
CopyRates 至少需要两个检查。
谢谢你的答复
那么,应用我发布的解决方案是否更好呢? 在那里进行一次检查就够了,不会有错误?
你的解决方案也不是最优的,因为你用你已经得到的数组中的值初始化了一堆变量。问题是:为什么?什么时候可以只用一个数组?给它起个名字叫Bars,你就会很高兴。
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
你的解决方案也不是最佳的,因为你用一个已经派生的数组的值初始化了一堆变量。问题是:为什么?什么时候可以只用一个阵列?只要称它为Bars,你就会很高兴。
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
你把它称为Bars,编译器就会给你一巴掌。你是否检查过这个结构,或者只是假设它应该工作,或者我做错了什么?
称其为Bars,编译器被骂得狗血淋头。你有没有测试过这个设计,还是只是假设它应该能工作?