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

 
Vitaly Gorbunov:

你已经在某处确定了你所需要的订单数量,这一点很好,但在这块,你要再次运行所有的订单,并对它们进行检查!

正确地分解代码,你就会马上看到!

当然,你可以再重新计算一下。但这并不能说明问题。if()运算符不执行 "否则"。这只是一个案例,还有其他案例。
 
for(int h = OrdersTotal()-1; h >= 0; h--)
    {
     if(OrderSelect(h, SELECT_BY_POS))
      {
       if((cnt_OO >= 2))
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
//         break;
        }
       break;
       }
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;
     
        }}

像这样试试吧!

我在你的代码中没有看到其他的东西!

抛出其他情况,让我们看看那里有什么问题 :)

经过对逻辑的仔细研究,我对你的代码进行了反向工程。

结果是这样的

if(cnt_OO>0) //Если нет ордеров то и не надо ни чего делать
{
  for(int h = OrdersTotal()-1; h >= 0; h--)
   {
    if(OrderSelect(h, SELECT_BY_POS))
     {
      if(cnt_OO==1)
         {
          //Если ордер один проверяем тот ли ордер (майджик и прочее) и что то там делаем
         }
      else
         {
          //Если ордеров больше чем 1 проверяем те ли ордера (майджик и прочее) и что то там делаем
         }
     }
   }
   
}
 

我们可以这样做。但教程中说,如果条件没有得到满足,则处理大括号关闭块后的命令,以处理if()操作符的条件。这种情况不会发生。

还有一个小问题。

     if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots))
      {
       

如果我在第一个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。最有可能的是,问题就在那里。

 
Vitaly Gorbunov:

Amon1953你看了我修复的第一个版本吗?它是否有效?与if()手册中写的完全一样,而且使用多年来一直有效。问题是在你的代码中,你在一个错误的块中放了一个中断。

if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) 你必须检查分配给变量的东西。

关于第二点--两个猫头鹰将并行运行,所以来自它们的消息将被混合。 为了做到你所描述的那样,你需要在猫头鹰的副本之间实现信号交换。而且非常有趣的是,当你改变账户时,会发生一些奇怪的事情。我非常希望能看到OnInit和OnDeinit。最有可能的是,问题就在那里。

我没有检查它,因为我们需要通过最后一个订单退出循环(它是列表中的第一个)。

我不是一个有经验的程序员,我不完全了解OnInit和OnDeinit的操作。这就是为什么我的代码中没有使用它们,但它们似乎可以让程序在中间不受干扰地运行。

我也不明白semaphore,顾问被安装在不同的窗口中,有不同的专业。

 
如果你最近才开始编程,我给你的建议是,再看一看基本的编程基础知识。无意冒犯,但你很难与之沟通。
 
Vitaly Gorbunov:
如果你最近才开始编程,我给你的建议是再次学习基本的编程基础知识。无意冒犯,但你很难与之沟通。
谢谢你。本节是为初学者准备的。甚至这种交流也让我受益匪浅。既要做EA算法,又要写程序代码,这是很困难的(此外,编程语言对我来说是很新的。)
 
Amon1953:
谢谢你。这是一个适合初学者的部分。甚至这种交流也让我受益匪浅。既要做EA算法,又要做程序代码,这很难(尤其是编程语言对我来说相当陌生)。
看起来你需要改进基础知识!由于我从你的代码中不太明白你想实现什么样的逻辑,所以试着用语言解释一下你想做什么。而我将努力解释你的错误所在。
 
Vitaly Gorbunov:
看起来你需要收紧底座!由于我从你的代码中不太明白你想实现什么逻辑,所以试着用语言解释一下你想做什么。而我将努力解释你的错误所在。

我之前已经解释过我的需求。我将努力澄清细节。

当你重新启动EA时,你需要恢复之前的状态,因为该算法是一个订单链。第一阶是基本的,我们可以从它那里计算出链中下一阶的参数。例如,第二笔订单的量是基数的50%,第三笔是75%,以此类推。当重新启动一个EA时,我们需要知道基线和最后一个订单的成交量,因为下一个订单的成交量将根据上一个订单计算。例如,有3个未结订单,为了计算下一个(第四个)订单,我们需要找到最后一个未结订单的成交量。

如果只有一个订单,这意味着它是基础订单,在这种情况下,我们对它不感兴趣,它是由另一个单位处理。

该算法非常简单。但它只适用于两个if()操作符。

 
Amon1953:

我之前已经解释过我的需求。我将努力澄清细节。

当你重新启动EA时,你需要恢复之前的状态,因为该算法是一个订单链。第一阶是基本的,我们可以从它那里计算出链中下一阶的参数。例如,第二笔订单的量是基数的50%,第三笔是75%,以此类推。当重新启动一个EA时,我们需要知道基线和最后一个订单的成交量,因为下一个订单的成交量将根据上一个订单计算。例如,有3个未结订单,为了计算下一个(第四个)订单,我们需要找到最后一个未结订单的成交量。

如果只有一个订单,这意味着它是基础订单,我们对这种情况不感兴趣,它由另一个单位处理。

该算法非常简单。但它只适用于两个if()操作符。

阿蒙1953

我没有检查,因为我们需要通过最后一个订单退出循环(它是列表中的第一个)。

我不是一个有经验的程序员,对OnInit和OnDeinit的操作不是很了解。这就是为什么我的代码中没有使用它们,但它们似乎可以让程序在中间不受干扰地运行。

关于信号,也不清楚。 专家顾问被安装在不同的窗口中,有不同的专业。

请阅读文件。

启用时

OnInit()函数是初始 事件处理程序。它可以 void int类型 ,没有参数

voidOnInit()。

启动事件是在加载专家顾问或指标后立即生成的。OnInit()函数用于初始化。如果OnInit()有int类型的返回值,非零的返回代码意味着初始化不成功,并产生带有 REASON_INITFAILED去初始化原因代码 Deinit 事件。

还要整理出变量的可见性。

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после...
原因: