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

 
Vitalie Postolache:


如果你把它与余额相比较,就是这样的。

谢谢你。

 
trader781:

好的,那么按照我的理解,我们得到三个不同的自定义函数,其返回值是正确的(如果我们寻找三个不同的参数)。

阵列排序

然后

按正确的数字进行ArrayBsearch

然后如何处理它?

正是从数组到结构元素的转变

你不明白。

你需要做一个单一的函数,对全局声明的数组 进行填充和排序。数组将需要通过引用传递给函数。

而你需要额外的函数,从这个数组中取出你需要的数据。

 
Artyom Trishkin:

你不明白。

你需要做一个单一的函数来填充和排序一个 全局声明的数组。数组将需要通过引用传递给函数。

而你需要额外的函数,从这个数组中获取你需要的数据。

好的,你能演示一下如何从一个结构数组中拉出一些东西吗? 比方说填充和排序

如何通过参考和写作进行转移。

 

请告知条件应该是什么样子的。如果触发了止损,那么手数将乘以2,如果下一个订单触发了获利,那么手数将回到原来的手数,也就是止损之前的手数。

我是这样理解的,但我不知道该如何继续下去......

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

 

另一个问题,我在删除订单块中写错了什么? 它并不总是删除订单,在日志中说

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }
 
wishmast:

另一个问题,我在删除订单的程序块中写错了什么? 它并不总是删除订单,在日志中显示

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }


你试图删除一个市场订单,它们不会被删除,而是用OrderClose()函数关闭。为了使循环能够正确地删除或关闭,我们必须按其类型来区分订单。

if(OrderType()<=OP_SELL) - 用于市场订单,if(OrderType()>OP_SELL) - 用于挂起订单。

 

有一个东西叫CHARTEVENT_MOUSE_MOVE

问题:这在没有鼠标的移动设备上是否有效?

 
wishmast:

请告知条件应该是什么样子的。如果触发了止损,那么手数将乘以2,如果下一个订单触发了获利,那么手数将回到原来的手数,也就是止损之前的手数。

我是这样理解的,但我不知道该如何继续下去......

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

如果你做得很快,最后一个亏损的订单就会显示出来,该怎么处理,哪些参数要修正,我想你会明白。
附加的文件:
last1.mq4  4 kb
 
wishmast:

请告知条件应该是什么样子的。如果触发了止损,那么手数将乘以2,如果下一个订单触发了获利,那么手数将回到原来的手数,也就是止损之前的手数。

我是这样理解的,但我不知道该如何继续下去......

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

这个问题的解决取决于专家顾问的全部逻辑,你可以通过它的注释来追踪止损或止盈的触发情况。

  if(StringFind(OrderComment(),"sl")>=0)// сработал стоплосс
  if(StringFind(OrderComment(),"tp")>=0)// сработал тейкпрофит

...

 
Artyom Trishkin:

你不明白。

你需要做一个单一的函数来填充和排序 在全局层面声明的 数组。数组将需要通过引用传递 给函数。

而你需要额外的函数,从这个数组中取出你需要的数据。

Artem,你错了。在全局层面上声明的数组在程序的所有部分都是可见的,你不必从某个地方传递它。它只是在程序中的一个地方填写,在另一个地方排序,在第三个地方读取,这并不重要。
原因: