初学者的问题 MQL4 MT4 MetaTrader 4 - 页 115

 

伙计们,这里有一个问题--我如何将变量值放入一维数组?

不要把它送去帮助--这样的问题没有例子。


假设有一个变量a,它在某些条件下发生变化。

我想用一个数组来存储这个变量的最后三个值。这在mql4中是如何实现的?


我在写int mas[3]。

mas[]=a; 在循环中,在改变a的条件之后。

编译器给出了']',但没有任何效果,尽管从逻辑上讲应该如此。- 表达式预期,它要我在mas[]=a的括号内放入一些未知的表达式。

MQL4是否有任何函数可以在每次循环迭代时为数组填充一个变量?


 
Igor Makanu:

我很抱歉没有找到通信的开头,但我想立即建议你避免在其中加入复杂的条件和计算--这使得代码无法阅读,结果是使搜索逻辑错误变得复杂,我会这样写你的代码。

如果你明白我的意思,你可以再修改一下我给你的代码,我的意思是把它放在一个单独的条件中,如果(OrderType()==OP_BUY....)

那么,发现逻辑错误就会容易得多,我认为

在每个OrderSend 之后插入 => 返回

或通过开关进行选择。

switch ( OrderType() )
{ OP_BUY : { if (1) { .... break; }
             if (2) { .... break; }
           }
  OP_SELL : { if (3) { .... break; }
              if (4) { .... break; }
            }
}
 
Vladimir Tkach:

试着这样做,但并不奏效。

的自定义指标 调用中的输入参数很少--算算晨平 指标中有多少个外部变量?(extern)--这就是你在使用iCustom时应该传递的参数数量。

 
John Smith:
.....

当a发生变化时,我在条件后的循环中写int mas[3]=a;。

但没有任何效果,尽管从逻辑上讲应该如此。

学会一步一步地做所有的行动,而不是一下子做完。

例子 :

int mas[3]={0}; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[2]=mas[1];  // самая старая величина а
  mas[1]=mas[0];
  mas[0]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu:

的自定义指标 调用中的输入参数很少--算算晨平 指标中有多少个外部变量?(extern)--这就是你在使用iCustom时应该传递的参数数量。

我已经把它们都试过了。

我已经用另一种方式解决了这个问题。我在专家顾问中插入了指标的价格计算代码。

 
Igor Makanu:

代码的逻辑是一样的,但如果你把条件分割开来,就能更快地找到逻辑错误所在,在你的案例中,如果你把它放在一个单独的条件中,就能得到优化--条件将被检查一次而不是4次。

变成一个单独的条件,我们可以得到代码优化--条件将被检查一次,而不是像你的例子中那样检查4次。

检查专家顾问日志中的输出,使用

用于记录,这样你就可以看到哪个代码片段被执行了,有哪些参数。

谢谢你的答复。将条件分割到极限。检查了有评论的逻辑。结果发现,平仓是基于第一个开仓的条件。这意味着,如果我们先用条件1开了买入或卖出,然后用同样的条件但用条件2开了第二个头寸,那么这个平仓条件就会被忽略,第二个头寸也会用条件1平仓,而不考虑其他神奇数字。我应该怎么做?

 
Vladimir Tkach:

我已经把它们都看完了。

我已经用不同的方式解决了这个问题。我已将价格计算的代码从指标粘贴到专家顾问。

我注意到iCustom()没有被正确调用,它应该是这样的。

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor,1,0);

我在调用指标 时传递了7个参数,而你调用时只有3个参数

我将保留指标调用,但我将修改指标本身--从指标代码中删除外部变量和图形对象


novichok2018

我已经用评论检查了这个逻辑。事实证明,仓位的关闭是根据第一个开放仓位的条件进行的。

祝贺你!你的方向是正确的,但在调试阶段,最好在日志中打印(Print()),而不是在注释中打印(Commetn())。

给我看看代码。

 
Igor Makanu:

所以,我注意到你没有正确调用iCustom(),它应该是这样的。

我在调用指标 时传递了7个参数,而你用3个参数调用了它

我将保留指标调用,但我将修改指标本身--从指标代码中删除外部变量和图形对象


祝贺你!你的方法是正确的,但在调试阶段,最好在日志中输出(Print()),而不是在注释中输出(Commetn())。

显示代码。

 int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(TimeCurrent()>OrderOpenTime()+100)
           { 
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber==101)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<20) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 }
              }
                 
            if(OrderType()==OP_SELL)
              {
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>97.55)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue;  
      }   

我已经删除了打印的内容。

 
novichok2018:

我已经删除了打印的内容。

我不知道你代码的所有逻辑,但在每次订单 关闭后,你肯定需要通过break退出循环;在下一个tick上,你需要再次根据你的条件检查订单--我不知道订单关闭后OrderSelect() 是如何表现的--如果订单关闭,那么选择什么,还是出现错误?

基本上,你的问题是,你想在一个循环中一次性检查和关闭所有的东西。

switch()

或制作一个关闭订单的函数(有现成的订单函数 https://www.mql5.com/ru/forum/131859/page2#434206 )。

或者在你的代码中,在订单关闭后使用断点。

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu:

我不知道你的代码的所有逻辑,但是在每次关闭订单 后,你肯定需要通过break退出循环;在下一个tick你需要再次检查你的条件--我不知道订单关闭后OrderSelect() 是如何表现的--如果订单被关闭,那么选择什么,或者会发生错误?

基本上,你的问题是,你想在一个循环中一次性检查和关闭所有的东西。

switch()

或制作一个关闭订单的函数(有现成的订单函数 https://www.mql5.com/ru/forum/107476 )。

或者在你的代码中,在订单关闭后使用断点。

谢谢你。打破似乎有帮助。我们将看到接下来会发生什么。

原因: