文章 "在单一工具上使用不同的 EA 交易程序进行交易时 ORDER_MAGIC 的使用"

 

新文章 在单一工具上使用不同的 EA 交易程序进行交易时 ORDER_MAGIC 的使用已发布:

本文考虑有关使用不同 EA 交易程序的自动交易的魔法标识以及分隔、组合与同步进行信息编码的问题。初学者和经验更多的交易者会对本文感兴趣,因为它解决虚拟仓位的问题,这在实施由 EA 交易程序的同步和各种策略组成的复杂系统时非常有用。

图 1. 一个 EA 交易程序在一个工具上的工作

作者:Nikolay Demko

 

我不知道是谁或如何做到的,我更喜欢在创建自己的枚举时明确指定 ID 编号(尽管这并非必要)。

例如像这样:

enum Emagic
{
ENUM_DIGITAL_NAME      = 0, // 顾问的数字名称
ENUM_CODE_INTERACTION  = 1, // 交互代码
ENUM_EXPERT_SYMBOL     = 2  // 启动 EA 的符号
};

这也有助于从 MQL4 迁移,例如,这是我用来处理订单的枚举。

//enum_mt4_order_type
enum ENUM_MT4_ORDER_TYPE
//贸易业务类型
{
OP_BUY  = 0, //购买 
OP_SELL = 1, //销售 
OP_BUYLIMIT  = 2, // 限价买入挂单 
OP_SELLLIMIT = 3, //挂单限价 
OP_BUYSTOP   = 4, //等待买入止损指令 
OP_SELLSTOP  = 5  //Pending SELL STOP 命令 
};

这种方法很方便,因为无论标识符在枚举中的位置如何,其代码(数值不会改变)....。

此外,如果枚举包含负值标识符,这种方法也很方便


PS

非常有趣的文章,感谢作者...

 
Interesting:

我不知道是谁或如何做到的,我更喜欢在创建自己的枚举时明确指定 ID 编号(尽管这并非必要)。

例如像这样:

这也有助于从 MQL4 迁移,例如,这是我用来处理订单的枚举。

这种方法很方便,因为无论标识符在枚举中的位置如何,其代码(数值不会改变)....。

此外,如果枚举包含负值标识符,这种方法也很方便


PS

非常有趣的文章,感谢作者...


对我来说这并不重要,因为在声明枚举时,值会自动按顺序分配、

不过我同意你的变体更清晰(尤其是当枚举很长,比如超过 3-4 个的时候)。

 

对魔术师采用这种方法,就有必要为用户编写相同的指令--这样用户就能清楚地知道哪些魔术师会被占用,哪些是空闲的。Expert Advisor 用户使用的 Expert Advisor 并非仅来自一家开发商,而且这种方法不太可能被纳入所有 Expert Advisor 作者都使用的标准中。如果终端开发人员能把这个 "ulong "变量分成几个变量,这样就会有几个变量,例如四个两个字节的变量。

request.magic
request.id1
request.id2
request.id3

或者至少在终端中加入一个库,这样就能以某种方式将其纳入标准。

SetMagic(Magic,Id1,Id2,Id3) 
 
Integer:

对魔术师采用这种方法,就有必要为用户编写相同的指令--这样用户就能清楚地知道哪些魔术师会被占用,哪些是空闲的。Expert Advisor 用户使用的 Expert Advisor 并非仅来自一家开发商,而且这种方法不太可能被纳入所有 Expert Advisor 作者都使用的标准中。如果终端开发人员能把这个 "ulong "变量分成几个变量,这样就会有几个变量,例如四个两个字节的变量。

或者至少在终端中加入一个库,这样就能以某种方式将其纳入标准。

为用户编写 MAGIK 工作指南并非完全必要,即使这样做也不会超出对 MAGIK 如何组建的描述....。

我认为这是目前贸易自动化方面最好的文章之一。 我还想多说几句--我本人也支持在比 777777 或 555555 更严肃的层面上对 MAGIC 进行编码,甚至也许我更愿意在这里提供比作者所做的更详细的信息。

但我并没有意识到要使用结构(因为从 MQL4 开始就已经有了编码的想法),尽管我可能已经到了使用结构的边缘....。

我也不认为有必要在 MAGIC 中 "写入 "任何有关进行交易操作 的符号的信息(这是因为这些信息已经存储在其他地方,从下单开始直到完全平仓都不会改变)。此外,我认为将 MAGIC 的最后三位数字(如果不使用安全代码)分配给专家的 MARKER(或 MARKER,我不想说基因工程是如何进行的)就足够了。

这是因为在第一位数字中可以编码 9-10 个基本的专家类别,而在剩下的两位数字中,从用户或开发者的角度来看,是唯一的编号。因此,通常可以得到 900 到 1000 个组合。

我也更喜欢 Expert Advisor 至少能识别交易者设置的订单并进行相应编码的算法。

PS

我认为不必担心多个智能交易系统会混淆编码的 MAGIC,至少我认为采用某种方法并不像乍看起来那么危险(而且很可能)。特别是,如果所有这些专家(即使来自不同的作者)都支持这种加密 MAGIC 的方法,并考虑到彼此的行动,那么这就变得无关紧要了。理想的情况是,只有一位专家对这个或那个对.....。

 

