OOP, modelos e macros em mql5, sutilezas e usos - página 27

 
Vladimir Simakov:

Um ponteiro para um objeto.

Sem ofensa, mas é muito cedo para você com macros como esta, você vai ficar atolado. Antes de mais nada, é preciso entender por que o fiz desta maneira:

E o que fazer com ele com este ponteiro para objetar dentro da classe onde passá-lo.

E quanto às macros, elas são muito mais fáceis de se trabalhar.

 
Seric29:

E o que fazer com este ponteiro para um objeto dentro da classe, para onde passá-lo.

Quanto às macros, elas são muito mais fáceis de se trabalhar.

Você pode usá-lo para se referir a um objeto criado em qualquer lugar. Em meu exemplo, o ponteiro para o objeto criado globalmente é passado para o construtor, mas esta classe pode ela mesma ser aninhada em outra (na qual o objeto é criado).

Aqui está um exemplo do uso de sua macro:

#define  foor1(a,b,v,g) \
for(;Funkziya(a,b,v)&&g;b++)

...

foor(a,b,c,isSomething?a>b:b>c){
    DoSomething();
}
...

Veja no que se desdobra, estou acrescentando parênteses para maior clareza:

for(;( Funkziya(a,b,c)&&isSomething)?a>b:b>c;b++){
    DoSomething();
}

Como resultado, você tem um código absolutamente válido para o compilador, mas o comportamento do programa é categoricamente diferente do que foi pretendido. E agora você não percebe realmente o erro, o código funciona, e então você apenas olha para o terminal e se pergunta por que o robô entrou com todo o depósito e perdeu sua conta? )))))

Sou muito bom em macros, mas é por isso e por que não gosto muito deles (desenvolvedores, mais uma vez, por favor, constexpr e SFINAE ao mesmo tempo). Portanto, meu conselho para você é que não os utilize para reduzir as letras em seu código. Na verdade, é, mesmo em uma versão de mql descascada, uma ferramenta poderosa, mas requer uma abordagem muito disciplinada.

 

Desenvolvedores, acrescentem a possibilidade de usar um número ilimitado de argumentos dentro de macros e funções. Estou cansado deste disparate estático. O que são 8 argumentos para uma macro e se você precisa de 108 o que então, faça pelo menos 10. E também tornam possível sobrecarregar as macros para não ter que multiplicar novos nomes com macros. Também seria legal se você pudesse fazer

#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

macro#if

 
Vladimir Simakov:

Mas o comportamento do programa é categoricamente diferente do que foi pretendido. Agora não é um fato que você vai notar o erro, o código funciona, e então você vai estar olhando estupidamente no terminal e se perguntando porque o robô entrou com todo o seu depósito e perdeu sua conta? )))))

Sou muito bom em macros, mas é por isso que não gosto muito deles (desenvolvedores, por favor, perguntem mais uma vez ao constexpr e SFINAE ao mesmo tempo). Portanto, meu conselho para você é que não os utilize para reduzir as letras em seu código. Na verdade, é, mesmo em uma versão de mql descascada, uma ferramenta poderosa, mas requer uma abordagem muito disciplinada.

Não vou adivinhar nada, estou fazendo meu trabalho de forma confiável.

CDataManager*  m_data;

O que você está fazendo com o ponteiro m_data? Você está acessando o elementom_data? O que você ganha com isso? Eu entendo que isso acontece aqui.

   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){}

Só não está claro (muito complicado) o que você está tentando alcançar?

O que aconteceria se esta linha

CDataManager*  m_data;

seria escrito em público.

As aulas são um mistério para mim. Depois de 2 anos, ainda não sei como lidar com eles.

 

Há uma necessidade de escrever estatísticas de resultados de testes em uma tabela de banco de dados,

O BD é criado de antemão, os passes de interesse são escritos através da inclusão da variável sinput nas configurações EA

BASE DE DADOS:

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)
)

Eu escrevo para esta tabela com este código:

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)));


A enumeração ENUM_STATISTICS tem uma ordem como em ajuda, roteiro para verificar:

void OnStart()
{
   for(int i = 0; i <= (int)STAT_LOSSTRADES_AVGCON; i++)
      printf("%d ^ %s", i, EnumToString(( ENUM_STATISTICS)i));
}


tudo funciona,MAS o texto do código é bastante volumoso, alta probabilidade de erro de digitação, como fazer essa consulta no banco de dados de uma maneira mais confiável - o principal problema é como entrar noStringFormat

 
Igor Makanu:

Há uma necessidade de escrever estatísticas de resultados de testes em uma tabela de banco de dados,

O BD é criado de antemão, os passes de interesse são escritos através da inclusão da variável sinput nas configurações EA

DB:

Eu escrevo para esta tabela com este código:


A enumeração ENUM_STATISTICS tem uma ordem como em ajuda, roteiro para verificar:


tudo funciona,MAS o texto do código é bastante volumoso, alta probabilidade de erro de digitação, como fazer essa consulta no banco de dados de uma maneira mais confiável - o principal problema é como entrar noStringFormat

Defina!!! (embora uma sobrecarga normal sirva aqui)

E qual é o objetivo deste StringFormat?

Não é mais rápido do que um add.... normal (já fiz dezenas de gigabytes de arquivos de texto =....) mesmo um add-on normal é mais rápido, é assim que é...


Se você quiser fazer isso através desta função regular, eu também não entendo o problema ))

 
Alexandr Andreev:

E qual é o objetivo deste formato de cordas?

Nunca é mais rápido do que um add.... normal (já fiz dezenas de gigabytes de arquivos de texto =....) mesmo um suplemento normal é mais rápido, é o que acontece...

Eu não sei.

li a ajuda e o artigo e criei uma consulta ao banco de dados usando os exemplos

Parece funcionar, mas suspeito que se eu usar parte deste código, posso fazer alguns erros de digitação.

Tudo isso pode parecer estranho, então estou perguntando como torná-lo mais compacto sem estragar ))))

 
Igor Makanu:

Há necessidade de escrever as estatísticas dos resultados dos testes em uma tabela de banco de dados,

O BD é criado de antemão, os passes de interesse são escritos através da inclusão da variável sinput nas configurações EA

BASE DE DADOS:

Eu escrevo para esta tabela com este código:


A enumeração ENUM_STATISTICS tem uma ordem como em ajuda, roteiro para verificar:


tudo funciona,mas o texto do código é bastante vasto, há uma alta probabilidade de erro de digitação, como fazer essa consulta no banco de dados de uma maneira mais confiável - o principal problema é comoobter o StringFormat

Lembre-se, primeiro, os tipos de campo são opcionais no SQLite e você não precisa se preocupar com a digitação e a fundição. É "Lite" por uma razão.

uma longa consulta pode ser dividida em 3-4-5 partes :-)

BEGIN TRANSACTION

INSERT INTO myTable VALUES (...); --- тут можно получить PrimaryKey

UPDATE myTable .... ; --- обновить по Primary

UPDATE myTable ...  ; --- ещё...

COMMIT ; --- это если все запросы удачны.. иначе ROLLBACK

isto é de memória antiga, ou seja, você deve verificar com a ajuda

 
Igor Makanu:

Eu não sei.

eu li a ajuda e o artigo, criei uma consulta de banco de dados usando os exemplos

Parece funcionar, mas suspeito que se eu usar parcialmente este código, posso fazer impressões erradas.

Gostaria de perguntar como torná-lo mais compacto sem estragar ))))

Sua tarefa deve ser resolvida desta forma:

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:

Seu problema particular deve ser resolvido desta forma:

Merda!

Certo! Arrays!

OBRIGADO!!!!!

Razão: