初学者的问题 MQL5 MT5 MetaTrader 5 - 页 729

 
Artyom Trishkin:
不知何故(来自@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);
}
//+------------------------------------------------------------------+
有人在某处写道,在选定的行中,你应该这样做:如果(时间>=最后一格)res=0。

说实话,我没有检查过--我不是一直都能得到它。请检查并写出结果。
我写的。这也是符合逻辑的,因为如果时间与当前条形图的开盘时间相吻合,其指数也将为0。是的,纯粹的fxsaber方案会有错误。
 
Alexey Kozitsyn:
我不知道我的解决方案是否 "更简单",但试试这个:https://www.mql5.com/ru/forum/160945#comment_4053382

语言中没有标准 功能,每个人都必须建立自己的自行车,然后衡量他们的表现

似乎除了这个,我都找到了,但看了不同的解决方案后,很明显,它们是 "谁能做什么"。

 
Vitaly Muzichenko:

语言中没有标准 功能,每个人都必须建立自己的自行车,然后衡量他们的表现

除了这个,我似乎都找到了,但在看了不同的解决方案后,很明显,它们是 "谁能做什么"。

没有一个标准的。你提供了文章中的一个变体https://www.mql5.com/ru/articles/81。那里也描述了 "拐杖"。
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 

最后一个问题。今天在代码库中我看到了一个来自 "大师 "的代码,所以它使用了这个。

   double open_1=iOpen(1);
   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);


就在昨天,我写了一篇类似的文章,但我是这样写的。

ArraySetAsSeries(Tick,true);
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;


在我今天所看到的一切之后,我不知为何开始怀疑我的决定是否正确。

问题:哪个选项更好,因为我刚开始学习?

 
Vitaly Muzichenko:

最后一个问题。今天在代码库中我看到了一个来自 "大师 "的代码,所以它使用了这个。

   double open_1=iOpen(1);
   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);


就在昨天,我写了一个类似的东西,但我是这样写的。

ArraySetAsSeries(Tick,true);
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);
  }

变成一次获得多个值的代码。我只是很懒 :)

 
Vladimir Karputov:

在这种情况下,你的实现应该工作得更快--因为复制调用较少--你不是一次复制一个值,而是一次复制三个。

虽然没有人阻止你转换代码,一次得到一个值。

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  }

变成一次获得多个值的代码。我只是很懒 :)

谢谢你的答复

那么,应用我发布的解决方案会更好吗? 只要有一个检查,就不会有错误?

 
Vitaly Muzichenko:

谢谢你的答复

那么,应用我发布的解决方案是否更好呢? 在那里进行一次检查就够了,不会有错误?

CopyRates 至少需要两个检查。

  1. 错误检查(如果...<0)。
  2. 检查函数是否返回了正确的数量(如果你要求的是三个,而只返回了两个呢?)
同样非常可取的是:检查价格是否为垃圾(有可能会返回 "0 "而不是价格)。

 
Vitaly Muzichenko:

谢谢你的答复

那么,应用我发布的解决方案是否更好呢? 在那里进行一次检查就够了,不会有错误?

你的解决方案也不是最优的,因为你用你已经得到的数组中的值初始化了一堆变量。问题是:为什么?什么时候可以只用一个数组?给它起个名字叫Bars,你就会很高兴。

ArraySetAsSeries(Bars, true);
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
 
Vasiliy Sokolov:

你的解决方案也不是最佳的,因为你用一个已经派生的数组的值初始化了一堆变量。问题是:为什么?什么时候可以只用一个阵列?只要称它为Bars,你就会很高兴。

ArraySetAsSeries(Bars, true);
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...

你把它称为Bars,编译器就会给你一巴掌。你是否检查过这个结构,或者只是假设它应该工作,或者我做错了什么?

 
Vitaly Muzichenko:

称其为Bars,编译器被骂得狗血淋头。你有没有测试过这个设计,还是只是假设它应该能工作?

酒吧[]