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

 
MrBrooklin #:

非常感谢,亚历山大。您的更正使代码生效了。老实说,我自己在三棵松树上也犯了糊涂。我需要重新学习向函数传递参数。 显然,我在这里完全理解错了。

再见,弗拉基米尔。

将变量输出到全局区域并不是向函数传递参数...

//+------------------------------------------------------------------+
//|                                              Count_Pos (v.2).mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
void Calc_Pos(uint & pos_buy,uint & pos_sell)
  {
   for(int i=0; i<PositionsTotal(); i++)
     {
      PositionGetSymbol(i);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         pos_buy++;
      if(
         PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         pos_sell++;
     }
   Print("pos_buy ",pos_buy);
   Print("pos_sell ",pos_sell);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint count_buy=0, count_sell=0;
   Calc_Pos(count_buy,count_sell);
   Print("По символу ",_Symbol," открыто: ",count_buy," длинных позиций");
   Print("По символу ",_Symbol," открыто: ",count_sell," коротких позиций");
  }
//+------------------------------------------------------------------+

在函数输入端的变量名前加上 &,所有问题都会迎刃而解。

 
Alexey Viktorov #:

将变量输出到全局作用域并不是将参数传递给函数...

在函数输入端的变量名前加上 &,所有问题都会迎刃而解。

嗨,阿列克谢,这就是问题所在!!!非常感谢,亲爱的!我的脑袋都要崩溃了,我还以为还缺了什么!事实证明,脑子是不够用的!!!!))

再见,弗拉基米尔。

 
Alexey Viktorov #:
在函数输入的变量名前加上 &,所有问题都将迎刃而解

我找到并观看了关于带有引用的函数的视频。从这段视频中我意识到,我需要的不仅仅是针对初学者的 MQL5 课程,而是针对特别有天赋的愚蠢初学者的 MQL5 课程。简而言之,我什么都不懂。一般来说,你需要消化你所收到的所有信息,并重新观看这个视频五次甚至六次。不过,在我的业余时间会有事情做的!))

弗拉基米尔

 
MrBrooklin #:

我找到并观看了一段关于带链接函数的视频。从这个视频课程中,我意识到我需要的不仅仅是一个针对 初学者的 MQL5 课程,而是一个针对特别愚蠢的初学者的 MQL5 课程。简而言之,我什么都不懂。总的来说,你需要消化所有接收到的信息,并重新观看这段视频五六遍。不过,闲暇时间我还是会做些事情的!))

弗拉基米尔

即使你无处消磨时间,也不要浪费时间。老师 "的名字不言自明,二流子就是二流子。

这段视频只对您有用 3 分钟。剩下的时间只会让你分心,失去有用的信息。

最好还是仔细阅读文档,结合实例进行实验,你就会明白一切。

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Передача параметров - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

即使无处浪费时间,也不要浪费时间。单凭 "老师 "这个名字就能说明问题,外行就是外行。

这段视频中有用的信息只有 3 分钟。其余的只是分散注意力,让你失去有用的信息。

最好还是仔细阅读文档,通过实例进行实验,你就会明白一切。

谢谢你,阿列克谢,我本以为视频课程会给我带来更多的信息和帮助,但结果恰恰相反。至于《MQL5 参考手册》中的 "参数传递"部分,我也是这样读的,但结果就像那句名言:"我看书,我看图!"。我什么也没看懂。总之,当然,我会再重读几遍,再做几次实验,我没有太多选择。))

弗拉基米尔

 

在观看了视频教程并阅读了《MQL5 参考手册》中有关通过引用 传递参数 的内容后,似乎大致明白了一些。不过,在分析了《参考手册》中的代码后,有一个片段仍然令人困惑,尽管在我看来,它与通过引用传递参数毫无关系:

//+------------------------------------------------------------------+
//| передача параметров по ссылке                                    |
//+------------------------------------------------------------------+
double SecondMethod(int &i,int &j)
  {
   double res;
//---
   i*=2;
   j/=2;
   res=i+j;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---.
   int a=14,b=8;
   Print("a и b перед вызовом:",a," ",b);
   double d= SecondMethod(a,b);
   Print("a и b после вызова:",a," ",b);
  }
//+------------------------------------------------------------------+
//--- результат выполнения скрипта
//  a и b перед вызовом: 14 8
//  a и b после вызова: 28 4

在这方面,我有一个问题要问 MQL5 编程专家--他们到底为什么要把SecondMethod(a,b) 函数 "塞 "到OnStart() 中的d 变量中?这是脚本正确运行的先决条件,还是我又误解了什么?

敬上,弗拉基米尔

 

请帮帮我。

有许多带时间的数组,这些数组中某些元素的时间可能重合。

我需要将它们收集到一个数组中,而不重复时间值。

我是这样做的:

struct str1
  {
   int               time[];// в массиве порядка 10 тыс элементов
  };

struct str2
  {
   str1              arr[];// в массиве порядка 1 тыс элементов
  };

str2 m_name[]; // в массиве порядка 100 элементов

int ArrFull[]; // массив в который нужно собрать отсортированное время без повторений
//+------------------------------------------------------------------+
void OnStart()
  {
// считаем что m_name[] ранее уже заполнили


   int tempArr[];// объявляю дополнительный массив

   int size1 = ArraySize(m_name);
   for(int i = 0; i < size1; i++)
     {
      int size2 = ArraySize(m_name[i].arr);
      for(int j = 0; j < size2; j++)
        {
         // копирую в дополнительный массив все массивы времени из структур
         ArrayInsert(tempArr, m_name[i].arr[j].time, ArraySize(tempArr));
        }
     }
// сортирую дополнительный массив
   ArraySort(tempArr);

   int size = ArraySize(tempArr);
   ArrayResize(ArrFull, size);
   ArrFull[0] = tempArr[0];
   int j = 1;

// копирую не повторяющиеся элементы из дополнительного массива в массив с которым в дальнейшем буду работать
   for(int i = 1; i < size; i++)
      if(ArrFull[j - 1] != tempArr[i])
        {
         ArrFull[j] = tempArr[i];
         j++;
        }

   size = ArrayResize(ArrFull, j);

// дальше продолжение. много много букв
  }
//+------------------------------------------------------------------+


但结果是代码非常慢。需要加快速度。如何 ????

 
MrBrooklin 通过引用 传递参数 的内容后,似乎大致明白了一些。不过,在分析了《参考手册》中的代码后,有一个片段仍然引起了一些困惑,尽管我认为它与通过引用传递参数无关:

在这方面,我有一个问题想请教 MQL5 编程专家--他们到底为什么要把SecondMethod(a,b) 函数 "塞 "到OnStart() 中的d 变量中?难道这是脚本正确运行的先决条件,而我又误解了什么?

敬上,弗拉基米尔。

d 变量分配的是函数执行的结果
 
Artyom Trishkin #:
变量 d 被分配给函数执行的结果

感谢 Artyom 的回复!是否不可能使用 函数SecondMethod(a,b) 而不进行 赋值

敬上,弗拉基米尔

 
MrBrooklin #:

感谢 Artyom 的回复!是否不可能使用 函数SecondMethod(a,b) 而不进行 赋值

敬上,弗拉基米尔

可以。这样就会收到两个值--只是在通过引用传递的变量中。也就是说,函数返回三个值