if(cnt_OO>0) //Если нет ордеров то и не надо ни чего делать
{
for(int h = OrdersTotal()-1; h >= 0; h--)
{
if(OrderSelect(h, SELECT_BY_POS))
{
if(cnt_OO==1)
{
//Если ордер один проверяем тот ли ордер (майджик и прочее) и что то там делаем
}
else
{
//Если ордеров больше чем 1 проверяем те ли ордера (майджик и прочее) и что то там делаем
}
}
}
}
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после...
你已经在某处确定了你所需要的订单数量,这一点很好,但在这块,你要再次运行所有的订单,并对它们进行检查!
正确地分解代码,你就会马上看到!
像这样试试吧!
我在你的代码中没有看到其他的东西!
抛出其他情况,让我们看看那里有什么问题 :)
经过对逻辑的仔细研究,我对你的代码进行了反向工程。
结果是这样的
我们可以这样做。但教程中说,如果条件没有得到满足,则处理大括号关闭块后的命令,以处理if()操作符的条件。这种情况不会发生。
还有一个小问题。
如果我在第一个if运算符上再加一个条件--下一个--就不工作了
我有两个建议
1.愚蠢的策略测试者。因为这些情况发生在程序的调试阶段,你必须是一个完全的白痴,才能在真正的账户上检查它。而且在模拟账户上也是如此,因为很难重现重新启动的情况。测试者是个白痴,这个事实告诉我们,如果平仓发生在一个时间段,MT4窗口中几个订单的平仓顺序往往与真实的不一致。如果你在程序中重新计算最后的订单,就可以清楚地看到这一点。这个错误使我花了一个星期的时间去寻找谁是疯子。
测试员的操作逻辑,即使是在滴答历史上,也与现实生活相去甚远。这对我的算法非常关键。
2.作为一种猜测。一个问题,不仅是MQL/MT4的高级大师,也是系统专家的问题。
- 我有两个相同的EA,在不同的窗口对同一对进行操作。例如,当我在周末电脑关闭后的周一运行EA时,当第一个tick出现时,它们都在同一时间开始工作。我希望有一个人先努力恢复状态,然后再恢复另一个。谁的运气好,谁就先工作。
事实上,数据恢复的信息是混合的。换句话说,程序的执行 被某些条件打断,例如系统定时器,然后继续。有趣的情况发生了,例如,切换到另一个账户,以检查它是如何进行的。检查账户的条件是在程序开始的时候,在返回初始账户的时候,程序在中间,并不关心现在有什么账户。
我找到了一个办法--在每个区块的开始,我都会检查账户号码。我不确定它应该在哪里。
Amon1953你看了我修复的第一个版本吗?它是否有效?与if()手册中写的完全一样,而且使用多年来一直有效。问题是在你的代码中,你在一个错误的块中放了一个中断。
if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) 你必须检查分配给变量的东西。
关于第二点--两个猫头鹰将并行运行,所以来自它们的消息将被混合。 为了做到你所描述的那样,你需要在猫头鹰的副本之间实现信号交换。而且非常有趣的是,当你改变账户时,会发生一些奇怪的事情。我非常希望能看到OnInit和OnDeinit。最有可能的是,问题就在那里。
Amon1953你看了我修复的第一个版本吗?它是否有效?与if()手册中写的完全一样,而且使用多年来一直有效。问题是在你的代码中,你在一个错误的块中放了一个中断。
if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) 你必须检查分配给变量的东西。
关于第二点--两个猫头鹰将并行运行,所以来自它们的消息将被混合。 为了做到你所描述的那样,你需要在猫头鹰的副本之间实现信号交换。而且非常有趣的是,当你改变账户时,会发生一些奇怪的事情。我非常希望能看到OnInit和OnDeinit。最有可能的是,问题就在那里。
我没有检查它,因为我们需要通过最后一个订单退出循环(它是列表中的第一个)。
我不是一个有经验的程序员,我不完全了解OnInit和OnDeinit的操作。这就是为什么我的代码中没有使用它们,但它们似乎可以让程序在中间不受干扰地运行。
我也不明白semaphore,顾问被安装在不同的窗口中,有不同的专业。
如果你最近才开始编程,我给你的建议是再次学习基本的编程基础知识。无意冒犯,但你很难与之沟通。
谢谢你。这是一个适合初学者的部分。甚至这种交流也让我受益匪浅。既要做EA算法,又要做程序代码,这很难(尤其是编程语言对我来说相当陌生)。
看起来你需要收紧底座!由于我从你的代码中不太明白你想实现什么逻辑,所以试着用语言解释一下你想做什么。而我将努力解释你的错误所在。
我之前已经解释过我的需求。我将努力澄清细节。
当你重新启动EA时,你需要恢复之前的状态,因为该算法是一个订单链。第一阶是基本的,我们可以从它那里计算出链中下一阶的参数。例如,第二笔订单的量是基数的50%,第三笔是75%,以此类推。当重新启动一个EA时,我们需要知道基线和最后一个订单的成交量,因为下一个订单的成交量将根据上一个订单计算。例如,有3个未结订单,为了计算下一个(第四个)订单,我们需要找到最后一个未结订单的成交量。
如果只有一个订单,这意味着它是基础订单,在这种情况下,我们对它不感兴趣,它是由另一个单位处理。
该算法非常简单。但它只适用于两个if()操作符。
我之前已经解释过我的需求。我将努力澄清细节。
当你重新启动EA时,你需要恢复之前的状态,因为该算法是一个订单链。第一阶是基本的,我们可以从它那里计算出链中下一阶的参数。例如,第二笔订单的量是基数的50%,第三笔是75%,以此类推。当重新启动一个EA时,我们需要知道基线和最后一个订单的成交量,因为下一个订单的成交量将根据上一个订单计算。例如,有3个未结订单,为了计算下一个(第四个)订单,我们需要找到最后一个未结订单的成交量。
如果只有一个订单,这意味着它是基础订单,我们对这种情况不感兴趣,它由另一个单位处理。
该算法非常简单。但它只适用于两个if()操作符。
我没有检查,因为我们需要通过最后一个订单退出循环(它是列表中的第一个)。
我不是一个有经验的程序员,对OnInit和OnDeinit的操作不是很了解。这就是为什么我的代码中没有使用它们,但它们似乎可以让程序在中间不受干扰地运行。
关于信号,也不清楚。 专家顾问被安装在不同的窗口中,有不同的专业。
请阅读文件。
启用时
OnInit()函数是初始 事件处理程序。它可以 是void 或 int类型 ,没有参数。
voidOnInit()。
启动事件是在加载专家顾问或指标后立即生成的。OnInit()函数用于初始化。如果OnInit()有int类型的返回值,非零的返回代码意味着初始化不成功,并产生带有 REASON_INITFAILED去初始化原因代码 的 Deinit 事件。
还要整理出变量的可见性。