初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1496 1...148914901491149214931494149514961497149814991500150115021503 新评论 maxvoronin74 2024.02.07 14:53 #14951 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 类型的最大值来填充复制变量的小时间隔。我也无法解决这个问题。 Aleksandr Slavskii 2024.02.07 15:56 #14952 maxvoronin74 #:谢谢你的提示。我不知道。为了以防万一,我加了这一行。我是否正确理解了你的玩笑话,即汇率将所有价格平均化,并将条形图考虑在内,但 ticks 却没有?这就是为什么我认为 tick 使用的是任意时间间隔,而不是柱状价格。在我的类似公式中,CopyRates 用 ulong 类型的最大值来填充复制变量的小时间隔。我也无法解决这个问题。 一切都错了。 MqlRates 是一个 结构,你把它当作一个变量。 MqlTick 也是一个结构。 你试图将 "温 "和 "软 "结合起来,所以编译器无法理解你的意思。 我也不明白)))))。 也许我可以提出一些有用的建议,但从你的代码中看不出你想找到什么。 maxvoronin74 2024.02.07 16:07 #14953 Aleksandr Slavskii #:全都错了。MqlRates 是一个 结构,而你把它当成了一个变量。MqlTick 也是一个结构。你试图将 "温 "和 "软 "结合起来,因此编译器无法理解你的意思。我也不明白))))也许我可以提出一些有用的建议,但从您的代码中看不出您想找到什么。 我们的任务是修改 WPR(Williams Percent Range,威廉姆斯百分比范围),以获得任意时间段内 WPR 值的差值,而不考虑条形图。 Aleksandr Slavskii 2024.02.07 17:55 #14954 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 maxvoronin74 2024.02.07 21:42 #14955 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 系统脱离了图表。 JRandomTrader 2024.02.07 21:55 #14956 maxvoronin74 #:谢谢。如果我的教训是正确的,结果就是这样: 因为无论如何我们都要循环遍历所有的刻度,所以我们不能在这个循环中复制,而是要一次性查找最大最小值。 顺便说一句,如果要复制,最好先设置好复制处数组的大小,因为循环不会为我们这样做,我们会在第一次迭代时飞出数组。只有 CopyTicksRange 才会调整目标数组本身的大小。 Aleksandr Slavskii 2024.02.08 02:08 #14957 JRandomTrader #:因为无论如何,我们都要对所有刻度线进行循环,所以我们不能在这个循环中复制,而是要一次性寻找这些最大最小值。顺便说一下,如果要复制,最好先设置好复制处数组的大小,循环不会帮我们设置大小,我们会在第一次迭代时就飞出数组。只有 CopyTicksRange 才会调整目标数组本身的大小。 我是个完美主义者,对结构数组中的独立元素进行排序就像是用泡沫塑料砸玻璃。关于未分配数组,我有一个很好的理由。现在是凌晨一点,我妻子在我耳边说 "该睡觉了,该睡觉了"。))))))。 Aleksandr Slavskii 2024.02.08 05:18 #14958 Aleksandr Slavskii #: 我是个完美主义者,对结构阵列中的单个元素进行排序就像是用泡沫塑料砸玻璃。关于不分配阵列,我有一个很好的理由。时间是凌晨一点,我妻子在我耳边说 "该睡觉了,该睡觉了"。))))))。 什么,晚上还是早上?)是的,你说的对,一次找最大值。我今天早上有点笨。 maxvoronin74 2024.02.08 22:11 #14959 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 进行替代计算。为什么这样更好? Aleksandr Slavskii 2024.02.09 02:35 #14960 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; } 1...148914901491149214931494149514961497149814991500150115021503 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
"找出 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 类型的最大值来填充复制变量的小时间隔。我也无法解决这个问题。
谢谢你的提示。我不知道。为了以防万一,我加了这一行。
我是否正确理解了你的玩笑话,即汇率将所有价格平均化,并将条形图考虑在内,但 ticks 却没有?这就是为什么我认为 tick 使用的是任意时间间隔,而不是柱状价格。在我的类似公式中,CopyRates 用 ulong 类型的最大值来填充复制变量的小时间隔。我也无法解决这个问题。
一切都错了。
MqlRates 是一个 结构,你把它当作一个变量。
MqlTick 也是一个结构。
你试图将 "温 "和 "软 "结合起来,所以编译器无法理解你的意思。
我也不明白)))))。
也许我可以提出一些有用的建议,但从你的代码中看不出你想找到什么。
全都错了。
MqlRates 是一个 结构,而你把它当成了一个变量。
MqlTick 也是一个结构。
你试图将 "温 "和 "软 "结合起来,因此编译器无法理解你的意思。
我也不明白))))
也许我可以提出一些有用的建议,但从您的代码中看不出您想找到什么。
任务是修改 WPR(Williams Percent Range,威廉姆斯百分比范围),以获得任意时间段内 WPR 值的差值,而不考虑条形图。
这有可能(但不确定)是您想要得到的结果。
double lowestLow =ArrayMinimum(bid,0, copied);
谢谢。如果我对课程的理解正确的话,我得到的结果是这样的:
但不幸的是,在 bid_arr[i] = ticks[i].bid; 这一行中,由于 'namemyexpert.mq5' (204,12) 中的数组超出范围,EA 系统脱离了图表。谢谢。如果我的教训是正确的,结果就是这样:
因为无论如何我们都要循环遍历所有的刻度,所以我们不能在这个循环中复制,而是要一次性查找最大最小值。
顺便说一句,如果要复制,最好先设置好复制处数组的大小,因为循环不会为我们这样做,我们会在第一次迭代时飞出数组。只有 CopyTicksRange 才会调整目标数组本身的大小。
因为无论如何,我们都要对所有刻度线进行循环,所以我们不能在这个循环中复制,而是要一次性寻找这些最大最小值。
顺便说一下,如果要复制,最好先设置好复制处数组的大小,循环不会帮我们设置大小,我们会在第一次迭代时就飞出数组。只有 CopyTicksRange 才会调整目标数组本身的大小。
我是个完美主义者,对结构阵列中的单个元素进行排序就像是用泡沫塑料砸玻璃。
因为无论如何,我们都要对所有刻度线进行循环,所以我们不能在这个循环中复制,而是要一次性寻找这些最大最小值。
顺便说一下,如果要复制,最好先设置好复制处数组的大小,循环不会帮我们设置大小,我们会在第一次迭代时就飞出数组。只有 CopyTicksRange 才会调整目标数组本身的大小。
对不起。我没注意。已更正。谢谢。我忘了 ArrayMaximum 值是一个索引,而不是价格。不过现在已经解决了。
由于 ArrayMaximum 对 ticks 数组不起作用,我试着用循环中的 if 进行替代计算。为什么这样更好?
为什么更好?