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

 
-Aleks-:

你能在我的功能上告诉我如何做到这一点吗?我真的在努力理解它。


你必须决定你需要哪些函数中的变量(用于主程序),并传递/检索它们。如果你需要所有,那么在程序开始时声明这些变量,它们将对所有的函数一次可见。
 
-Aleks-:

不要想 "为什么",最好想 "如何"。

我告诉你,它不适用于这个功能...

这样的函数通常都很大,这就是为什么为了得到不同的值而多次调用它们执行的原因,但我想一次就得到所有的结果,这很可惜。

例如,我想一次性获得所有手数和按订单类型 划分的所有订单的数量。

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
double n_Lot_BUY;
double n_Lot_SELL;
int n_Order_BUY;
int n_Order_SELL;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  }
void OnTick()
  {
   F();
   Print("Лотов BUY:",n_Lot_BUY,"   Лотов SELL:",n_Lot_SELL,"   Позиций BUY:",n_Order_BUY,"   Позиций SELL:",n_Order_SELL);
  }
//+------------------------------------------------------------------+
void F()
  {
   n_Lot_BUY=0;
   n_Lot_SELL=0;
   n_Order_BUY=0;
   n_Order_SELL=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)){break;}
      if(OrderType()==0)
        {
         n_Order_BUY++;
         n_Lot_BUY=n_Lot_BUY+OrderLots();
        }
      if(OrderType()==1)
        {
         n_Order_SELL++;
         n_Lot_SELL=n_Lot_SELL+OrderLots();
        }
     }
  }
//+------------------------------------------------------------------+
 
Nikolay Gaylis:

我的意思是,我们的想法是事先声明所有的变量,然后通过一个函数来修改它们--明白了,谢谢你的选择。但是,如果一个相同的变量名被用于同一类变量,这并不总是方便的。没有其他选择吗?
 

同样的类型可以组合成一个结构,并作为一个数组声明,如上文建议的那样)

//структура из переменных
struct OrdStruct
   {
   double tp;
   double sl;
   double open;
   double close;
   double lot;
   datetime time_open; 
   datetime time_close;
   };

//массив структур
OrdStruct ORDERS[];


//обращение к переменным
ORDERS[i].sl=OrderStopLoss();
ORDERS[i].tp=OrderTakeProfit();
ORDERS[i].lot=OrderLots();

//или
ORDERS[i]=ORDERS[i+1];

ZeroMemory(ORDERS[i]);
 
Taras Slobodyanik:

同样的类型可以组合成一个结构,并声明为一个数组,如上文建议的那样)

这已经很难理解了......例如,我无法理解i--它等于什么,而且,ORDERS[i]=数组不应该被赋予一个大小吗?

 
-Aleks-:

这已经很难理解了......例如,我不能理解i--什么是相等的,而且,ORDERS[i]=数组的大小不应该是相等的吗?


这只是一个例子,当然需要指定i,并且需要根据订单的数量调整阵列的大小......

也就是说,这些变量是相同的,即tp/sl/lot ...但是数组i的索引改变了

 
-Aleks-:

看到你的苦恼,我很痛苦......你是在一个技术论坛上,请使用逻辑。

1.描述问题。

描述一下你所使用的变量。

描述一下你想得到的输出。

学习在技术论坛上用技术语言表达你的想法。否则,要花很长时间才能猜到这里。

 
Taras Slobodyanik:


这是一个例子,当然我需要根据订单的数量来指定和设置数组的大小

也就是说,这些变量是相同的,即tp/sl/lot ...但数组i的索引发生变化

是的,我知道了,谢谢,我应该在未来尝试使用它,在某处....。我只是不明白,用这种结构作为数组来工作?分类和执行其他标准操作?

 
Alexey Kozitsyn:

看到你的苦恼,我很痛苦......你是在一个技术论坛上,请使用逻辑。

1.描述问题。

描述一下你所使用的变量。

描述一下你想得到的输出。

学习在技术论坛上用技术语言表达你的想法。否则,要花很长时间才能猜到这里。

请写出我的话中哪里没有逻辑?

知道中的煎熬是解决中的快乐。

我不想泄漏我的问题,所以我保持简单--我发现很难猜测是什么造成了感知上的困难......。如果我的 "苦恼 "让你感到不舒服,我很抱歉。

 
-Aleks-:

我的意思是,事先声明所有的变量,然后通过一个函数来改变它们--明白了,谢谢你的变体。但是,如果一个相同的变量名被用于同类变量,并不总是很方便......没有其他选择吗?

仔细阅读这里,你就会明白发生了什么事。这描述的是第一种方案,即通过引用传递参数。

简单地说,当一个函数被调用时,可以通过参数传递一个变量

double FirstMethod(int i,int j)

或通过引用(如果变量名前面有&符号)。

double SecondMethod(int &i,int &j)

在第二种变体中,通过引用传递给函数的变量将与那些甚至具有不同名称的变量一起被改变。在特殊情况下,这些是变量i和j

其他的东西从帮助文本中都很清楚。

Передача параметров - Функции - Основы языка - Справочник MQL4
Передача параметров - Функции - Основы языка - Справочник MQL4
  • docs.mql4.com
Передача параметров - Функции - Основы языка - Справочник MQL4
原因: