OOP, plantillas y macros en mql5, sutilezas y usos - página 27

 
Vladimir Simakov:

Un puntero a un objeto.

No te ofendas, pero es demasiado pronto para ti con macros así, te vas a empantanar. En primer lugar, hay que entender por qué lo he hecho así:

Y qué hacer con él con este puntero a objeto dentro de la clase donde pasarlo.

Y en cuanto a las macros, son mucho más fáciles de trabajar.

 
Seric29:

Y qué hacer con este puntero a un objeto dentro de la clase, a dónde pasarlo.

En cuanto a las macros, son mucho más fáciles de trabajar.

Se puede utilizar para referirse a un objeto creado en cualquier lugar. En mi ejemplo el puntero al objeto creado globalmente se pasa al constructor, pero esta clase puede a su vez estar anidada en otra (en la que se crea el objeto).

Este es un ejemplo del uso de su macro:

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

...

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

A ver en qué se convierte, añado paréntesis para mayor claridad:

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

Como resultado, tienes un código absolutamente válido para el compilador, pero el comportamiento del programa es categóricamente diferente de lo que se pretendía. Y ahora no te das cuenta del error, el código funciona, y luego te quedas mirando el terminal y te preguntas por qué el robot ha entrado con todo el depósito y ha perdido tu cuenta... )))))

Soy muy bueno con las macros, pero por eso y porque me desagradan tanto (desarrolladores, una vez más por favor constexpr y SFINAE al mismo tiempo). Así que mi consejo es que no los utilices para reducir las letras en tu código. En realidad, incluso en una versión reducida de mql, es una herramienta poderosa, pero requiere un enfoque muy disciplinado.

 

Desarrolladores, añadid la posibilidad de usar un número ilimitado de argumentos dentro de las macros y funciones. Estoy cansado de esta tontería estática. Qué son 8 argumentos para una macro y si necesitas 108 qué entonces, que sean al menos 10. Y también hacer posible la sobrecarga de macros para no tener que multiplicar nuevos nombres con macros. También sería genial si pudieras hacer

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

Pero el comportamiento del programa es categóricamente diferente de lo que se pretendía. Y ahora no es un hecho que notarás el error, el código funciona, y luego estarás estúpidamente mirando en el terminal y preguntándote por qué el robot entró con todo el depósito y perdió la cuenta... )))))

Soy muy bueno con las macros, pero por eso no me gustan tanto (desarrolladores, una vez más pido constexpr y SFINAE al mismo tiempo). Así que mi consejo es que no los utilices para reducir las letras en tu código. De hecho, incluso en una versión reducida de mql, es una herramienta poderosa, pero requiere un enfoque muy disciplinado.

No voy a adivinar nada, estoy haciendo mi trabajo de forma fiable.

CDataManager*  m_data;

¿Qué haces con el puntero m_data? ¿Está accediendo al elementom_data?¿Qué obtiene de él? Tengo entendido que esto ocurre aquí.

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

No está claro (es muy complicado) qué es lo que quiere conseguir.

¿Qué pasaría si esta línea

CDataManager*  m_data;

se escribiría en público.

Las clases son un misterio para mí. Después de 2 años todavía no sé cómo manejarlos.

 

Es necesario escribir las estadísticas de los resultados de las pruebas en una tabla de la base de datos,

La BD se crea de antemano, los pases de interés se escriben incluyendo la variable sinput en la configuración del EA

BASE DE DATOS:

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

Escribo en esta tabla con 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)));


La enumeración ENUM_STATISTICS tiene un orden como en la ayuda, script para comprobar:

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


todo funciona,PERO el texto del código es bastante voluminoso, alta probabilidad de un error tipográfico, cómo conseguir esta consulta a la base de datos de una manera más fiable - el principal problema es cómo entrar enStringFormat

 
Igor Makanu:

Es necesario escribir las estadísticas de los resultados de las pruebas en una tabla de la base de datos,

La BD se crea de antemano, los pases de interés se escriben incluyendo la variable sinput en la configuración del EA

DB:

Escribo en esta tabla con este código:


La enumeración ENUM_STATISTICS tiene un orden como en la ayuda, script para comprobar:


todo funciona,PERO el texto del código es bastante voluminoso, alta probabilidad de un error tipográfico, cómo conseguir esta consulta a la base de datos de una manera más fiable - el principal problema es cómo entrar enStringFormat

¡¡¡Define!!! (aunque una sobrecarga normal servirá aquí)

¿Y qué sentido tiene este StringFormat?

No es más rápido que un add.... normal (He hecho docenas de gigabytes de archivos de texto =....) incluso un complemento normal es más rápido, así es...


Si quieres hacerlo a través de esta función regular, tampoco entiendo el problema ))

 
Alexandr Andreev:

¿Y qué sentido tiene este formato de cadena?

Nunca es más rápido que un add.... normal (He hecho docenas de gigabytes de archivos de texto =....) incluso un complemento normal es más rápido, esa es la cuestión...

No lo sé.

He leído la ayuda y el artículo y he creado una consulta a la base de datos utilizando los ejemplos

Parece que funciona, pero sospecho que si utilizo parte de este código, puedo cometer algún error tipográfico

Con todo esto puede parecer extraño, por lo que pregunto cómo hacerlo más compacto sin meter la pata )))

 
Igor Makanu:

Es necesario escribir las estadísticas de los resultados de las pruebas en una tabla de la base de datos,

La BD se crea de antemano, los pases de interés se escriben incluyendo la variable sinput en la configuración del EA

BASE DE DATOS:

Escribo en esta tabla con este código:


La enumeración ENUM_STATISTICS tiene un orden como en la ayuda, script para comprobar:


todo funciona,pero el texto del código es bastante extenso, hay una alta probabilidad de un error tipográfico, cómo conseguir esta consulta a la base de datos de una manera más fiable - el principal problema es cómoconseguir StringFormat

Recuerda, en primer lugar, que los tipos de campo son opcionales en SQLite y que no tienes que molestarte en teclear ni en castear. Es "Lite" por una razón.

una consulta larga puede dividirse en 3-4-5 partes :-)

BEGIN TRANSACTION

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

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

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

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

esto es de vieja memoria, es decir, debe comprobar con la ayuda

 
Igor Makanu:

No lo sé.

He leído la ayuda y el artículo, he creado una consulta a la base de datos utilizando los ejemplos

Parece que funciona, pero sospecho que si uso parcialmente este código, puedo cometer errores de imprenta

Me gustaría preguntar cómo hacerla más compacta sin fastidiar ))))

Su tarea debería resolverse así:

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:

Su problema particular debería resolverse así:

¡Mierda!

¡Cierto! ¡Arreglos!

¡¡¡¡¡GRACIAS!!!!!

Razón de la queja: