创造一个神奇的数字 - 页 3

 
//|                                                      This_EA.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

#define This_EA  101
#define That_EA  102
#define Other_EA 103 // put this list of ea names to each of your ea's header, or...
                     // .. alternatively you can use a number suffix to your ea's file name 
                     // so it can be identified with --> StringSubstr(WindowExpertName(),x,y);
double This_EA_qty;
string magic_prefix;

int init()
  {

   if(GlobalVariableGet(This_EA_qty) >= 0.0){
            GlobalVariableSet("This_EA_qty", This_EA_qty + 1);
   }
   magic_prefix = StringConcatenate(This_EA, DoubleToStr(This_EA_qty,0));

   return(0);
  }

int deinit()
  {

      GlobalVariableSet("This_EA_qty", This_EA_qty - 1);
   
   return(0);
  }

int start()
  {
      double lots, SL, TP; int slip, time_stamp ;
      bool BuyCondition;
   
      if( BuyCondition == true )
      {
         time_stamp  = TimeCurrent(); 
         string magic_name = StringConcatenate(magic_prefix, time_stamp );
         int magic = StrToInteger(magic_name);
         
                                      // Integers range from -2147483648 to 2147483647
                                      // the resulting magic integer would most probably exceed that 
                                      // so we cut the number returned with TimeCurrent() short with 
                                      // MathMod(time_stamp,x) x being years, months not necessary for 
                                      // magic unique-ness. I don't include this calculation, 
                                      // since I'm short in time for testing it...
      
      
         OrderSend(Symbol(),0, lots, Ask, slip, SL, TP, NULL, magic, 0, CLR_NONE);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
比我想象的要长一点 ...
edit : GVget condition != -1.0 to >= 0.0; edit
 
cameofx:
[...]比我想象的要长一点...

这越来越成为我已经提到的前一个话题的翻版(对双关语表示歉意):https://www.mql5.com/en/forum/120034。 任何涉及全局变量的事情都会引起备份和灾难恢复的问题。如果交易必须匆忙转移到一个新的服务器上,那么要么需要有gvariables.dat的最新备份,要么用户需要有能力手动重新创建全局变量。

我没有仔细研究你的代码,但我也不确定如果有多个EA副本,然后MT4被重新启动会发生什么。看起来,代码可能认为EA将按照最初手动加载的顺序自动重新加载。换句话说,EA的多个副本在重启时可能会得到不同的This_EA_qty值,然后我就不知道它们如何在MT4列表中正确识别其历史订单。但我可能是错的。

 
cameofx:
比我想象的要长一点 ...
编辑:GVget条件 !=-1.0 到 >= 0.0
// TimeCurrent() in seconds since 1970 would most probably exceed that 

TimeCurrent()返回一个32位的整数。datatime类型是int类型的一个别名,int也是一个32位的整数。


在你的代码中,我不明白的另一件事是,为什么你为每笔交易使用不同的MN?这与MN的作用恰恰相反。MN的概念是,你可以通过简单地查看MN来识别某个EA的所有交易。MN的随机部分的原因是什么?你的EA中的代码如何才能关闭该EA的所有开仓交易或跟踪该EA的所有止损?
 
如果我没有理解错的话,你对2个不同的专家意外地拥有相同的ID的解决方案是把所有专家的ID放在每个专家的标题中。这就有点麻烦了......。即使你把这部分放在一个包含文件中,那么你仍然需要为你制作的每个新专家重新编译所有专家。

持久性的问题仍然存在。我不知道在终端重新启动或切换到一个完全不同的终端后,这将如何正常工作......
 
jjc:

这越来越成为我已经提到的前一个话题的翻版(对双关语表示歉意):https://www.mql5.com/en/forum/120034。 任何涉及全局变量的问题都会引起备份和灾难恢复的问题。如果交易必须匆忙转移到一个新的服务器上,那么要么需要有gvariables.dat的最新备份,要么用户需要有能力手动重新创建全局变量。

我没有仔细研究你的代码,但我也不确定如果有多个EA副本,然后MT4被重新启动会发生什么。看起来,代码可能认为EA将按照最初手动加载的顺序自动重新加载。换句话说,EA的多个副本在重启时可能会得到不同的This_EA_qty值,然后我就不知道它们如何在MT4列表中正确识别其历史订单。但我可能是错的。

这些都是我期待的反馈......谢谢Gordon、7bit和Jjc。

你的回答需要深思熟虑......但要快速回答。

- 如果This_EA专家已经在其他图表上附加了一次,那么magic_number的值将是:101-1-time_stamp(为清楚起见,用破折号表示)。

- 包含的信息将是101 - 专家ID; 1 - This_EA此刻操作的数量; time_stamp - OrderSend的时间

- 然后我们可以用StringSubStr扫描它,并知道一个特定的订单是由This_EA打开的,同时有1个其他的This_EA连接。

 
7bit:

TimeCurrent()返回一个32位整数。数据时间类型是int类型的一个别名,int也是一个32位的整数。


在你的代码中,我不明白的另一件事是,为什么你为每笔交易使用不同的MN?这与MN的作用正好相反。MN的概念是,你可以通过简单地查看MN来识别某个EA的所有交易。MN的随机部分的原因是什么?你的EA中的代码如何才能关闭该EA的所有开仓交易或跟踪该EA的所有止损?

对不起,我的意思是产生的int magic_name 会超过这个分配。我将相应地移动代码中的注释。

为了使我们的看法一致。我建议对这个 "自动 "magic_number有这样的要求。MN将有以下内容。

- 你可以识别什么EA - 这个特定的订单与所述MN - 是开放的。

- 含有这种技术的EA--如果附属于许多(超过1个),如果这些EA在1秒之外同时开单,将不会产生相同的魔法号码

- 因此,在处理订单时不会发生冲突,但同时MN的来源仍然可以被追踪到。

- 如果我的清单不完整,请补充...

 
cameofx:
- 包含的信息将是101 - 专家ID; 1 - This_EA此刻操作的数量; time_stamp - OrderSend的时间

- 然后我们可以用StringSubStr扫描它,知道某个订单是由This_EA开的,同时还有1个其他的This_EA附加。

但MN中的时间部分是做什么用的?为什么不单独使用EA号码而不使用substr?使用substr需要将整数转换成字符串,然后进行一些字符串操作和字符串比较,MN中的时间部分被扔掉了,因为它根本不需要。使用整数的字符串操作通常看起来很业余,因为在大多数情况下,如果将信息编码在32位字的不同位上,并使用位操作来操作或检查它们,会快得多,也更优雅。

为什么不直接使用一个(EA-实例唯一的)int值来表示mn,并使用简单的整数比较来比较整个数字或它的某些位呢?

例如,让前28位为ID,后4位为0...15的数字,以识别不同类型的交易(例如,如果它能开出3种不同类型的订单: 初始、level1、level2和对冲)。

ID = hash & 0xFFFFFFF0  // this has the 4 low bits always zero


// generate the mn for level 1 trades
MN = (ID + 1);
OrderSend(..., MN, "level 1");


// generate the mn for hedge trades
MN = (ID + 15);
OrderSend(..., MN, "hedge the whole mess");


// this strategy may not make any sense, only to illustrate the code:
// close the hedge trades and trail the stops of all levels
for(...){
   if (OrderMagicNumber() & 0xFFFFFFF0 == ID){  // this trade belongs to us
      if (OrderMagicNumber() & 0x0000000F == 15){ // this is a hedge trade
         OrderClose(...)
      }else{ // this is one of the other levels
         Trail(OrderTicket());
      }
   }
}

// or even easier:
MN = (ID + 15); // all our hedge trades have this MN
for(...){
   if (OrderMagicNumber() == MN){
      OrderClose(...)
   }
}
 
gordon:
如果我没有理解错的话,你对2个不同的专家意外地拥有相同的ID的解决方案是把所有专家的ID放在每个专家的标题中。这是个很麻烦的问题...即使你把这部分放在一个包含文件中,那么你仍然需要为你制作的每个新专家重新编译所有专家。

持久性的问题仍然存在。我不知道在终端重新启动或切换到一个完全不同的终端后,这将如何正常工作......

不,你没有 :) 请阅读代码中关于WindowExpertName()的评论。

如果从专家那里调用,它将检索专家/脚本/指标文件名,但不包括".mq4 "或".ex4",你不必把任何包括在内,只要相应地命名你的EA。

PS : 对不起,我给你的答复是垃圾邮件:)

 
7bit:

