mql4语言的特点、微妙之处以及技巧 - 页 10

 
Alexey Viktorov:

我无法理解什么是惊喜。在文档中,有一个订单类型的int值。

OP_BUY

0

购买

销量

1

出售

OP_BUYLIMIT

2

买入上限挂单

OP_SELLLIMIT

3

悬而未决的卖出限价单

OP_BUYSTOP

4

悬而未决的买入止损单

OP_SELLSTOP

5

悬而未决的卖出止损单


#define OP_BALANCE 6
#define OP_CREDIT 7

因此,对于6个单元格的阵列,你有时可以做得很过分。

 

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

我想把EA的评论从左角移到右角?

fxsaber, 2018.07.10 15:13

// Вывод комментария по примерным координатам
void CommentXY( string Str, const uint X = 0, const uint Y = 0 )
{
  string Shift = NULL;
  
  StringInit(Shift, X >> 2, ' ');
  
  if (StringLen(Shift))
  {
    StringReplace(Str, "\n", "\n" + Shift);
    
    Str = Shift + Str;
  }
  
  if (Y)
  {
    StringInit(Shift, Y / 14, '\n');
    
    Str = Shift + Str;
  }
  
  Comment(Str);  
}


应用

void OnStart()
{
  const uint Height = 200;
  const uint Width = 200;
  
  while (!IsStopped())
  {
    CommentXY("Hello World!\nCommentXY", MathRand() * Width / SHORT_MAX, MathRand() * Height / SHORT_MAX); // Вывод комментария со сдвигом (ноль - левый-верхний угол).
    
    Sleep(200);
  }
}
 

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

如何正确选择历史上的最后一个订单?

fxsaber, 2018.07.17 03:27

MT4的交易历史是按收盘时间排序的,这一规则不会改变。

 
fxsaber:

你有来自开发商的官方回应吗?到目前为止,我只能看到你已经寻找、思考并决定。

 
Artyom Trishkin:

你有来自开发商的官方回应吗?到目前为止,我只看到你自己在寻找、思考和决定。

我对 "自给自足 "水平的结论并不比本主题开始时的这个结论好。

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

mql4的特殊性,技巧和窍门

订单类型 和与之对应的价格。只要写上OrderClosePrice()就可以了。


没有必要遭受胡言乱语/偏执狂的困扰。

 
fxsaber:

我对 "自力更生 "水平的结论不比本主题开始时的这个结论大


没有必要受到胡言乱语/偏执狂的困扰。

你一定是错过了大多数没有患 "偏执狂 "的人紧急重写代码的时间,因为EA一夜之间就崩溃了。因为对分流的依赖。这已经是很久以前的事了,但人们仍然有记忆。那些陷入困境的人开始编写与分类无关的代码。我没有惹上麻烦--我只是在论坛上看到了这个消息,并把它记在心里。

 
Artyom Trishkin:

你一定错过了大多数没有患 "偏执狂 "的人因EA一夜之间崩溃而紧急重写代码的时间。因为对分流的依赖。这已经是很久以前的事了,但人们仍然有记忆。那些陷入困境的人开始编写与分类无关的代码。我没有惹上麻烦--我只是在论坛上读到了它,并把它记在心里。

不幸的是,这个神话在论坛的历史中找不到任何支持。此外,开发商一直明确表示他们的立场是,作为一个原则问题,不能进行这种改变。


例如,你可以放心地写

if (OrderType() <= OP_SELL)
  ReverseType = 1 - OrderType();


而不是

if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))
  ReverseType = (OrderType() == OP_BUY) ? OP_SELL : OP_BUY;


你可以自由地写

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

mql4语言的特殊性,技巧和窍门

fxsaber, 2018.04.03 16:15

double Lots[] = {0, 0, 0, 0, 0, 0, 0, 0};

for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    Lots[OrderType()] += OrderLots();

等。

 
fxsaber:

不幸的是,这个神话在论坛的历史中找不到任何支持。此外,开发商一直明确表示他们的立场是,作为一个原则问题,不能进行这种改变。

例如,你可以随意写成以下样子


为什么要进行所有这些伪优化,其中的细微差别我们必须不断牢记?编写不依赖这种假设(命名常数 的含义)的代码真的这么难吗?除了显示对编译器的细微差别有一定的了解,但根本不是说它们更容易理解,这样的结构有什么意义呢?

 
Ihor Herasko:

为什么要进行所有这些伪优化,其中的细微差别必须时刻铭记在心?写出不依赖这种假设的代码真的那么难吗(这个或那个命名的常数 是什么意思)?除了显示出对编译器细微差别的一些知识外,这种结构的意义到底是什么,但根本不是说它们更容易理解?

这很奇怪,我在阅读这种代码时没有任何问题。此外,它的阅读和理解速度比 "规范 "代码要快。

好吧,上面的例子与Lots[]是一个宝藏,展示了代码如何能在同一时间内变得超级长寿和清晰。请注意,这根本不是 "正统 "的。

可能,如果你看一下许多市场/自由工作的源代码,你不仅仅会遇到破烂不堪的 "规范 "代码,你还会遇到可怕的低效率的性能和同样重要的因素--阅读时的代码理解力。


同样是对继续的不灭之爱,对语言的可能性完全不尊重。100行的代码比200行的代码做同样的事情更容易被感知。这就是人们最初抱怨MQL5的原因。看看QB为MT5重新设计的MT4代码--很难理解TC的逻辑(代码大了很多倍)。到MT4原版看看代码会更容易。

 
fxsaber:

奇怪的是,我在阅读这样的代码时没有问题。此外,它的阅读和理解速度比 "规范 "代码要快。

在许多软件公司,这样的代码会让他们的手指被打掉。首先,你必须随时随地避免 "不必要的阅读"。例如,如果你在输入一个函数时使用一个条件。

if (<условие>)
{
}

建议写。

if (!<условие>)
   return;

这种方法真正保住了条件的附加。

好吧,上面关于Lots[]的例子是一个真正的宝库,展示了代码如何既是超大型的又是完全可以理解的。请注意,这根本不是 "正统 "的。

再一次,这是一个痛苦的问题。毕竟,没有人检查OrderType()函数返回了什么。或者,也许它返回-1或6?这是一个利用编译器属性的例子,你应该永远避免。你自己举了很多跨平台代码的例子。那么,为什么在这种情况下你要远离它呢?一个新的MQ编译器出来后,这段代码将不再能正确工作。

同样是对继续的不灭的爱,是对语言的可能性的完全无视。一个100行的代码比一个200行的代码做同样的事情要好理解得多。这就是人们最初抱怨MQL5的原因。看看QB为MT5重新设计的MT4代码--几乎无法理解TC的逻辑(代码大得多)。到MT4原版看看代码会更容易。

继续下去也是一样的情况。像这样的代码。

if (OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == m_nMagicNumber)
{
}

是更难读到的。

if (!OrderSelect(i, SELECT_BY_POS))
   continue;

if (OrderSymbol() != Symbol())
   continue;

if (OrderMagicNumber() != m_nMagicNumber)
   continue;
而在这两种情况下,执行的效率却是一样的。
原因: