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

 
MakarFX #:

如果你不喜欢"-1",你可以这样做。

不,你不能 - 如果你这样访问你的数组,程序会崩溃。

在最好的情况下,如果你访问你的内部数组,你会错过你需要的数据,或者干脆在循环中达不到它。

 
Nikolay Ivanov #:

基本上这很简单,你的独特总结了不同魔术师之间所有不匹配的订单...

例如,有3个订单

第一个迭代的magic=1unique=0,在迭代结束时unique将=2

第二次迭代magik=2unique=2,在迭代结束时unique将是=3

由于3>=所有订单的数量,while循环将中断...而魔法=3从未被检查过......。所以魔法=2,以此类推,所有...

默认情况下,第一阶被赋予魔法=1。
然后循环开始行动:

迭代开始时magic = 1 unique = 0,在结束时(已经有一个magic = 1的订单)magic = 1仍然是1,unique = 0
第二次迭代magic = 2 unique = 0,结束时magic = 2和unique = 1(不匹配),retorn给了第二订单magic = 2。

我想打印整个过程,但出了问题。

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique)
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}

-----------------------------------

'endless cycle.mq4'     endless cycle.mq4       1       1
'}' - semicolon expected        endless cycle.mq4       49      7
'else' - 'while' expected       endless cycle.mq4       50      5
'else' - illegal 'else' without matching 'if'   endless cycle.mq4       50      5
'OnTick' - function declarations are allowed on global, namespace or class scope only   endless cycle.mq4       60      6
'OnTick' - function already defined and has body        endless cycle.mq4       60      6
   see previous declaration of function 'OnTick'        endless cycle.mq4       60      6
'}' - unexpected end of program endless cycle.mq4       63      1
6 errors, 0 warnings            7       1
 
Nerd Trader #:

默认情况下,第一阶被赋予magic = 1。
然后开始一个循环:

迭代开始时magic = 1 unique = 0,在结束时(当已经有一个magic = 1的订单时)magic仍然是1,unique = 0
第二次迭代magic = 2 unique = 0,在结束时,magic = 2和unique = 1(不匹配),retorn被分配到第二订单magic = 2。

我想打印整个过程,但出了问题。

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


 
Artyom Trishkin #:

争取更多--所有的编程语言

这很简单--在编程语言中,计数从零开始。一个数组的第一个单元格的索引为0。因此,你必须在包括它在内的零点之前做一个反向循环。即>=0

OrdersTotal()输出,例如,10。而你从10开始循环,而数组的最后一个索引是9(记住,我们是从0开始的?)那么当你访问一个不存在的数组单元时会发生什么?这是正确的--程序将在一个关键错误中崩溃,因为你已经进入了一个未分配的内存区域,超过了数组的限制

这些是可靠的拐杖,是肯定的。阅读、学习,一切都会向你走来。

谢谢你。我不是这个意思。如果mql是在一个开放的许可证上,任何事情都可以被宽恕。否则,我就是在挑剔你。好吧,在我看来,比如说,我们可以在NormalizeDouble函数中加一个标志,并使用位置修剪或算术四舍五入。或者,例如,我们可以扩展仓位处理的功能,例如,只对卖出或买入返回未结头寸的数量。另外,还可以写一个更详细的帮助。但这只是一个外行的看法。另外,如果前面的陈述看起来很严厉,请原谅我。
 

有大量关于C/C++的免费和良好的课程。

Mql与他们关系密切,你可以自由学习。幸运的是,不需要深厚的知识。但至少要了解语言的语法 和算法的基本原理。

否则,我们就会在这个话题中得到无稽之谈,而不是关于平台和算法的协商,小学水平的对话--放在哪里;什么是循环,为什么索引是0。

例如,有一个网站intuit.ru - 有关于C和算法的课程,花点时间,最多几个星期。同时,你可以得到一份文件 :-)

 
Maxim Kuznetsov 了解语言的语法 和算法的基本原理。

