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

 

晚上好,亲爱的程序员们!

请帮我解决一个简单的问题。有一段来自 MQL4 的代码。我想把它调整到 5。也就是说,要在 MQL5 中同样工作。


//Введем внешнюю переменную, чтобы иметь возможность изменить количество сканируемых свечей.
extern int Window=30;
 
void OnStart()
{
   //Вводим переменные.
   double Highest=High[0];
   double Lowest=Low[0];
 
   //Сканируем 30 свечей и обновляем значения самых высоких и самых низких цен.
   for(int i=0; i<=Window; i++) {
   if(Low[i]<Lowest) Lowest=Low[i];
   if(High[i]>Highest) Highest=High[i];  
}
 
   //Выводим результат.
   Alert("Самая высокая цена ",Highest," - Самая низкая цена ",Lowest);
}



我的变体显然不能通过,由于某种原因出现了很多错误):

//Введем внешнюю переменную, чтобы иметь возможность изменить количество сканируемых свечей.
extern int Window=30;
 
 
void OnStart()
{

double   o = iOpen(NULL, PERIOD_CURRENT, 0);
double   h = iHigh(NULL, PERIOD_CURRENT, 0);
double   l = iLow(NULL, PERIOD_CURRENT, 0);
double   c = iClose(NULL, PERIOD_CURRENT, 0);

double Highest=h;
double Lowest=l;

   //Сканируем 30 свечей и обновляем значения самых высоких и самых низких цен.
     
   for(int i=0; i<=Window; i++) 
{
   if  ( l[i] < Lowest ) 
   Lowest=[i];
  

   if  ( h[i] > Highest ) 
   Highest=[i];  
  
}
 
   //Выводим результат.
   Print("Самая высокая цена ",Highest,
         " - Самая низкая цена ",Lowest);
}
 
 
Alexey Belyakov #:

晚上好,亲爱的程序员们!

请帮我解决一个简单的问题。有一段来自 MQL4 的代码。我想把它调整到 5。也就是说,它应该在 MQL5 中类似地工作。


在帮助中查找

iHigh

和类似函数

如果不起作用,说明循环中存在错误。

而且你看不到正在向哪个变量添加数据

 
lynxntech #:

在帮助中查找

和类似功能

如果不起作用,说明循环中存在错误

并且您无法看到正在向哪个变量添加数据

应该显示最高/最低值。

请看下面的代码

int val_index=iLowest(NULL,0,MODE_CLOSE,10,1);

非常接近,但还不行。

好吧,它显示的是最后 10 根(从第一根 "1 "开始)蜡烛图中最低价的数字。但我需要的是价格值,而不是蜡烛编号。

 

一般来说,不需要向后看,而是向前看。

例如:在接下来的 100 根蜡烛中,寻找从上一根蜡烛(编号为 "1")开始的 "最小值"。

 
lynxntech #:

这一切都可以做到,问题是那些测量实际工作的人,最好是开发商,谁知道他们在那里的计划是什么

不想做实验,还有很多其他工作要做。

好吧。.........

 
Alexey Viktorov #:

这就对了。与国王无关 .........

也许我们应该关闭 "初学者问题 "主题?阿列克谢,如果你不想帮忙,请不要插手,你的抱怨太多了。

我对专业人士的回答很感兴趣,想知道平台是如何运作的。

 
Alexey Belyakov #:

晚上好,亲爱的程序员们!

请帮我解决一个简单的问题。有一段来自 MQL4 的代码。我想把它调整到 5。也就是说,它应该在 MQL5 中类似地工作。




我的变体显然不起作用,因为某些原因会出现大量错误):

显然,你完全不熟悉编程。所以无论给你什么建议,你都不会成功。

不过......试着理解函数

int  CopyHigh(
   string           symbol_name,      // имя символа
   ENUM_TIMEFRAMES  timeframe,        // период
   int              start_pos,        // откуда начнем 
   int              count,            // сколько копируем
   double           high_array[]      // массив для копирования максимальных цен
   );

和使用数组的功能

int  ArrayMaximum(
   const void&   array[],             // массив для поиска
   int           start=0,             // с какого индекса начинаем поиск
   int           count=WHOLE_ARRAY    // количество проверяемых
   );

解决这个问题还有其他方法。

 
Alexey Belyakov #:

晚上好,亲爱的程序员们!

请帮我解决一个简单的问题。有一段来自 MQL4 的代码。我想把它调整到 5。也就是说,它应该在 MQL5 中类似地工作。




我的变体显然不起作用,因为某些原因会出现大量错误):

使用 CopyRates() 而不是一堆指标,代码编辑将变得最少,代码将保持紧凑和可读性。

//Введем внешнюю переменную, чтобы иметь возможность изменить количество сканируемых свечей.
extern int Window=30;
 
void OnStart()
{
   //Вводим переменные.
   double Highest=DBL_MIN;// 
   double Lowest=DBL_MAX; // 
   MqlRates rates[];
   //Сканируем 30 свечей и обновляем значения самых высоких и самых низких цен.
   if (CopyRates(_Symbol,_Period,30,rates)!=30) {
      Alert("copyRates failed");
      return;
   }
   for(int i=0; i<=Window; i++) {
      if(rates[i].low<Lowest) Lowest=rates[i].low;
      if(rates[i].high>Highest) Highest=rates[i].high;  
   }
 
   //Выводим результат.
   Alert("Самая высокая цена ",Highest," - Самая низкая цена ",Lowest);
}

实际上,您还应该添加对弯曲引号的检查

 
Maxim Kuznetsov #:

CopyRates(),而不是一堆指标,代码编辑将变得最少,代码将保持紧凑和可读性。

实际上,您还应该添加对曲引号的检查

马克西姆,CopyRates 不就是获得了一个符号的所有功能吗?

更便宜,有单独的功能

 
lynxntech #:

马克西姆,CopyRates 不就是为了获得角色的所有特征吗?

如果有个别特征

1)根据开发人员的说法,是虚拟复制,即如果可能的话,数据不会转移,内部引用会转移 2)即使是完全复制,它也比分别复制 iHigh、iLow 的 CopyBuffer 更快(调用 1 次而不是 2 次,这仍将进入相同的终端结构)。

最后,最重要的一点是:在移植时,代码应尽可能地与原始代码相似,这一点非常重要,甚至在视觉上也是如此。您必须绝对确保它(代码)所做的事情与原始代码完全相同。小的优化工作要在事后进行,而且只在真正关键的地方进行。

原因: