//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
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);
}
如果你不喜欢"-1",你可以这样做。
不,你不能 - 如果你这样访问你的数组,程序会崩溃。
在最好的情况下,如果你访问你的内部数组,你会错过你需要的数据,或者干脆在循环中达不到它。
基本上这很简单,你的独特总结了不同魔术师之间所有不匹配的订单...
例如,有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。
我想打印整个过程,但出了问题。
默认情况下,第一阶被赋予magic = 1。
然后开始一个循环:
迭代开始时magic = 1 unique = 0,在结束时(当已经有一个magic = 1的订单时)magic仍然是1,unique = 0
第二次迭代magic = 2 unique = 0,在结束时,magic = 2和unique = 1(不匹配),retorn被分配到第二订单magic = 2。
我想打印整个过程,但出了问题。
争取更多--所有的编程语言。
这很简单--在编程语言中,计数从零开始。一个数组的第一个单元格的索引为0。因此,你必须在包括它在内的零点之前做一个反向循环。即>=0
OrdersTotal()输出,例如,10。而你从10开始循环,而数组的最后一个索引是9(记住,我们是从0开始的?)那么当你访问一个不存在的数组单元时会发生什么?这是正确的--程序将在一个关键错误中崩溃,因为你已经进入了一个未分配的内存区域,超过了数组的限制。
这些是可靠的拐杖,是肯定的。阅读、学习,一切都会向你走来。
有大量关于C/C++的免费和良好的课程。
Mql与他们关系密切,你可以自由学习。幸运的是,不需要深厚的知识。但至少要了解语言的语法 和算法的基本原理。
否则,我们就会在这个话题中得到无稽之谈,而不是关于平台和算法的协商,小学水平的对话--放在哪里;什么是循环,为什么索引是0。
例如,有一个网站intuit.ru - 有关于C和算法的课程,花点时间,最多几个星期。同时,你可以得到一份文件 :-)
否则,我们就会在这个话题中得到无稽之谈,而不是关于平台和算法的协商,小学水平的对话--放在哪里;什么是循环,为什么索引是0。
例如,有一个网站intuit.ru - 有关于C和算法的课程,花点时间,最多几个星期。你可能同时得到一份文件:-)
像这样吗?
例如,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的任何问题,对算法和代码的提示和讨论
Vitaly Muzichenko, 2021.10.19 23:08
我将稍加纠正。不会出现关键性错误,只是布尔值OrderSelect将返回false ......就这样......。但当然最好是避免......因为如果不正确使用代码功能,很难预测可能的陷阱......。
我只是看到独特的 东西以非常快的速度 填满,并达到其极限,而魔法几乎没有增长......。一般来说,将同一个变量用于循环控制和循环内部的逻辑是错误的,这个变量会膨胀。
在这种情况下,要找到一个解决方案,但我建议只是重新表述问题......例如,通过循环找到订单中的最大魔力并以+1返回,这将是正确的简单解决方案。
你可以这样做,代码在需要时被调用,所以它的重量不是一个问题
在测试中,我使用了买/卖