新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1167

 

祝大家有良好的互联网和健康。


问题,我做错了什么?阵列(STATIC)被填入,但计算结果为0(零)。你能告诉我,我的代码中没有什么内容吗?为什么数组元素 没有被比较和添加...?谢谢


 double Open[60],High[60],Lo[60,Close[60]; int to_copy=60;
if(CopyOpen(NULL,PERIOD_H4,1,to_copy,Open)<to_copy)return(0);
   if(CopyHigh(NULL,PERIOD_H4,1,to_copy,High)<to_copy)return(0);
   if(CopyLow(NULL,PERIOD_H4,1,to_copy,Low)<to_copy)return(0);
   if(CopyClose(NULL,PERIOD_H4,1,to_copy,Close)<to_copy)return(0);
//----   
   //int start=to_copy*PeriodSeconds(PERIOD_H4)/PeriodSeconds(_Period);
   int start=to_copy;
   
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=start; j++)
           {
            if(Open[j]>Close[j])
               candle+=Open[j]-Close[j];
            if(Close[j]>Open[j])
               candle+=Close[j]-Open[j];
            candleHL+=High[j]-Low[j];
            br+=1;
           } //for 
Comment(High[10],". ",candle);
candle дает результат 0 ноль
 
kopeyka2:

祝大家有良好的互联网和健康。


问题,我做错了什么?阵列(STATIC)被填入,但计算结果为0(零)。你能告诉我,我的代码中没有什么内容吗?为什么数组元素 没有被比较和添加...?谢谢


1) 循环超出了数组的范围--如果缓冲区的大小是60,最后的索引是59,因为第一个索引是0

2)代码不完整--例如,Tf是如何定义的,Candle是用什么初始化的?


* 当复制价格时,索引被转移了一个,因为你从第一个索引开始复制60个元素,也就是说,第一个关闭的酒吧的价格已经在索引0之下了

 

该功能如何运作

IsStopped();

...以及它执行的任务清单是什么?


在帮助中写道--"检查mql5-程序的强制终止"。就是说,它有点像 "看 "前面的一些代码行,并检查是否有什么是正确的?其责任范围是如何设定的(如每条线或10条线)?


我以为它只是防止循环超出数组的范围,但我在复制高价和低价之前的FAMA代码中又看到了这一点

 
Alexandr Sokolov:

该功能如何运作

...以及它执行的任务清单是什么?


在帮助中写道--"检查mql5-程序的强制终止"。就是说,它有点像 "看 "前面的一些代码行,并检查是否有什么是正确的?其责任范围是如何设定的(如每条线或10条线)?


我以为它只是防止循环超出数组,但我看到它仍然在复制价格高低之前的FAMA代码中。

它看起来没有任何地方...它清楚地写在那里。它检查旗帜...重读 它。

Документация по MQL5: Проверка состояния / IsStopped
Документация по MQL5: Проверка состояния / IsStopped
  • www.mql5.com
Возвращает true, если в системной переменной _StopFlag содержится значение, отличное от 0. Ненулевое значение записывается в переменную _StopFlag, если поступила команда завершить...
 
Alexandr Sokolov:

该功能如何运作

...以及它执行的任务清单是什么?


在帮助中写道--"检查mql5-程序的强制终止"。就是说,它有点像 "看 "前面的一些代码行,并检查是否有什么是正确的?其责任范围是如何设定的(如每条线或10条线)?


我以为它只是防止循环超出数组的范围,但我在复制最高价和最低价之前的FAMA代码中看到了它

如果一个MQL程序停止,_StopFlag将被设置,它可以使用预定义的变量 或IsStopped()函数进行检查--不管是什么,都可以使用这种方式。

在设置_StopFlag后,MQL程序有一点时间来停止,然后终端强制卸载。

最广泛的使用是循环脚本,你不

while(true)
{
...
}

这样写比较好。

while(!IsStopped())
{
...
}

好吧,有时在成本计算或大循环中,他们会使用

for(int i=0; i<1 e6 && !IsStopped(); i++)
{

}
 

大家好。

你能告诉我,是否可以循环使用名称为:L1、L2、L3的变量?写入二维数组的Ln

extern string L1       = "1.15110;1.14105;1.13240;1.12370;1.11640;1.11170;1.10655;1.09895;1.08850;1.07850;1.06475;";
extern string L2       = "1.32130;1.31030;1.29860;1.29042;1.27985;1.25605;1.24725;1.23565;1.22505;1.20815;1.20115;1.18850;1.16690;1.14465;"; 
extern string L3       = "0.94947;0.93222;0.91472;0.90077;0.89075;0.88658;0.86814;0.84687;0.82795;0.81132;0.79022;0.75976;"; 

...

extern string Ln      = " ... ";    
 
Alexandr Sokolov:

1) 循环有一个数组超限 - 如果缓冲区的大小是60,那么最后的索引将是59,因为第一个索引是0

2)代码不完整--例如,Tf是如何定义的,Candle是用什么初始化的?


* 当复制价格时,索引被转移了一个,因为你从第一个索引开始复制60个元素,也就是说,第一个关闭的酒吧的价格将已经在索引0之下

谢谢你的答复。完整的代码。增加了数组的静态大小。删除了操作员中的零控制条目。常见的 "哑巴"。我仍然在试图弄清楚为什么它不加。现在我的代码中没有什么?谢谢你的提示。我还没有在mql5中使用过静态数组.....

我更新了代码。这个问题是一样的...

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, "
//---- номер версии индикатора
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
//----
input int       nBars = 20;
//----
int    limit=0,br=0,to_copy=nBars;
double corrHL,corrOC;
double averpips,averpipsH;
double candle,candleHL;
double opn,hgh,lw,cls;
double Open[65],High[65],Low[65],Close[65];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
   Comment("");
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   

      //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   if(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
//----
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=to_copy; j++) // поменять на ноль?????
           {
            opn=Open[j];
            hgh=High[j];
            lw=Low[j];
            cls=Close[j];
            if(opn>cls)
               candle+=opn-cls;
            if(cls>opn)
               candle+=cls-opn;
            candleHL+=hgh-lw;
            br+=1;
           } //for j
      if(br>0)
        {
         averpips=candle/br;
         averpips=NormalizeDouble(averpips,_Digits);
         averpipsHL=candleHL/br;
         averpipsHL=NormalizeDouble(averpipsHL,_Digits);
        }
      }
   Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpipsHL ",averpipsHL);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpips ",averpips);
数组元素的值大于零。在计算中,零
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
stepystr:

大家好。

你能告诉我,是否可以循环使用名称为:L1、L2、L3的变量?写入二维数组的Ln

删除帖子 - 你知道数组的情况

但仍不可能

作为写宏替换的一个选项,写一个具体的例子--也许有人会给你的任务写一个宏,我不擅长写宏。

 

人们!!!(提示...)))

完整的代码。增加了静态阵列的大小。删除了操作员中的写零控制...常见的 "哑巴"。还是想了解为什么不计算加法。现在我的代码中缺少什么?谢谢你的提示。我还没有在mql5中使用过静态数组.....

我更新了代码。这个问题是一样的...

数组元素的值大于零。在计算中,零
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

谢谢你的答复。完整的代码。增加了静态阵列的大小。删除了操作员中的零控制条目...常见的 "哑巴"。我仍然在试图弄清楚为什么它不加。现在我的代码中没有什么?谢谢你的提示。我还没有在mql5中使用过静态数组.....

我更新了代码。这个问题是一样的...

我对指标不熟悉,但这实在 是没有必要。我已经有了))))

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   

      //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   if(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);