OOP, modelli e macro in mql5, sottigliezze e usi - pagina 27

 
Vladimir Simakov:

Un puntatore a un oggetto.

Senza offesa, ma è troppo presto per te con macro come questa, ti impantanerai. Prima di tutto, dovete capire perché l'ho fatto in questo modo:

E cosa fare con questo puntatore all'oggetto all'interno della classe dove passarlo.

E per quanto riguarda le macro, sono molto più facili da lavorare.

 
Seric29:

E cosa fare con questo puntatore a un oggetto all'interno della classe, dove passarlo.

Per quanto riguarda le macro, sono molto più facili da lavorare.

Potete usarlo per riferirvi a un oggetto creato ovunque. Nel mio esempio il puntatore all'oggetto creato globalmente viene passato al costruttore, ma questa classe può essere annidata in un'altra (in cui viene creato l'oggetto).

Ecco un esempio dell'uso della vostra macro:

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

...

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

Vediamo in cosa si sviluppa, sto aggiungendo delle parentesi per chiarezza:

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

Come risultato, avete un codice assolutamente valido per il compilatore, ma il comportamento del programma è categoricamente diverso da quello che era previsto. E ora non ti accorgi dell'errore, il codice funziona, e poi fissi il terminale e ti chiedi perché il robot ha fatto il login con tutto il deposito e ha perso il tuo conto? )))))

Sono molto bravo con le macro, ma è per questo e perché mi piacciono così tanto (sviluppatori, ancora una volta per favore constexpr e SFINAE allo stesso tempo). Quindi, il mio consiglio è di non usarli per ridurre le lettere nel vostro codice. In realtà, anche in una versione ridotta di mql, è uno strumento potente, ma richiede un approccio molto disciplinato.

 

Sviluppatori, aggiungete la possibilità di usare un numero illimitato di argomenti all'interno di macro e funzioni. Sono stanco di questa assurdità statica. Che cosa sono 8 argomenti per una macro e se avete bisogno di 108 cosa allora, fatene almeno 10. E anche rendere possibile il sovraccarico delle macro in modo da non dover moltiplicare i nuovi nomi con le macro. Sarebbe anche bello se si potesse fare

#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:

Ma il comportamento del programma è categoricamente diverso da quello previsto. Ora non è un fatto che noterete l'errore, il codice funziona, e poi vi troverete stupidamente a guardare nel terminale e a chiedervi perché il robot è entrato con tutto il suo deposito e ha perso il vostro conto? )))))

Sono molto bravo con le macro, ma è per questo che non mi piacciono così tanto (sviluppatori, per favore, chiedete ancora una volta a constexpr e SFINAE allo stesso tempo). Quindi, il mio consiglio è di non usarli per ridurre le lettere nel vostro codice. In realtà, anche in una versione ridotta di mql, è uno strumento potente, ma richiede un approccio molto disciplinato.

Non voglio indovinare nulla, faccio il mio lavoro in modo affidabile.

CDataManager*  m_data;

Cosa state facendo con il puntatore m_data? State accedendo all'elementom_data, cosa ne ricavate? Ho capito che succede qui.

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

Non è chiaro (molto complicato) cosa stai cercando di ottenere?

Cosa succederebbe se questa linea

CDataManager*  m_data;

sarebbe stato scritto in pubblico.

Le classi sono un mistero per me. Dopo 2 anni non so ancora come gestirli.

 

C'è la necessità di scrivere le statistiche dei risultati dei test in una tabella del database,

Il DB è creato in anticipo, i passaggi di interesse sono scritti includendo la variabile sinput nelle impostazioni EA

DATABASE:

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

Scrivo su questa tabella con questo codice:

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


L'enumerazione ENUM_STATISTICS ha un ordine come in aiuto, script da controllare:

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


tutto funziona,MA il testo del codice è abbastanza voluminoso, alta probabilità di un errore di battitura, come ottenere questa query al database in un modo più affidabile - il problema principale è come entrare inStringFormat

 
Igor Makanu:

C'è la necessità di scrivere le statistiche dei risultati dei test in una tabella del database,

Il DB è creato in anticipo, i passaggi di interesse sono scritti includendo la variabile sinput nelle impostazioni EA

DB:

Scrivo su questa tabella con questo codice:


L'enumerazione ENUM_STATISTICS ha un ordine come in aiuto, script da controllare:


tutto funziona,MA il testo del codice è abbastanza voluminoso, alta probabilità di un errore di battitura, come ottenere questa query al database in un modo più affidabile - il problema principale è come entrare inStringFormat

Definisci!!! (anche se qui va bene un normale sovraccarico)

E qual è lo scopo di questo StringFormat?

Non è più veloce di un normale add.... (Ho fatto decine di gigabyte di file di testo =....) anche un normale add-on è più veloce, è così...


Se vuoi farlo attraverso questa funzione regolare, non capisco neanche io il problema ))

 
Alexandr Andreev:

E che senso ha questo formato di stringa?

Non è mai più veloce di un normale add.... (Ho fatto decine di gigabyte di file di testo =....) anche un normale add-on è più veloce, questo è il punto...

Non lo so.

Ho letto la guida e l'articolo e ho creato una query di database usando gli esempi

Sembra funzionare, ma ho il sospetto che se uso parte di questo codice, potrei fare qualche errore di battitura

Tutto sommato questo può sembrare strano, quindi sto chiedendo come renderlo più compatto senza rovinare ))))

 
Igor Makanu:

C'è la necessità di scrivere le statistiche dei risultati dei test in una tabella del database,

Il DB è creato in anticipo, i passaggi di interesse sono scritti includendo la variabile sinput nelle impostazioni EA

DB:

Scrivo su questa tabella con questo codice:


L'enumerazione ENUM_STATISTICS ha un ordine come in aiuto, script da controllare:


tutto funziona,ma il testo del codice è piuttosto vasto, c'è un'alta probabilità di un errore di battitura, come ottenere questa query al database in un modo più affidabile - il problema principale è comeottenere StringFormat

Ricordate, prima di tutto, i tipi di campo sono opzionali in SQLite e non dovete preoccuparvi di digitare e fondere. È "Lite" per una ragione.

una lunga domanda può essere divisa in 3-4-5 parti :-)

BEGIN TRANSACTION

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

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

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

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

Questo è da vecchia memoria, cioè dovreste controllare con l'aiuto

 
Igor Makanu:

Non lo so.

Ho letto la guida e l'articolo, ho creato una query di database usando gli esempi

Sembra funzionare, ma ho il sospetto che se uso parzialmente questo codice, potrei fare errori di stampa

Vorrei chiedere come renderlo più compatto senza rovinare ))))

Il vostro compito dovrebbe essere risolto in questo modo:

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:

Il tuo particolare problema dovrebbe essere risolto così:

Merda!

Giusto! Array!

GRAZIE!!!!!

Motivazione: