mql5中的OOP、模板和宏,细微之处和用途 - 页 27 1...202122232425262728 新评论 Seric29 2020.03.23 18:47 #261 Vladimir Simakov: 一个指向对象的指针。 无意冒犯,但对你来说,这样的宏伟目标还为时过早,你会被困住的。首先,你必须理解我为什么这样做。 以及如何处理这个指向类内对象的指针,在哪里传递它。 至于宏,它们更容易操作。 Vladimir Simakov 2020.03.24 07:15 #262 Seric29: 以及如何处理这个指向类内对象的指针,将其传递到哪里。 至于宏,它们更容易操作。 你可以用它来引用一个在任何地方创建的对象。在我的例子中,全局创建的对象的指针被传递给构造函数,但这个类本身可以嵌套在另一个类中(在其中创建对象)。 下面是一个使用你的宏的例子。 #define foor1(a,b,v,g) \ for(;Funkziya(a,b,v)&&g;b++) ... foor(a,b,c,isSomething?a>b:b>c){ DoSomething(); } ... 看看它展开成什么样子,为了清楚起见,我加了括号。 for(;( Funkziya(a,b,c)&&isSomething)?a>b:b>c;b++){ DoSomething(); } 结果是,你得到了对编译器来说绝对有效的代码,但程序的行为却与原意截然不同。而现在你实际上并没有注意到这个错误,代码是有效的,然后你就会盯着终端机,想知道为什么机器人用整个存款登录,而丢失了你的账户?))))) 我对宏很在行,但这就是原因,也是我不喜欢宏的原因(开发者,再次请Constexpr和SFINAE同时进行)。所以,我给你的建议是,不要用它们来减少你代码中的字母。实际上,即使是在剥离的mql-版本中,它也是一个强大的工具,但需要一个非常规范的方法。 Seric29 2020.03.24 19:12 #263 开发人员,增加在宏和函数中使用无限数量的参数的可能性。 我已经厌倦了这种静态的胡闹。一个宏的8个参数是什么,如果你需要108个什么,那么至少要有10个。而且还能使宏的超载成为可能,这样你就不必用宏来乘以新的名字。如果你能让 #define Znah 0 #define PrmI int Peremen=6; #define PrmD double Peremen=3.345; #if Znah//если больше 0 то появится переменная int Peremen PrmI #else PrmD//иначе появится переменная double Peremen #endif 宏观#if Seric29 2020.03.24 19:13 #264 Vladimir Simakov: 但是,该方案的行为与预期的情况截然不同。而现在,你会注意到这个错误,代码是有效的,然后你会傻傻地在终端看,想知道为什么机器人用整个存款进入,而失去了账户?)))))。 我对宏很在行,但这也是我不太喜欢它们的原因(开发者,我再一次同时要求constexpr和SFINAE)。所以,我给你的建议是,不要用它们来减少你代码中的字母。事实上,即使是在剥离的mql-版本中,它也是一个强大的工具,但需要一个非常规范的方法。 我不会去猜测什么,我在可靠地做我的工作。 CDataManager* m_data; 你在对m_data 指针做什么? 你是在访问元素m_data 吗? 你从它那里得到了什么?我知道这在这里发生。 CNewBar(CDataManager* data=NULL):m_data(!data?new CDataManager:data),cIsDelData(!data){} CNewBar(string symbol,ENUM_TIMEFRAMES frame):m_data(new CDataManager(symbol,frame)),cIsDelData(true){} 只是不清楚(非常复杂)你想达到什么目的? 如果这一行会发生什么 CDataManager* m_data; 将在公开场合书写。 班级对我来说是个谜。两年后,我仍然不知道如何处理它们。 Igor Makanu 2020.08.29 20:06 #265 有必要将测试结果 的统计数据写到数据库表中。 事先创建了数据库,通过在EA设置中加入sinput变量来写入感兴趣的通证。 DB: CREATE TABLE "TesterStatistics" ( "id" INTEGER, "MD5" TEXT, "STAT_PROFIT" REAL, "STAT_GROSS_PROFIT" REAL, "STAT_GROSS_LOSS" REAL, "STAT_MAX_PROFITTRADE" REAL, "STAT_MAX_LOSSTRADE" REAL, "STAT_CONPROFITMAX" REAL, "STAT_CONPROFITMAX_TRADES" INTEGER, "STAT_MAX_CONWINS" REAL, "STAT_MAX_CONPROFIT_TRADES" INTEGER, "STAT_CONLOSSMAX" REAL, "STAT_CONLOSSMAX_TRADES" INTEGER, "STAT_MAX_CONLOSSES" REAL, "STAT_MAX_CONLOSS_TRADES" INTEGER, "STAT_BALANCEMIN" REAL, "STAT_BALANCE_DD" REAL, "STAT_BALANCEDD_PERCENT" REAL, "STAT_BALANCE_DDREL_PERCENT" REAL, "STAT_BALANCE_DD_RELATIVE" REAL, "STAT_EQUITYMIN" REAL, "STAT_EQUITY_DD" REAL, "STAT_EQUITYDD_PERCENT" REAL, "STAT_EQUITY_DDREL_PERCENT" REAL, "STAT_EQUITY_DD_RELATIVE" REAL, "STAT_EXPECTED_PAYOFF" REAL, "STAT_PROFIT_FACTOR" REAL, "STAT_RECOVERY_FACTOR" REAL, "STAT_SHARPE_RATIO" REAL, "STAT_MIN_MARGINLEVEL" REAL, "STAT_CUSTOM_ONTESTER" REAL, "STAT_DEALS" INTEGER, "STAT_TRADES" INTEGER, "STAT_PROFIT_TRADES" INTEGER, "STAT_LOSS_TRADES" INTEGER, "STAT_SHORT_TRADES" INTEGER, "STAT_LONG_TRADES" INTEGER, "STAT_PROFIT_SHORTTRADES" INTEGER, "STAT_PROFIT_LONGTRADES" INTEGER, "STAT_PROFITTRADES_AVGCON" INTEGER, "STAT_LOSSTRADES_AVGCON" INTEGER, PRIMARY KEY("id" AUTOINCREMENT) ) 我用这段代码写到这个表中。 DatabaseExecute(handleDB, StringFormat("INSERT INTO \"TesterStatistics\" " "VALUES (NULL, \'%s\',%G, %G, %G, %G, %G, %G, %d, %G, %d, %G, %d, %G, %d, " "%G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);", md5txt, TesterStatistics(STAT_PROFIT), TesterStatistics(STAT_GROSS_PROFIT), TesterStatistics(STAT_GROSS_LOSS), TesterStatistics(STAT_MAX_PROFITTRADE), TesterStatistics(STAT_MAX_LOSSTRADE), TesterStatistics(STAT_CONPROFITMAX), (int)TesterStatistics(STAT_CONPROFITMAX_TRADES), TesterStatistics(STAT_MAX_CONWINS), (int)TesterStatistics(STAT_MAX_CONPROFIT_TRADES), TesterStatistics(STAT_CONLOSSMAX), (int)TesterStatistics(STAT_CONLOSSMAX_TRADES), TesterStatistics(STAT_MAX_CONLOSSES), (int)TesterStatistics(STAT_MAX_CONLOSS_TRADES), TesterStatistics(STAT_BALANCEMIN), TesterStatistics(STAT_BALANCE_DD), TesterStatistics(STAT_BALANCEDD_PERCENT), TesterStatistics(STAT_BALANCE_DDREL_PERCENT), TesterStatistics(STAT_BALANCE_DD_RELATIVE), TesterStatistics(STAT_EQUITYMIN), TesterStatistics(STAT_EQUITY_DD), TesterStatistics(STAT_EQUITYDD_PERCENT), TesterStatistics(STAT_EQUITY_DDREL_PERCENT), TesterStatistics(STAT_EQUITY_DD_RELATIVE), TesterStatistics(STAT_EXPECTED_PAYOFF), TesterStatistics(STAT_PROFIT_FACTOR), TesterStatistics(STAT_RECOVERY_FACTOR), TesterStatistics(STAT_SHARPE_RATIO), TesterStatistics(STAT_MIN_MARGINLEVEL), TesterStatistics(STAT_CUSTOM_ONTESTER), (int)TesterStatistics(STAT_DEALS), (int)TesterStatistics(STAT_TRADES), (int)TesterStatistics(STAT_PROFIT_TRADES), (int)TesterStatistics(STAT_LOSS_TRADES), (int)TesterStatistics(STAT_SHORT_TRADES), (int)TesterStatistics(STAT_LONG_TRADES), (int)TesterStatistics(STAT_PROFIT_SHORTTRADES), (int)TesterStatistics(STAT_PROFIT_LONGTRADES), (int)TesterStatistics(STAT_PROFITTRADES_AVGCON), (int)TesterStatistics(STAT_LOSSTRADES_AVGCON))); ENUM_STATISTICS 枚举有一个顺序,如帮助中的顺序,脚本要检查。 void OnStart() { for(int i = 0; i <= (int)STAT_LOSSTRADES_AVGCON; i++) printf("%d ^ %s", i, EnumToString(( ENUM_STATISTICS)i)); } 一切正常,但是代码文本相当多,很有可能出现错别字,如何以更可靠的方式将这个查询发送到数据库--主要的问题是如何进入StringFormat。 Alexandr Andreev 2020.08.29 22:19 #266 Igor Makanu:有必要将测试结果 的统计数据写到数据库表中。事先创建了数据库,通过在EA设置中加入sinput变量来写入感兴趣的通证。DATABASE。我用这段代码写到这个表中。ENUM_STATISTICS 枚举有一个顺序,如帮助中的顺序,脚本要检查。一切正常,但是代码文本相当多,很有可能出现错别字,如何以更可靠的方式将这个查询发送到数据库--主要的问题是如何进入StringFormat。 定义!!!(尽管在这里正常的过载也可以) 那么这个StringFormat的意义是什么呢? 它不比正常的add....,速度也不快。(我已经做了几十个千兆字节的文本文件=....)即使是普通的附加组件也更快,这就是它的方式...... 如果你想通过这个常规函数来做,我也不明白这个问题 )) Igor Makanu 2020.08.30 08:08 #267 Alexandr Andreev:那么这个字符串格式的意义何在?它永远不会比正常添加的速度快....。(我已经做了几十个千兆字节的文本文件=....)即使是普通的附加组件也更快,这就是问题所在...... 我不知道。 我阅读了帮助和文章,并使用例子创建了一个数据库查询。 它似乎可以工作,但我怀疑如果我使用这个代码的一部分,我可能会犯一些错误 总而言之,这可能看起来很奇怪,所以我想问如何在不搞砸的情况下使其更加紧凑))))。 Maxim Kuznetsov 2020.08.30 09:18 #268 Igor Makanu:有必要将测试结果 的统计数据写到数据库表中。事先创建了数据库,通过在EA设置中加入sinput变量来写入感兴趣的通证。DB:我用这段代码写到这个表中。ENUM_STATISTICS 枚举有一个顺序,如帮助中的顺序,脚本要检查。所有的工作,但代码的文本是相当庞大的,有一个很高的概率的打字,如何以一个更可靠的方式获得这个查询到数据库 - 主要问题是如何获得StringFormat 请记住,首先,在SQLite中字段类型是可选的,你不必为输入和铸造而烦恼。它被称为 "Lite "是有原因的。 一个长的查询可以分为3-4-5个部分 :-) BEGIN TRANSACTION INSERT INTO myTable VALUES (...); --- тут можно получить PrimaryKey UPDATE myTable .... ; --- обновить по Primary UPDATE myTable ... ; --- ещё... COMMIT ; --- это если все запросы удачны.. иначе ROLLBACK 这是从旧的记忆中得到的,也就是说,你应该在帮助下检查。 OOP, templates and macros SQL 与 MQL5: 与 针对市场分析的数据库的具体应用 Vladimir Simakov 2020.08.30 09:28 #269 Igor Makanu:我不知道。我读了帮助和文章,用例子创建了一个数据库查询。它似乎是有效的,但我怀疑如果我部分使用这段代码,可能会出现错误的打印。我想问的是,如何在不搞砸的情况下使其更加紧凑))))。 你的任务应该是这样解决的。 string MakeRequest(string md5txt){ static ENUM_STATISTICS intIndex[]={STAT_CONPROFITMAX_TRADES, STAT_MAX_CONPROFIT_TRADES, STAT_CONLOSSMAX_TRADES, STAT_MAX_CONLOSS_TRADES, STAT_DEALS, STAT_TRADES, STAT_PROFIT_TRADES, STAT_LOSS_TRADES, STAT_SHORT_TRADES, STAT_LONG_TRADES, STAT_PROFIT_SHORTTRADES, STAT_PROFIT_LONGTRADES, STAT_PROFITTRADES_AVGCON, STAT_LOSSTRADES_AVGCON}; string ret="INSERT INTO \"TesterStatistics\" VALUES (NULL,"+md5txt; for (int i=0,ii=0;i<=STAT_LOSSTRADES_AVGCON;++i){ ret+=","; if (i==intIndex[ii]){ ret+=StringFormat("%d",(int)TesterStatistics((ENUM_STATISTICS)i)); ++ii;} else ret+=StringFormat("%G",TesterStatistics((ENUM_STATISTICS)i));} return ret;} DatabaseExecute(handleDB, MakeRequest("md5txt")); Igor Makanu 2020.08.30 09:37 #270 Vladimir Simakov:你的特殊问题应该这样解决。 糟糕! 对!数组 谢谢你!!!!! 1...202122232425262728 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
一个指向对象的指针。
无意冒犯,但对你来说,这样的宏伟目标还为时过早,你会被困住的。首先,你必须理解我为什么这样做。
以及如何处理这个指向类内对象的指针,在哪里传递它。
至于宏,它们更容易操作。
以及如何处理这个指向类内对象的指针,将其传递到哪里。
至于宏,它们更容易操作。
你可以用它来引用一个在任何地方创建的对象。在我的例子中,全局创建的对象的指针被传递给构造函数,但这个类本身可以嵌套在另一个类中(在其中创建对象)。
下面是一个使用你的宏的例子。
看看它展开成什么样子,为了清楚起见,我加了括号。
结果是,你得到了对编译器来说绝对有效的代码,但程序的行为却与原意截然不同。而现在你实际上并没有注意到这个错误,代码是有效的,然后你就会盯着终端机,想知道为什么机器人用整个存款登录,而丢失了你的账户?)))))
我对宏很在行,但这就是原因,也是我不喜欢宏的原因(开发者,再次请Constexpr和SFINAE同时进行)。所以,我给你的建议是,不要用它们来减少你代码中的字母。实际上,即使是在剥离的mql-版本中,它也是一个强大的工具,但需要一个非常规范的方法。
开发人员,增加在宏和函数中使用无限数量的参数的可能性。 我已经厌倦了这种静态的胡闹。一个宏的8个参数是什么,如果你需要108个什么,那么至少要有10个。而且还能使宏的超载成为可能,这样你就不必用宏来乘以新的名字。如果你能让
宏观#if
但是,该方案的行为与预期的情况截然不同。而现在,你会注意到这个错误,代码是有效的,然后你会傻傻地在终端看,想知道为什么机器人用整个存款进入,而失去了账户?)))))。
我对宏很在行,但这也是我不太喜欢它们的原因(开发者,我再一次同时要求constexpr和SFINAE)。所以,我给你的建议是,不要用它们来减少你代码中的字母。事实上,即使是在剥离的mql-版本中,它也是一个强大的工具,但需要一个非常规范的方法。
我不会去猜测什么,我在可靠地做我的工作。
你在对m_data 指针做什么? 你是在访问元素m_data 吗? 你从它那里得到了什么?我知道这在这里发生。
只是不清楚(非常复杂)你想达到什么目的?
如果这一行会发生什么
将在公开场合书写。
班级对我来说是个谜。两年后,我仍然不知道如何处理它们。
有必要将测试结果 的统计数据写到数据库表中。
事先创建了数据库,通过在EA设置中加入sinput变量来写入感兴趣的通证。
DB:
我用这段代码写到这个表中。
ENUM_STATISTICS 枚举有一个顺序,如帮助中的顺序,脚本要检查。
一切正常,但是代码文本相当多,很有可能出现错别字,如何以更可靠的方式将这个查询发送到数据库--主要的问题是如何进入StringFormat。
有必要将测试结果 的统计数据写到数据库表中。
事先创建了数据库,通过在EA设置中加入sinput变量来写入感兴趣的通证。
DATABASE。
我用这段代码写到这个表中。
ENUM_STATISTICS 枚举有一个顺序,如帮助中的顺序,脚本要检查。
一切正常,但是代码文本相当多,很有可能出现错别字,如何以更可靠的方式将这个查询发送到数据库--主要的问题是如何进入StringFormat。
定义!!!(尽管在这里正常的过载也可以)
那么这个StringFormat的意义是什么呢?
它不比正常的add....,速度也不快。(我已经做了几十个千兆字节的文本文件=....)即使是普通的附加组件也更快,这就是它的方式......
如果你想通过这个常规函数来做,我也不明白这个问题 ))
那么这个字符串格式的意义何在?
它永远不会比正常添加的速度快....。(我已经做了几十个千兆字节的文本文件=....)即使是普通的附加组件也更快,这就是问题所在......
我不知道。
我阅读了帮助和文章,并使用例子创建了一个数据库查询。
它似乎可以工作,但我怀疑如果我使用这个代码的一部分,我可能会犯一些错误
总而言之,这可能看起来很奇怪,所以我想问如何在不搞砸的情况下使其更加紧凑))))。
有必要将测试结果 的统计数据写到数据库表中。
事先创建了数据库,通过在EA设置中加入sinput变量来写入感兴趣的通证。
DB:
我用这段代码写到这个表中。
ENUM_STATISTICS 枚举有一个顺序,如帮助中的顺序,脚本要检查。
所有的工作,但代码的文本是相当庞大的,有一个很高的概率的打字,如何以一个更可靠的方式获得这个查询到数据库 - 主要问题是如何获得StringFormat
请记住,首先,在SQLite中字段类型是可选的,你不必为输入和铸造而烦恼。它被称为 "Lite "是有原因的。
一个长的查询可以分为3-4-5个部分 :-)
BEGIN TRANSACTION
INSERT INTO myTable VALUES (...); --- тут можно получить PrimaryKey
UPDATE myTable .... ; --- обновить по Primary
UPDATE myTable ... ; --- ещё...
COMMIT ; --- это если все запросы удачны.. иначе ROLLBACK
这是从旧的记忆中得到的,也就是说,你应该在帮助下检查。
我不知道。
我读了帮助和文章,用例子创建了一个数据库查询。
它似乎是有效的,但我怀疑如果我部分使用这段代码,可能会出现错误的打印。
我想问的是,如何在不搞砸的情况下使其更加紧凑))))。
你的任务应该是这样解决的。
你的特殊问题应该这样解决。
糟糕!
对!数组
谢谢你!!!!!