mql5中的OOP、模板和宏,细微之处和用途 - 页 27

 
Vladimir Simakov:

一个指向对象的指针。

无意冒犯,但对你来说,这样的宏伟目标还为时过早,你会被困住的。首先,你必须理解我为什么这样做。

以及如何处理这个指向类内对象的指针,在哪里传递它。

至于宏,它们更容易操作。

 
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-版本中,它也是一个强大的工具,但需要一个非常规范的方法。

 

开发人员,增加在宏和函数中使用无限数量的参数的可能性。 我已经厌倦了这种静态的胡闹。一个宏的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

 
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;

将在公开场合书写。

班级对我来说是个谜。两年后,我仍然不知道如何处理它们。

 

有必要将测试结果 的统计数据写到数据库表中。

事先创建了数据库,通过在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

 
Igor Makanu:

有必要将测试结果 的统计数据写到数据库表中。

事先创建了数据库,通过在EA设置中加入sinput变量来写入感兴趣的通证。

DATABASE。

我用这段代码写到这个表中。


ENUM_STATISTICS 枚举有一个顺序,如帮助中的顺序,脚本要检查。


一切正常,但是代码文本相当多,很有可能出现错别字,如何以更可靠的方式将这个查询发送到数据库--主要的问题是如何进入StringFormat

定义!!!(尽管在这里正常的过载也可以)

那么这个StringFormat的意义是什么呢?

它不比正常的add....,速度也不快。(我已经做了几十个千兆字节的文本文件=....)即使是普通的附加组件也更快,这就是它的方式......


如果你想通过这个常规函数来做,我也不明白这个问题 ))

 
Alexandr Andreev:

那么这个字符串格式的意义何在?

它永远不会比正常添加的速度快....。(我已经做了几十个千兆字节的文本文件=....)即使是普通的附加组件也更快,这就是问题所在......

我不知道。

我阅读了帮助和文章,并使用例子创建了一个数据库查询。

它似乎可以工作,但我怀疑如果我使用这个代码的一部分,我可能会犯一些错误

总而言之,这可能看起来很奇怪,所以我想问如何在不搞砸的情况下使其更加紧凑))))。

 
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

这是从旧的记忆中得到的,也就是说,你应该在帮助下检查。

 
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"));
 
Vladimir Simakov:

你的特殊问题应该这样解决。

糟糕!

对!数组

谢谢你!!!!!