否则,我们就会在这个话题中得到无稽之谈,而不是关于平台和算法的协商,小学水平的对话--放在哪里;什么是循环,为什么索引是0。

例如,有一个网站intuit.ru - 有关于C和算法的课程,花点时间,最多几个星期。你可能同时得到一份文件:-)

像这样吗?


 
Artyom Trishkin #:

例如,OrdersTotal()给出了10。而你从10开始循环,但数组的最后一个索引是9(记得吗,我们是从0开始数的?)那么当你访问一个不存在的数组单元时,会发生什么?这是正确的--程序将在一个关键错误中崩溃,因为你已经进入了一个未分配的内存区域,超过了数组的限制

我纠正了...不会有严重的错误,只是OrderSelect布尔值会返回错误......就这样......。但当然,最好是避免......因为如果你使用不正确的代码特征,就很难预测可能的错误......。


书呆子交易#:

默认情况下,第一阶被赋予magic = 1。
然后开始一个循环:

开始迭代magic = 1 unique = 0,最后(当已经有一个magic = 1的订单时)magic = 1和unique = 0
第二次迭代magic = 2 unique = 0,最后magic = 2和unique = 1(不匹配),retorn被分配到第二个订单magic = 2。

我只是看到,独特的 填充速度非常快,达到了极限,而魔法几乎没有增长......一般来说,将同一个变量用于循环控制和循环内部的逻辑是错误的,因为这个变量会膨胀。

在这种情况下,要找到一个解决方案,但我建议只是重新表述问题......例如,通过循环找到订单中的最大魔力并以+1返回,这将是正确的简单解决方案。

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

你可以这样做,代码在需要时被调用,所以它的重量不是一个问题

在测试中,我使用了买/卖

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  Print(GetMagic());
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные
//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать
//для нашего ордера уникальный маджик
  int arr[];
  int n=-1;
  int OT=OrdersTotal();
  for(int i=0; i<OT; i++) {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
      if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
        if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
          n++;
          ArrayResize(arr,n+1);
          arr[n]=OrderMagicNumber();
        }
      }
    }
  }
  ArraySort(arr);
  OT=ArraySize(arr);
  for(int i=0; i<OT; i++)
    if(arr[i]!=i) return i;
  return OT;
}
//-- удаляет копии с массива
int ArraySearchInt(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
 

关于交易、自动交易系统和策略测试的论坛

新手对MQL4和MQL5的任何问题,对算法和代码的提示和讨论

Vitaly Muzichenko, 2021.10.19 23:08

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


塞米扬-塞米扬奇(Semyon Semyonych)。
Nikolay Ivanov #:

我将稍加纠正。不会出现关键性错误,只是布尔值OrderSelect将返回false ......就这样......。但当然最好是避免......因为如果不正确使用代码功能,很难预测可能的陷阱......。


我只是看到独特的 东西以非常快的速度 填满,并达到其极限,而魔法几乎没有增长......。一般来说,将同一个变量用于循环控制和循环内部的逻辑是错误的,这个变量会膨胀。

在这种情况下,要找到一个解决方案,但我建议只是重新表述问题......例如,通过循环找到订单中的最大魔力并以+1返回,这将是正确的简单解决方案。

这是最后的手段,以防这个方案不成功。同时,这是印刷品得出的结果。

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber()){
              unique ++;
              Print (" MAGIC ", magic, " | UNIQUE ", unique);
            }
          }
        }
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}
------------------------------------------------

2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #10  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 9
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #9  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #8  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #7  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #6  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #5  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #4  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #3  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #2  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #1  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.827 2021.01.04 00:00:00  endless cycle test started

 
Vitaly Muzichenko #:

你可以这样做,代码在需要时被调用,所以它的重量不是一个问题

在测试中,我使用了买/卖

我明天再看,我现在没有精力去研究它。
原因: