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

 
7bit:

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

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

谢谢你的澄清和分享你的观点。 总之,我学到了很多。

 
7bit:
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = MathPow(2, count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}

我不需要MathPow(),为什么没有人看到这个?
/**
* Rotate a 32 bit integer value bit-wise 
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/
int bitRotate(int value, int count){
   int i, tmp, mask;
   mask = (0x00000001 << count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}
现在更新第一篇帖子。
 
7bit:
我不需要MathPow(),为什么没有人看到这一点?

我想到了三个主要原因。

  • 任何已经在使用散列函数 的人都不可能用你的代码取代它,因此不会关心你的代码细节。
  • 任何目前没有使用散列函数,但认为它可能是一个好主意的人,可能只是相信你的代码,只关心它是否工作,而不关心它有多优雅或优化。
  • 你用位操作代替MathPow(),每次调用makeMagicNumber()时节省的时间大大低于一毫秒。你的意思是,在EA的生命周期中,makeMagicNumber()只被调用一次,在init()中。因此,你的改变在每一个EA生命周期中节省了不到一毫秒的时间。这是一个完全微不足道的改变(而且可以说是降低了代码的清晰度)。
 
jjc: 可以说是降低了代码的清晰度

我不会说它降低了清晰度。 我的主要意图是清晰、优雅和准确,而不是性能。

我也可以使用幂、乘、除(和模)来做实际的位移,而不使用任何位运算符。但为了优雅(也为了清晰),我应该只用一种或另一种来做,但不能混合使用。因为这个函数的含义是移位,如果我用乘法来移位,只会使代码变得混乱。

另外,虽然加法和乘法可以用整数完成,但MathPow()函数 在内部使用了对数,闻起来像近似值,而且与我需要的东西相比复杂得令人难以置信,它使用并返回一个双倍的值,而这与一个只应该移动n位的整数函数没有关系。

也许我应该问一个问题,为什么 没有看到这一点。我为什么一开始就使用MathPow()呢?我不知道它。我最后一次做汇编是在15年前,今天我已经习惯于用更高的抽象概念来思考问题。也许这就是原因。在我大脑的某个地方,与第n位是2^n有很强的联系,我只是把这个写下来,没有考虑一秒钟。一个汇编程序员绝不会这样做。左移就是乘以2,乘以2就是左移。

 
嘿,伙计们,我只是好奇,为什么你需要一个以上的专家运行相同的tf,以及相同设置的符号?

我的持久性解决方案是使用int的32位来保存我使用的tf(10个),专家版本或开单的交易方法(我有4个)。如果我需要的话,还有很多位可以使用。我使用位操作和一些转换函数 来处理这个问题。我知道其他人也是这样做或类似的,但由于这似乎不足以满足你的情况,我仍在努力想办法解决我问的问题。
 
7bit:

在你的例子中,符号()如何成为MN的一部分?你有一个EA号码和一个时间框架号码,但是符号呢?

它不会,但我使用的资金管理是以MN为基础的。所以在这种情况下,我需要它们都是一样的,这样MM才会把所有的开仓交易都考虑在内。我总是把包括版本在内的EA和我使用的优先级设置放在交易评论栏里,这样我就知道我正在开发的EA使用的是哪个版本和时间框架,并记录在MQL4策略测试器里,可以用交易#、货币对或评论栏进行排序。 当我查看日志时,它会告诉我交易是哪种货币的。 当我把它们转移到Excel进行分析时,我可以按我想要的任何字段进行排序。
我可以看到你的方法的优点,并可能在未来的某个时候利用它。 但是,作为一个NuB,我正在利用MQL4.Com中的代码基础的MM。因此,在我的编程学习曲线中,MM不是我的重点。 如果我可以找到一个更好的方法,我就会加入,直到MM成为我的首要任务,我不反对使用它。我们NuBs需要所有我们能得到的帮助!
关于名称和/或版本号,MN只允许数字,不允许字母。
我没有浏览你的代码,但我假设你的算法是将名字转换成MN的一部分,在这种情况下,它不会立即告诉你你正在处理哪种货币对。
 
FourX:
你的算法是将名称转换为你的MN的一部分,在这种情况下,它不会立即告诉你你正在处理哪个货币对。

它将可靠地把任何字符串转换为一个唯一的整数。这种转换是单向的,但我永远都不需要把它转换回来。

我所需要知道的是,这些具有相同编号的交易是属于一起的。 这只是一个ID号码,只需在循环中使用一个if(),就可以轻松找到这个特定的EA/符号/TF组合的所有交易。唯一需要知道的是,这个数字对每个EA/符号/时间框架组合都是唯一的,而且它是确定的,如果我的电脑决定崩溃,它也不会改变。

所有在逻辑上属于一起的交易都会有相同的MN。如果我以后需要知道这些交易是在哪个符号上进行的(例如在月末做一些统计),我可以简单地对这些订单使用OrderSymbol()。

 
circlesquares wrote>>
嘿,伙计们,我只是好奇,为什么你需要一个以上的专家运行相同的tf,以及相同设置的符号?

我的持久性解决方案是使用int的32位来保存我使用的tf(10个),专家版本或开单的交易方法(我有4个)。如果我需要的话,还有很多位可以使用。我使用位操作和一些转换函数来处理这个问题。我知道其他人也是这样做或类似的,但由于这似乎不足以满足你的情况,我仍在努力想办法解决我问的问题。


我不能代表其他人,但我有一个EA,它可能需要一段时间来关闭一个订单,它错过了新的进入点,因为它仍然没有从以前的订单中关闭。 我希望它能独立处理每个进场点,并根据每个交易的规则(移动滑点,当第一次达到目标时关闭一半,等等)跟踪每个交易。
 
joetrader:


我不能代表其他人,但我有一个EA,它可能需要一段时间来关闭一个订单,它错过了新的进入点,因为它仍然没有从以前的订单中关闭。 我希望它能独立处理每个进场点,并根据每个交易的规则(移动sl,在第一次达到tp时关闭一半,等等)来跟踪每个交易。

我明白了。所以它被捆绑起来,等待服务器的响应,同时你可以打开其他订单?

但是,交易背景繁忙时不是会停止任何与订单有关的行动吗?

我想只要它能工作,这就是所有真正重要的。

 

与其说是服务器响应,不如说是订单打开。因此,EA可能得到一个买入信号 并买入,然后保持开放。几个小时后,另一个买入信号出现,但由于已经有一个开放的头寸,它没有买入,因为它在等待关闭第一个订单。但没有理由认为第一个买入信号会比第二个更有利可图,也没有理由认为等待第一个信号关闭后再让EA开出更多订单会有什么好处。 但我仍在努力,所以对我来说,这仍然是理论。)