文章举了一个使用编码的例子,并没有使用所有的位数,编码显然是多余的、

如果有必要,甚至可以压缩这 9 个被占用的位。

除了识别魔术师(其剩余的 9 位),还可以在下订单时传输余额的状态。

由于余额不太可能超过 6 位,因此仍有空间进行编码。

 
Urain:

文章举了一个使用编码的例子,并没有使用所有的位数,编码显然是多余的、

如果有必要,甚至可以压缩这 9 个被占用的位。

除了识别魔术师(其剩余的 9 个比特)外,还可以传输下订单时的余额状态。

由于余额不太可能超过 6 位,因此仍有空间进行任何编码。

除此以外,您还应加上 1000 或 10000,并在解码前将其减去,这样就能保证有一定范围的魔法不被您的方法占用。

 
Integer:

所有这些都应加上 1000 或 10000,并在解码前减去,这样就能保证您的魔法方法不占用一定的范围。

好了,如何做到这一点无痛描述的文章(只需要一点点的工作,以扩大加密的范围)、

我认为没有任何问题。

PS 唯一薄的地方是不要忘记将余额转换为整数,否则逗号会产生故障,如何做应该在绑定时就能看到,如果账户分,则乘以 100,如果不需要这样的精度,则转换为 int 并进行修剪。

 
Urain:

文章中介绍了如何轻松实现加密(只需稍作调整,扩大加密范围)、

我看不出有什么问题。

PS 唯一薄弱的地方是不要忘记将余额转换为整数,否则逗号会造成故障,如何做应该看绑定,如果账户是美分,则乘以 100,如果不需要这样的精度,则转换为带有剪切的 int。

如果没有问题,请给出简短明确的指示,说明如何保证系统编码的魔法与未编码的魔法互不干扰。

 
Integer:

如果这不是问题,请给出简短而明确的指示,说明如何保证由您的系统编码的魔法与未编码的魔法互不干扰。

为了使我的回答不像是在找借口,我马上就会说,这个问题没有考虑过,但它是允许的。

下面是 ulong 18 的最大值 446 744 073 709 551 615,其中 17*10^18 拥有所有空闲字段。Стоит добавить при кодировании 17 000 000 000 000 000 и поставить при декодировании проверку содержит ли 20 и 19 разряд числа 1 и 7 и вы гарантированно определите кодированный ли магик или нет.

//+------------------------------------------------------------------+
//| 函数返回由输入数据组装的预制魔法阵。
//+------------------------------------------------------------------+
ulong Cmagic::SetMagic_request(int digital_name=0,int code_interaction=0)
  {
   if(digital_name>=1000)Print("顾问的数字名称设置有误(大于 1000)");
   if(code_interaction>=1000)Print("不正确的外星生物识别代码集(大于 1000)"。);
   mag.digital_name     =digital_name;
   mag.code_interaction =code_interaction;
   mag.expert_symbol    =symbolexpert();
   mag.magicnumber      =17000000000000000000+// вот эта вставка даст 20 разрядов магику
                         mag.digital_name*(int)pow(1000,2)+
                         mag.code_interaction*(int)pow(1000,1)+
                         mag.expert_symbol;
   return(mag.magicnumber);
  }

在解码器中。

//+------------------------------------------------------------------+
//| 该函数将魔力分为三部分,每部分三位数。
//|| 并返回类别所指向的部分。
//+------------------------------------------------------------------+
int Cmagic::decodeMagic_result(int category)
  {
   string string_value=(string)mag.magicnumber;
   int rem=(int)MathMod(StringLen(string_value),3);
   if(rem!=0)
     {
      rem=3-rem;
      string srem="0";
      if(rem==2)srem="00";
      string_value=srem+string_value;
     }
   int start_pos=StringLen(string_value)-3*category;
   string value=StringSubstr(string_value,start_pos,3);
   if(StringLen(string_value)!=20)return((int)StringToInteger("0"));//если магика не 20 разрядов значит не кодированный
   return((int)StringToInteger(value));
  }

就是这样,别忘了迪米特里,想做的人在寻找机会,不想做的人在寻找理由,我在你的能力范围内打开了一扇窗,让你从中找到一扇窗,甚至一扇门。

顺便说一句,我使用这种

(int)pow(1000,2)

位移,但没有人禁止通过字符串重写它,只是在文章中我想展示这两种方法,并尽可能有机地结合起来(所以编码通过 int 进行,解码通过字符串)。

总之,我想展示各种可能性,而不是给出一个黑盒子转换器(给人一把铲子总比给人一桶粥好)。

PS 在这里说一件事编码另一件事,(我有一个雷暴,使网络定期敲了)编码检查不是 1 和 7 在 20 和 19 位数和这些非常数字的存在那些如果魔术 20 位数手段使用编码,但你明白检查可以重放。

 

1.Thanks to the author for the article.
2..表达式 (int) 是什么意思,在 int 中取什么值 DIGITS=(int)-log10(SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP));if(DIGITS<0)DIGITS=0;
3.
4.交互代码是如何工作的?
当 EA 在同一工具上运行时,只需设置相同或不同的 EA 数字名称,交互代码是否重要。