来自一个 "傻瓜 "的问题 - 页 13

 
stringo:

实际上,有多达8个字节的信息被赋予了信息,可以用任何方式解释。它可以是日期时间、双倍数、4个短数、8个字符或64位的逐位数。

对于四字节,4个字节的魔法足以编码任何东西,但现在我们有8个。你所需要的只是一个愿望。

我知道,我在4中用得很好,我读了那篇文章(我非常喜欢这个想法)。

这里不清楚的是--为什么不同的类型被指定在不同的地方?

 

请告诉我们,如果价格接近TP,而你现在需要退出,如何用TP和SL平仓

我发送了一个订单,建立了一个等量的新头寸。在大多数情况下,它是有效的。但有时我会遇到这样的情况:一个仓位在TP前有时间关闭,但我没有关闭,而是在市场上得到了一个新的仓位...:(

如何表明开仓是指关闭现有头寸,如果主力头寸已经被关闭,则不需要再开新的头寸?

我可以想到 "在收盘前删除SL和TP或等待TP收盘 "这样的选项,但它们都不是很好的解决方案。难道我们不能像在MT4中那样,执行关闭头寸这样简单的操作吗?

 

CTrade类中查找 PositionClose
我相信它将和你的一样。有一个结论是不可避免的--没有其他办法。

但我支持你的请求。我请开发者考虑这个变体。

增加TRADE_ACTION_CLOSE 操作类型-- 当前价格 在其成交量中关闭一个指定符号的头寸。

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
stringo:

实际上,有整整8个字节的信息,可以用任何方式解释这些信息。它可以是日期时间、双倍数、4个短数、8个字符或64位的逐位数。

对于四字节,4个字节的魔法足以编码任何东西,但现在我们有8个。这将只是一厢情愿的想法。

在long和ulong中大约有8个字节,从《参考》中可以看出。令人不安的是这些类型在魔法方面的使用不一致。

一个简单的例子:在发送交易请求时,指定request.magic=ULONG_MAX-1是可以接受的。为什么《参考手册》说OrderGetInteger(ORDER_MAGIC )函数只返回长类型?此外,魔术还能为头寸和交易返回长线类型。

那么,它最初是如何设计的呢?也许,我们应该为MqlTradeRequest 结构 指定魔术是长类型的,因为HistoryDealGetInteger()PositionGetInteger()OrderGetInteger() 等函数不打算返回大于LONG_MAX 的整数值

 
Yedelkin:

long和ulong的8个字节在《参考手册》中是明确的。这些类型与魔法的使用不一致是令人不安的。

一个简单的例子:当发送一个交易请求时,指定request.magic=ULONG_MAX-1是可以接受的。为什么《参考手册》说OrderGetInteger(ORDER_MAGIC )函数只返回长类型?此外,魔术还能为头寸和交易返回长线类型。

那么,它最初是如何设计的呢?也许,我们应该为MqlTradeRequest 结构 指定魔术是长类型的,因为HistoryDealGetInteger()PositionGetInteger()OrderGetInteger() 等函数不打算返回大于LONG_MAX 的整数值

事实上,这个魔力是 类型的(这可以通过形成一个负的魔力和一个 类型值范围之外的魔力来轻松检查 )。

为了检查它,我们可以稍微修改夜间 专家顾问(它不使用标准库的类)。

为了使实验干净,我们应该将 EA_Magic 参数类型改为,并解开历史上最后一个订单的魔术师(如果该订单已成功设置)。


 

Interesting:
В действительности магик имеет тип long (это легко проверяется формированием отрицательного магика и магика со значением выходящим за диапазон значений типа long).

如果是这样,必须在MqlTradeRequest 结构的魔术元素的描述中作出澄清,从类型名称中删除字母 "u"。
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
 
Yedelkin:
如果是这样,有必要通过从类型名称中删除 "u"来澄清MqlTradeRequest 结构中魔法元素的描述。
CTALT 类中也做修改是个好主意(如果开发者不想把魔法值限制在正值)。
 
stringo:

实际上,有整整8个字节的信息,可以用任何方式解释这些信息。它可以是日期时间、双倍数、4个短数、8个字符或64位的逐位数。

对于四字节,4个字节的魔法足以编码任何东西,但现在我们有8个。这将只是一厢情愿的想法。

实际上,它不是64位,而是只有63位(即8个字节不完整)。如果我们使用整个长程,它将是8个字节。

但不幸的是...

一方面,神奇的ulong 被传入MqlTradeRequest 结构。这意味着只能设置正值。

另一方面, PositionGetInteger/OrderGetInteger函数 返回 类型 。这意味着ulong 范围的一半被切断了。

总而言之,我们有63位,而不是上述的64位。实际上,这并不是什么坏事,而是 秩序检查的原则造成了极大的不便

如果使用与MT4相同的系统会更方便--允许魔术师带牌子。由于许多交易系统是基于一个简单的原则,使用的正是魔术师的符号。因为把一个系统分成两个,用通常的MathAbs( OrderMagicNumber( ) ) 函数过滤出你的订单要容易得多。


 
sergeev:

事实上,它不是64位,而是只有63位(即不完整的8个字节)。如果使用整个 范围,则为8字节。

你错了。

64位的使用,由你自己决定如何使用。长/长没有区别,这完全取决于你如何解释这64位。如果你想把long作为有符号的long使用--就用它,如果你想把它作为无符号的ulong使用--没问题。如果你想在这64位中使用其他数据类型,请使用它们。

这正是斯拉瓦所写的内容。

 
sergeev:

事实上,它不是64位,而是只有63位(即不完整的8个字节)。如果使用整个长区,则为8个字节。

但不幸的是...

一方面,神奇的ulong 被传入MqlTradeRequest 结构。这意味着只能设置正值。

另一方面, PositionGetInteger/OrderGetInteger函数 返回 类型 。这意味着ulong 范围的一半被切断了。

事实上,我们所拥有的是63位,而不是上述的64位。实际上,这并不是什么坏事,而是 秩序检查的原则造成了极大的不便

如果使用与MT4相同的系统会更方便--允许使用魔法符号。由于许多交易系统是基于一个简单的原则,使用的正是魔术师的符号。因为把一个系统分成两个,用通常的MathAbs( OrderMagicNumber( ) ) 函数过滤出你的订单要容易得多。

说实话,我很不理解,你们在没什么大不了的事情上做得太过分了。绝对不是。这个问题并不存在,你只是编造了它。将类型转换一直整理到最后。

我希望下面的文章能帮助你。把它复制到一个脚本中,编译它,在终端运行,然后仔细思考。好运。

void OnStart()
  {
    Print("//------ ");

    int i_A = -100;
    uint ui_B = uint(-100);
    
    Print(i_A," ",uint(i_A));
    Print(int(ui_B)," ",ui_B);

    i_A = int(4294967196);
    ui_B = 4294967196;

    Print(i_A," ",uint(i_A));
    Print(int(ui_B)," ",ui_B);
//--
    long l_A = -100;
    ulong ul_B = ulong(-100);
    
    Print(l_A," ",ulong(l_A));
    Print(long(ul_B)," ",ul_B);
   
    l_A = long(18446744073709551516);
    ul_B = 18446744073709551516;
    
    Print(l_A," ",ulong(l_A));
    Print(long(ul_B)," ",ul_B);
  }