但MN中的时间部分是用来做什么的?为什么不单独使用EA数字,而不使用substr?使用substr需要将整数转换成字符串,然后进行一些字符串操作和字符串比较,MN中的时间部分被扔掉了,因为它根本不需要。使用整数的字符串操作通常看起来很业余,因为在大多数情况下,如果将信息编码在32位字的不同位上,并使用位操作来操作或检查它们,会快得多,也更优雅。

为什么不直接用一个(EA-instance-unique)int值来表示mn,并使用简单的整数比较来比较整个数字或它的某些位呢?

例如,让前28位为ID,后4位为0...15的数字,以识别不同类型的交易(例如,如果它能开出3种不同类型的订单:初始、level1、level2和对冲)。


嗯...我使用时间部分是因为我认为一个EA所开的每个订单的MN必须是唯一的,与同一EA在不同图表上在同一时间开的其他订单相比。

前提是:如果一个EA同时开了两个(更多)具有相同魔法号码的订单,它们不能有相同的MN,否则会在订单处理和或冲突中出现。

订单识别......也许我错误地将其与抓取OrderTicket(或不抓取)混淆了。

- 将策略纳入MN自然是下一步。

- 我发现你的技术比我高明很多:))。我还没有优化操作的能力,这就是我发这个帖子的原因。现在我知道,用位操作检查 会更快。

谢谢你。我以后可能需要向你请教如何解释:)))

 
cameofx:

hmm...我使用了时间部分,因为我认为EA开出的每个订单的MN必须是唯一的,与其他订单相比也是如此。

不,它们可以是你想要的任何东西。就像评论一样。把它们看作是某种数字评论。所有用普通MT4用户界面打开的手动交易都会有一个神奇的数字0,所以你可以在所有订单上进行循环,关闭/删除所有手动交易和订单,而不触动所有EA交易。

我的所有EA都创建了自己的号码,对(EA名称+符号+时间框架)来说是独一无二的,这就是为什么我花了这么多精力去寻找一个好的、简单的哈希函数 来创建这个号码。这个哈希函数甚至好到我可以很容易地切断这个哈希函数的最后几位,以便为子号码腾出空间(如果我需要的话,但我很少需要),而且它仍然很安全,不会发生碰撞。

但我的大多数EA都直接使用哈希值,没有子编号,因为它们只有一种类型的交易,并对所有的交易进行相同的处理。

为了唯一地识别某个订单,总是有一个票号。