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

 
Aleksandr Slavskii #:

"找出 ticks 数组中的最大值"--我们要找出什么的最大值?

ticks[copied-1].bid 或 ticks[copied-1].flags

开玩笑)))))


您很可能将 CopyTicks 与 CopyRates 混淆了,虽然在 CopyRates 中也有一个结构数组,但您需要指定结构中的哪个元素。

double PrevClose = rates[copied-1].close;

你的代码中多了一行。

您不需要它,因为CopyTicks 和CopyRates 在复制时会自行分配数组大小

谢谢你的提示。我并不知道。我插入这一行是以防万一。

我是否正确理解了你的笑话,即在 rates 中,所有价格都是平均值,并考虑到了条形图,而在 ticks 中则没有?这就是为什么我认为 tick 使用的是任意时间间隔,而不是柱状价格。在我的类似公式中,CopyRates 用 ulong 类型的最大值来填充复制变量的小时间隔。我也无法解决这个问题。

 
maxvoronin74 #:

谢谢你的提示。我不知道。为了以防万一,我加了这一行。

我是否正确理解了你的玩笑话,即汇率将所有价格平均化,并将条形图考虑在内,但 ticks 却没有?这就是为什么我认为 tick 使用的是任意时间间隔,而不是柱状价格。在我的类似公式中,CopyRates 用 ulong 类型的最大值来填充复制变量的小时间隔。我也无法解决这个问题。

一切都错了。

MqlRates 是一个 结构,你把它当作一个变量。

MqlTick 也是一个结构。

你试图将 "温 "和 "软 "结合起来,所以编译器无法理解你的意思。

我也不明白)))))。

也许我可以提出一些有用的建议,但从你的代码中看不出你想找到什么。

 
Aleksandr Slavskii #:

全都错了。

MqlRates 是一个 结构,而你把它当成了一个变量。

MqlTick 也是一个结构。

你试图将 "温 "和 "软 "结合起来,因此编译器无法理解你的意思。

我也不明白))))

也许我可以提出一些有用的建议,但从您的代码中看不出您想找到什么。

我们的任务是修改 WPR(Williams Percent Range,威廉姆斯百分比范围),以获得任意时间段内 WPR 值的差值,而不考虑条形图。
 
maxvoronin74 #:
任务是修改 WPR(Williams Percent Range,威廉姆斯百分比范围),以获得任意时间段内 WPR 值的差值,而不考虑条形图。

这有可能(但不确定)是您想要得到的结果。

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double bid[];
   for(int i = 0; i < copied; i++)
      bid[i] = ticks[i].bid;
   double PrevClose = bid[copied - 1]; // Получаем последний элемент массива как значение PrevClose
   double highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticks
   double lowestLow = ArrayMinimum(bid, 0, copied); // Находим минимальное значение в массиве ticks
 
Aleksandr Slavskii #:
double lowestLow =ArrayMinimum(bid,0, copied);

谢谢。如果我对课程的理解正确的话,我得到的结果是这样的:

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
double ask_arr[];
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
double highestBid = ArrayMaximum(bid_arr, 0, copied-1);
double lowestBid = ArrayMinimum(bid_arr, 0, copied-1);
double highestAsk = ArrayMaximum(ask_arr, 0, copied-1);
double lowestAsk = ArrayMinimum(ask_arr, 0, copied-1);
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR
但不幸的是,在 bid_arr[i] = ticks[i].bid; 这一行中,由于 'namemyexpert.mq5' (204,12) 中的数组超出范围,EA 系统脱离了图表。
 
maxvoronin74 #:

谢谢。如果我的教训是正确的,结果就是这样:

因为无论如何我们都要循环遍历所有的刻度,所以我们不能在这个循环中复制,而是要一次性查找最大最小值。

顺便说一句,如果要复制,最好先设置好复制处数组的大小,因为循环不会为我们这样做,我们会在第一次迭代时飞出数组。只有 CopyTicksRange 才会调整目标数组本身的大小。

 
JRandomTrader #:

因为无论如何,我们都要对所有刻度线进行循环,所以我们不能在这个循环中复制,而是要一次性寻找这些最大最小值。

顺便说一下,如果要复制,最好先设置好复制处数组的大小,循环不会帮我们设置大小,我们会在第一次迭代时就飞出数组。只有 CopyTicksRange 才会调整目标数组本身的大小。

我是个完美主义者,对结构数组中的独立元素进行排序就像是用泡沫塑料砸玻璃。
关于未分配数组,我有一个很好的理由。现在是凌晨一点,我妻子在我耳边说 "该睡觉了,该睡觉了"。))))))。
 
Aleksandr Slavskii #:
我是个完美主义者,对结构阵列中的单个元素进行排序就像是用泡沫塑料砸玻璃。
关于不分配阵列,我有一个很好的理由。时间是凌晨一点,我妻子在我耳边说 "该睡觉了,该睡觉了"。))))))。
什么,晚上还是早上?)
是的,你说的对,一次找最大值。我今天早上有点笨。
 
JRandomTrader #:

因为无论如何,我们都要对所有刻度线进行循环,所以我们不能在这个循环中复制,而是要一次性寻找这些最大最小值。

顺便说一下,如果要复制,最好先设置好复制处数组的大小,循环不会帮我们设置大小,我们会在第一次迭代时就飞出数组。只有 CopyTicksRange 才会调整目标数组本身的大小。

对不起。我没注意。已更正。谢谢。我忘了 ArrayMaximum 值是一个索引,而不是价格。不过现在已经解决了。

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
ArrayResize(bid_arr,copied,100000);
double ask_arr[];
ArrayResize(ask_arr,copied,100000);
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
int IndMaxBid = ArrayMaximum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с максимальной ценой
double highestBid = bid_arr[IndMaxBid]; // Самая высокая цена bid за период
int IndMinBid = ArrayMinimum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с минимальной ценой
double lowestBid = bid_arr[IndMinBid]; // Самая низкая цена bid за период
int IndMaxAsk = ArrayMaximum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с максимальной ценой
double highestAsk = ask_arr[IndMaxAsk]; // Самая высокая цена ask за период
int IndMinAsk = ArrayMinimum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с минимальной ценой
double lowestAsk = ask_arr[IndMinAsk]; // Самая низкая цена ask за период
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR

由于 ArrayMaximum 对 ticks 数组不起作用,我试着用循环中的 if 进行替代计算。为什么这样更好?

 
maxvoronin74 #:

为什么更好?

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double highestHigh = 0, lowestLow = DBL_MAX;
   for(int i = 0; i < copied; i++)
     {
      if(highestHigh < ticks[i].ask) // Находим максимальное значение в массиве ticks
         highestHigh = ticks[i].ask;
      if(lowestLow > ticks[i].bid) // Находим минимальное значение в массиве ticks
         lowestLow = ticks[i].bid;
     }