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

 

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

有三个变量的例子(事实上还有更多的变量,很麻烦)。

//+------------------------------------------------------------------+
//|                                                            1.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

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;";

//Надо: Вместо rsLevels[] задать двухмерный массив

string rsLevels[]; 

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{

//Надо: Перебрать в цикле переменные L1, L2, L3 и записать в двухмерный массив 

 L1 = StringTrimLeft(StringTrimRight(L1));
 
 if(StringSubstr(L1, StringLen(L1)-1, 1) != ";")
  L1 = StringConcatenate(L1, ";");

 int s = 0,i = StringFind(L1, ";", s);
 string current;
 
 while(i>0)
 
 {
 
  current=StringSubstr(L1, s, i - s);
  
  ArrayResize(rsLevels, ArraySize(rsLevels) + 1);
  
  rsLevels[ArraySize(rsLevels) - 1] = current;
  
  s = i + 1;
  
  i = StringFind(L1,";",s);
  
 }
 
//---------------------------------------------------------

 for(int x=0; x<ArraySize(rsLevels); x++)
  
 {

  Print(rsLevels[x]); 
   
 }
 
 return(INIT_SUCCEEDED);
}
 
kopeyka2:

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

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

这里是编译你的代码时的错误


 
stepystr:

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

有三个变量的例子(事实上,有更多的变量,这很麻烦)。

当然,这个话题是 "歪打正着"(在MQL4和MQL5中),所以最好能说明问题所针对的平台 ))))

 
stepystr:

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

有三个变量的例子(事实上还有更多的变量,很麻烦)。

首先,我们需要决定未来数组第二维中的数值数量。现在我们已经可以看到,元素的数量是不相等的。也许,我们应该取最大的一个,如果有多余的一个,我们应该用零或-1来填补,比如说。而且,如果知道第一个维度,事先定义一下也无妨。然后在嵌套循环中取L1,将你需要的所有内容写入数组,然后外循环的第二次迭代将L2中的所有内容写入下一个索引,以此类推。


而且很正确,最好是把它粘在一个结构里。

 struct name
   {
    double L1[];
    double L2[];
    double Ln[];
   }arr[];
然后数组将能够在第一和第二维度上改变尺寸。也就是说,它将是一个一维数组中的一个一维数组。
 
Alexandr Sokolov:

这里是编译你的代码时的错误


是我缩短了代码和Tf--我只是没有注意到这一点。问题是根本的,为什么静态数组 中的元素不被处理用于计算?

在这里我已经检查过了,编译没有错误))))。计算结果是一样的--NULL!!!数组open[]、close[]等--不那么重要....。

//+------------------------------------------------------------------+
//|                                                          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;
input double    CorrectorHL = 1.0;           //Корректор HL фильтрации размера свечи
input double    CorrectorOC = 1.0;           //Корректор OC фильтрации размера свечи
input color     ColorLines = clrLime;        //Цвет линий
input bool      Tf = false;
//----
int    limit=0,br=0,to_copy=0;
double corrHL,corrOC;
double averpips,averpipsHL,coeff;
double filterOC,filterHL,candle,candleHL;
double opn,hgh,lw,cls;
double Open[65],High[65],Low[65],Close[65];
double level_1,level_2,level_3;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"UP Period ");
   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(CorrectorHL<=0)
      corrHL=1;
   else
      corrHL=CorrectorHL;
   if(CorrectorOC<=0)
      corrOC=1;
   else
      corrOC=CorrectorOC;
//----
   if(nBars<0)
      to_copy=6;
   else
      to_copy=nBars;
      //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   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=0; 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);
         filterOC=averpips;
         filterHL=averpipsHL;
        }
     
     }
   Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpips ",averpips);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
它甚至。
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

是我缩短了代码和Tf--我只是没有注意到这一点。问题是根本的,为什么静态数组 中的元素不被处理用于计算?

在这里我检查了一下,编译没有错误))))。计算结果是一样的--NULL!!!数组open[]、close[]等--不那么重要....。

编译并不检查程序员本人的逻辑错误--这是留给程序员的良知,因为编译器还不能读心。

 
Сергей Таболин:

当然,这个话题是 "歪的"(在MQL4和MQL5中),所以最好能说明问题所针对的平台)))。

MQL4。

 
Artyom Trishkin:

编译并不检查程序员本人的逻辑错误--这是留给程序员的良知,因为编译器还不能读心。

我从根本上寻找一个原因,在哪里?在写现有的代码中,还是在代码中存在其他东西来处理静态数组

我不能知道我不知道的东西......所以我请一位有经验的外部观察者指出我不知道的地方))
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

我主要是在哪里找原因呢?在写现有的代码中,还是在代码中存在其他的东西来处理静态数组

我不能知道我不知道的东西......所以我请一位有经验的外部观察者指出我不知道的地方)))

它没有进入计算阶段


这里有一个初始化

input bool      Tf = false;


这里是一个测试条件

if(Tf==true)
 
SQLite数据库 的操作是否可以从测试者那里得到?我是指添加和改变数据。
原因: