int iMakeExpertId (string sSymbol="",int iPeriod=EMPTY){return( iMakeHash(_Symbol( sSymbol), getPeriodStr(_Period( iPeriod)),WindowExpertName()));}//iMakeExpertId()////////+------------------------------------------------------------------+//int iMakeHash (string s1,string s2= EMPTYSTRING,string s3= EMPTYSTRING,string s4= EMPTYSTRING,string s5= EMPTYSTRING
,string s6= EMPTYSTRING,string s7= EMPTYSTRING,string s8= EMPTYSTRING,string s9= EMPTYSTRING,string s10= EMPTYSTRING){/*
Produce 32bit int hash code from a string composed of up to TEN concatenated input strings.
WebRef: http://www.cse.yorku.ca/~oz/hash.html
KeyWrd: "djb2"
FirstParaOnPage:
" Hash Functions
A comprehensive collection of hash functions, a hash visualiser and some test results [see Mckenzie
et al. Selecting a Hashing Algorithm, SP&E 20(2):209-224, Feb 1990] will be available someday. If
you just want to have a good hash function, and cannot wait, djb2 is one of the best string hash
functions i know. it has excellent distribution and speed on many different sets of keys and table
sizes. you are not likely to do better with one of the "well known" functions such as PJW, K&R[1],
etc. Also see tpop pp. 126 for graphing hash functions.
"
NOTES:
0. WARNING - mql4 strings maxlen=255 so... unless code changed to deal with up to 10 string parameters
the total length of contactenated string must be <=255
1. C source uses "unsigned [char|long]", not in MQL4 syntax
2. When you hash a value, you cannot 'unhash' it. Hashing is a one-way process.
Using traditional symetric encryption techniques (such as Triple-DES) provide the reversible encryption behaviour you require.
Ref:http://forums.asp.net/t/886426.aspx subj:Unhash password when using NT Security poster:Participant
//
Downside?
original code uses UNSIGNED - MQL4 not support this, presume could use type double and then cast back to type int.
*/string s =StringConcatenate( s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);int iHash =5381;int iLast =StringLen( s)-1;int iPos=0;while( iPos <= iLast )//while (c = *str++) [ consume str bytes until EOS hit {myWord! isn't C concise! Pity MQL4 is"!"} ]{//original C code: hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
iHash =(( iHash <<5)+ iHash)+StringGetChar( s, iPos);//StringGetChar() returns int
iPos++;}return(MathAbs( iHash));}//iMakeHash()
NOTES:
0. WARNING - mql4 strings maxlen=255 so... unless code changed to deal with up to 10 string parameters
the total length of contactenated string must be <=255
让我想到,记录(非常简明的)会很有用。
1.决定实施神奇数字的标准
2.决定使用自动生成魔法数字的标准
3.决定实施持久层的标准
4.决定在持久化中使用球状物与文件访问的标准
简短的,完全是个人的回答...
(2)取决于许多因素,包括用户是否希望能够控制这些神奇的数字,以便他们能够使用它们作为将不同策略的结果分组的方法。
(3)如果可以,我会避免,但我几乎无法避免(见"外部变量和时间框架变化?) 如果MT4能帮助持久化和恢复EA的状态,那就更好了。但它并没有。
(4)导致了一个相当强烈的个人偏好。我不喜欢globals。用户可以删除它们;存储仅限于数字;而且gvariables.dat的格式很模糊。我更喜欢这样的文件,如果有必要,作为最后的手段,可以用文本编辑器进行修改。
- 在我休息一段时间之前,我只剩下8个帖子了。
我看到你已经达到了神奇的数字。至少你所在的地方会很温暖......
我一直在断断续续地研究这个想法,我终于让它达到了我想要的效果。这是一个神奇的数字生成器,它采用符号的ASCII码,并将其添加到时间框架和自定义代码中,生成一个对时间框架、符号和EA来说独一无二的神奇数字。如果我知道有办法让EA读取自己的名字,我会使用ASCII码,而不是自定义代码。虽然有这个弱点,但我认为它符合上述标准--它在系统崩溃时也能正常运行,因为它会在系统重新启动时选择与之前相同的数字。我看到的弱点是,如果在同一时间框架和符号上交易同一EA的多个实例,它将挑选重复的神奇数字。
以下是我的情况。
string GetSymbol=Symbol();
int MNSymbol,MNSymbolCalc,MagicNumber;
for(int a=0;a<6;a++)//将Symbol()转为ASCII字符串,并将每个字符加入MNSymbol
{
MNSymbolCalc=StringGetChar(GetSymbol, a) 。
MNSymbolCalc=((MNSymbolCalc-64)*(MathPow(10,(a))));//减去64,因为ASCII字符从65开始,为了整齐起见,将结果乘以a次幂(虽然没有必要)
MNSymbol = MNSymbol+MNSymbolCalc;
}
int MNPeriod=Period();
int MNEACode=100000;//使这个数字对每个EA都不同,以防止两个不同类型的EA选择相同的魔术号码
MagicNumber=MNSymbol+MNPeriod+MNEACode;
JT,是的......重复的 "问题 "是恶梦的东西;)
像你和我猜想的许多人一样,唯一性 问题是一个不断重复出现的主题,何时被攻击,何时被攻击,但不知何故,似乎从来没有正确的!
我在本线程中早先发表的代码已被替换为以下内容,可能会有帮助(如果没有其他原因,只是为了博得一笑:)。
***注意到通过调用内建程序可获得的EA名称字符串。
在努力使多ccy,per有本地函数 使用。即,厌倦了总是编码相同的函数头代码来检查空的实际:ccy,per
因此我使用了_Symbol()和_Period()。速度/大小的考虑,即使在MT4解释器上也不值得花精力去关注......
无论如何,也许这能给人以思考...
我这样做的理由是[和函数中的文档]。
这是一个方便的方法,以确保如果一个EA停止在CCY,PER上,那么在以后对同一CCY,PER重新运行时
它将产生相同的giExpertId(又称魔法#)。这意味着它可以继续管理池中未完成的交易...。
另一个被命名的EA可以在相同的图表环境下运行,而不用担心重复的价值。
因此,订单池将拥有具有EA特定magic#的票据,只允许每个EA对其票据进行映射。
你关于在同一图表上有1个 "同名 "EA的评论,确实是个问题。我最终决定,嘿!认真点......如果我犯了这个错误,那么我就该为我的不思进取而被踢到后面去,笑。
最后,正如这个主题所显示的,有无数的想法/方法,每一个都有其优势和劣势。
这一切都归结为在EA运行时获得[至少]一个独特的数据,[对我来说]这就是核心问题。
我从来没有考虑过EA/CT崩溃导致重新启动的问题,也没有考虑过重新开始的问题。现在已经解决了这个问题,只要EA自动生成它的EAid/magic#,而这些数据对它的R/T图表环境是独一无二的。它将永远是相同的数字......
哦,好吧,祝你玩得开心!
NOTES: 0. WARNING - mql4 strings maxlen=255 so... unless code changed to deal with up to 10 string parameters the total length of contactenated string must be <=255
虽然我个人更喜欢手动设置魔法数字,但你的解决方案相当优雅。不错的代码。
有一点更正 - 字符串常数 的最大长度是255,字符串变量 可以大得多,见 ->https://www.mql5.com/en/forum/123551 。
谢谢Gordon,这段代码看起来 还行,但最终肯定不是防弹的,如果我在相同的图表环境中运行相同的EA--所以是的......手动设置magic#是最终的万无一失的方法--毫无疑问!
对我来说,字符串一直是个麻烦事。然而,通过逐步建立一套工具,每个工具都利用较低级别的工具的功能,大多数事情都是可能的。
此外,我记得irusoh1 说过/提醒过一个人,"这就是它",所以要接受它。对我来说,我一直记得他的帖子 内容中的第一段话,每当我在使用MT的时候,我的脑海中总是浮现出宽松的生活方式:))
MQL4在线/离线谈到了基本数据类型。两者中的字符串链接都指向字符串常量,我们都知道那个文档页面说的是什么...即255bytes。
我完全理解你所说的,但29373线程和MQL4运行时对字符串的处理一样,没有结论,正如jjc和毫无疑问的许多其他人所经历的那样--有些不确定。
无法找到任何支持充分利用8字节结构格式的文档,如果有支持较长字符串的文档,那将会很有趣。
总之,我过去在使用字符串时遇到过无法解决的问题,所以我更愿意坚持文档中所说的,并在需要时绕过它。
MQL4在线/离线谈到了基本数据类型。两者中的字符串链接都指向字符串常量,我们都知道该文档页面说的是什么...即255bytes。
我完全理解你所说的,但29373线程和MQL4运行时对字符串的处理一样,没有结论,正如jjc和毫无疑问的许多其他人所经历的那样--有点不确定。
无法找到任何支持充分利用8字节结构格式的文档,如果有支持较长字符串的文档,那将会很有趣。
无论如何,我过去在使用字符串时遇到过无法解决的问题,所以我更愿意坚持文档中所说的,并在需要时绕过它。
坚持最大的255显然是安全的解决方案,尽管我有相当多的代码忽略了这个限制,我从来没有遇到过任何问题。但是,这些代码大多是非关键性的。
我知道文档中关于这个问题有点不清楚,但如果你尝试浏览俄罗斯论坛(用谷歌翻译),我记得我读到过一个版主的官方评论,即字符串变量确实支持超过255bytes,但我现在似乎找不到了......哦,我想 "这就是它",我们必须接受它:)
我找不到任何支持充分利用8字节结构格式的文档,如果有支持较长字符串的文档,我将会很感兴趣。
不管怎么说,我过去在使用字符串时遇到过无法解决的问题,所以我更倾向于坚持文档中的内容,如果需要的话,可以绕过它。
" 字符串常数的长度在0到255 个字符之间。如果字符串常量的长度较长,右边的多余字符将被拒绝,编译器也会相应地发出警告。
它的内部表示是一个8字节 的结构。该结构的第一个元素是一个长整数,包含为该行分配的缓冲区的大小。该结构的第二个元素是包含该行的缓冲区的32阶地址。"
引自MetaEditor字典中的数据类型--字符串常量
迷人的东西,伙计们...
我知道这个话题很老,但我看到每个人都有自己的方法来获得一个 "神奇的数字 "或任何你想要的称呼。我还看到有人想让他们的EA能够读出自己的名字......这是我用来获得我的EA的名字的方法
把这个放在EA的顶部。
#define EAName "把EA名称放在这里"
当你检查 未平仓订单时,放置这个。
if (OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderComment() == EAName && OrderMagicNumber() == MagicNumber)
当你的交易被放置时,确保你有它,所以它放置EAName的评论,像这样。
Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, EAName, MagicNumber, 0, Blue) 。
然后,如果你想要一个神奇的数字,如果你想在同一时间对同一对但不同的TFs运行EA,..........,只需使用这个。
int MagicNumber = Period();