编码mql4上的本地变量和全局变量的问题
Results 1 to 10 of 10

Thread: 编码mql4上的本地变量和全局变量的问题

  1. #1
    2附件嗨,
    我对mql4相当陌生。我一直都很好,但最近我被我遇到的一个问题完全陷害了。我编写了一个简单的ea,当我为buyorder声明一个局部变量时,它工作正常
    int buyorder = OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,0,0,NULL,MagicNumber,0,Green);

    如果(buyordergt; 0)
    OrderModify(buyorder,OrderOpenPrice(),BSL,BTP,0,CLR_NONE);

    但如果我将购买者声明为全局变量(并且取消整数),则不起作用。它只是不断修改订单。对于我的生活,我不明白为什么会出现这种情况,因为全局变量应该能够在程序中的任何地方使用,并且它的价值应该能够改变。我可以坚持使用局部变量,但是我想扩大ea来创建多个订单并使用追踪止损等,我需要使用全局变量。我已经在下面包含了ea。第一个版本(局部变量)起作用,第二个(全局)不起作用。如果任何人都可以帮助我,那将是如此赞赏,因为我花了数天的时间试图解决它。 PS这也适用于可变卖单。
    谢谢

    https://www.forex-pedia.com/attachme...1727520325.mq4

    https://www.forex-pedia.com/attachme...1081469781.mq4

  2. #2

    Quote Originally Posted by ;
    嗨,我对mql4很新。我一直都很好,但最近我被我遇到的一个问题完全陷害了。对于我的生活,我无法理解为什么这...
    首先执行代码的正确缩进。格式非常差。
    https://en.wikipedia.org/wiki/Indent_style然后将所有if语句/块括在花括号{}中。然后你会看到你在其中一个程序中使用了未定义/未初始化的变量。编译器不应该真正地编译它。或者该变量未在其他版本中更新。我还建议在每个函数的顶部定义所有局部变量,并使用大括号来包围所有块。这可能会通过编译器提供反馈,说明有些问题。 TLDR:糟糕的代码格式化; if语句没有大括号的嵌套;内联变量声明欺骗编译器以批准错误代码;代码没有按预期运行。

  3. #3
    当你声明一个局部变量时,它只能在调用start {}的一个实例中使用。每次启动{}时,都会重新声明变量。查看您的代码,只有在没有开立买入指令的情况下才会调用buyorder变量,并且打开新指令。如果订单存在,那么buyorder变量会被if语句绕过,因此不会被声明,因此订单修改例程不会被调用。即如果buyorder不会被叫,那么buyorder会保持未申报的状态,或者具有零值或空值,因为buyorder gt; 0是错误的。所以没有订单修改。另一方面,如果你声明一个全局变量,那么buyorder将保留这些值,所以写入的代码将尝试每次修改,如buyorder gt; 0是真的。希望这有助于弗雷德

  4. #4
    感谢Fred,谢谢Xaphod,这个编码很容易出错!一定会试着让代码更清晰。再次感谢您的输入!

  5. #5

    Quote Originally Posted by ;
    感谢Fred,谢谢,这个编码很容易出错!一定会试着让代码更清晰。再次感谢您的输入!
    您应该只在OrderSend后调用一次OrderModify。那么重要的不是购买者是本地的还是全球的。本地是优选的。插入代码int buyorder = 0; if(PreviousFastlt; PreviousSlow CurrentFastgt; CurrentSlow){if(OpenOrdersThisPair(Symbol())== 0){buyorder = OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,0,0,NULL,MagicNumber,0,Green ); if(buyordergt; 0){OrderModify(buyorder,OrderOpenPrice(),bsl,btp,0,CLR_NONE); }}}

  6. #6

    Quote Originally Posted by ;
    我不明白为什么会发生这种情况,因为全球变量应该能够在任何地方使用
    这是确切的问题。这是一个范围界定问题。在这两个例子中,if(lt; buyordersellordergt; 0;)语句都在错误的范围内;区别在于buyordersellorder的范围随着例子而变化,在第二个例子中造成不良影响。请参阅Xaphod的示例代码,了解适当的范围。如果我可能会问,你用什么语言编码?

  7. #7

    Quote Originally Posted by ;
    {quote}这是确切的问题。这是一个范围界定问题。在这两个例子中,if(lt; buyordersellordergt; 0;)语句都在错误的范围内;区别在于buyordersellorder的范围随着例子而变化,在第二个例子中造成不良影响。请参阅Xaphod的示例代码,了解适当的范围。如果我可能会问,你用什么语言编码?
    你好rockit!其实我不知道如何编程,我一直在阅读很多内容,并阅读了mql4的书。从上面的例子我明白我出错的地方,但我不知道你的意思是通过范围界定。谢谢!

  8. #8

    Quote Originally Posted by ;
    {quote}嗨!其实我不知道如何编程,我一直在阅读很多内容,并阅读了mql4的书。从上面的例子我明白我出错的地方,但我不知道你的意思是通过范围界定。谢谢!
    我的意思是范围/上下文:
    https://en.wikipedia.org/wiki/Scope_(computer_science)检查买单/卖单的if语句被放置在错误的上下文中,因为它们属于其他(外部)if语句的上下文(范围)。

  9. #9
    你好,可以看到全局变量和局部变量之间的区别在于,全局变量可以一次用于比EA更多地在EA和指标之间传输数据,局部变量只由EA声明。希望这个对你有帮助

  10. #10

    Quote Originally Posted by ;
    你好,可以看到全局变量和局部变量之间的区别在于,全局变量可以一次用于比EA更多地在EA和指标之间传输数据,局部变量只由EA声明。希望这个对你有帮助
    这个术语是不幸的,可能会让一些人感到困惑。您指的是客户端的全局变量。前面的帖子提到了一个globalscope变量,它只能在声明EA的地方使用。

發布權限

  • 您不可發布新主題
  • 您不可回复
  • 您不可發布附件
  • 您不可編輯您的帖子
  •  
  • BB代碼是打開的
  • 表情符號是打開的
  • [IMG]代碼是打開的
  • [視頻]代碼是打開的
  • HTML代碼是關閉的
forex-pedia網站使用cookie 文字跟蹤
forex-pedia.com網站使用cookie 文字跟蹤,某些設定已經固定。您可以點擊此處閱讀我們的Cookie使用說明。 請點擊右鍵接受我們的cookies。如果您選擇繼續使用forex-pedia.com網站,我們將認為您接受我們的cookies。