OOP, Vorlagen und Makros in mql5, Feinheiten und Anwendungen - Seite 27

 
Vladimir Simakov:

Ein Zeiger auf ein Objekt.

Nichts für ungut, aber es ist noch zu früh für Sie mit solchen Makros, Sie werden sich verzetteln. Zunächst einmal müssen Sie verstehen, warum ich das so gemacht habe:

Und was damit zu tun, mit diesem Zeiger auf Objekt innerhalb der Klasse, wo es zu übergeben.

Und was die Makros betrifft, so ist es viel einfacher, mit ihnen zu arbeiten.

 
Seric29:

Und was ist mit diesem Zeiger auf ein Objekt innerhalb der Klasse zu tun, wohin ist er zu übergeben.

Was Makros betrifft, so ist die Arbeit mit ihnen viel einfacher.

Sie können damit auf ein Objekt verweisen, das irgendwo erstellt wurde. In meinem Beispiel wird der Zeiger auf das global erstellte Objekt an den Konstruktor übergeben, aber diese Klasse kann selbst in einer anderen verschachtelt sein (in der das Objekt erstellt wird).

Hier ist ein Beispiel für die Verwendung Ihres Makros:

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

...

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

Sehen Sie, was daraus wird, ich füge der Klarheit halber Klammern hinzu:

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

Das Ergebnis ist ein absolut gültiger Code für den Compiler, aber das Verhalten des Programms unterscheidet sich grundlegend von dem, was beabsichtigt war. Und jetzt bemerken Sie den Fehler gar nicht, der Code funktioniert, und dann starren Sie einfach in den Terminal und fragen sich, warum der Roboter sich mit der gesamten Einzahlung eingeloggt und Ihr Konto verloren hat? )))))

Ich bin sehr gut in Makros, aber das ist der Grund, warum ich sie so sehr hasse (Entwickler, bitte noch einmal constexpr und SFINAE zur gleichen Zeit). Ich rate Ihnen also, sie nicht zur Reduzierung von Buchstaben in Ihrem Code zu verwenden. Selbst in der abgespeckten mql-Version ist es ein leistungsfähiges Werkzeug, das allerdings eine sehr disziplinierte Vorgehensweise erfordert.

 

Entwickler, fügen Sie die Möglichkeit hinzu, eine unbegrenzte Anzahl von Argumenten in Makros und Funktionen zu verwenden. Ich bin diesen statischen Unsinn leid. Was ist 8 Argumente für ein Makro und wenn Sie 108 brauchen, was dann, machen Sie es mindestens 10. Außerdem sollte es möglich sein, Makros zu überladen, so dass man neue Namen nicht mit Makros multiplizieren muss. Es wäre auch cool, wenn Sie Folgendes machen könnten

#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

Makro#if

 
Vladimir Simakov:

Aber das Verhalten des Programms unterscheidet sich grundlegend von dem, was beabsichtigt war. Nun ist es nicht so, dass Sie den Fehler bemerken, der Code funktioniert, und dann schauen Sie dumm in den Terminal und fragen sich, warum der Roboter mit seiner gesamten Einlage reingegangen ist und Ihr Konto verloren hat? )))))

Ich bin sehr gut in Makros, aber deshalb mag ich sie nicht so sehr (Entwickler, bitte fragen Sie noch einmal constexpr und SFINAE gleichzeitig). Ich rate Ihnen also, sie nicht zur Reduzierung von Buchstaben in Ihrem Code zu verwenden. Selbst in der abgespeckten mql-Version ist es ein leistungsfähiges Werkzeug, das allerdings eine sehr disziplinierte Vorgehensweise erfordert.

Ich werde nichts raten, ich mache meine Arbeit zuverlässig.

CDataManager*  m_data;

Was machen Sie mit dem m_data-Zeiger? Greifen Sie auf das Elementm_data zu? Was erhalten Sie von diesem Element? Ich weiß, dass das hier passiert.

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

Es ist einfach nicht klar (sehr kompliziert), was Sie zu erreichen versuchen?

Was würde passieren, wenn diese Zeile

CDataManager*  m_data;

in der Öffentlichkeit geschrieben werden.

Der Unterricht ist für mich ein Rätsel. Nach 2 Jahren weiß ich immer noch nicht, wie ich mit ihnen umgehen soll.

 

Es besteht die Notwendigkeit, Testergebnisstatistiken in eine Datenbanktabelle zu schreiben,

Die DB wird vorher erstellt, die interessierenden Pässe werden geschrieben, indem die Variable sinput in die EA-Einstellungen aufgenommen wird

DATENBANK:

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

Ich schreibe in diese Tabelle mit diesem Code:

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 Aufzählung hat eine Reihenfolge wie in der Hilfe, Skript zu überprüfen:

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


alles funktioniert,ABER der Code-Text ist ziemlich umfangreich, hohe Wahrscheinlichkeit eines Tippfehlers, wie man diese Abfrage an die Datenbank in eine zuverlässigere Art und Weise - das Hauptproblem ist, wiemaninStringFormat zu bekommen

 
Igor Makanu:

Es besteht die Notwendigkeit, Testergebnisstatistiken in eine Datenbanktabelle zu schreiben,

Die DB wird vorher erstellt, die interessierenden Pässe werden geschrieben, indem die Variable sinput in die EA-Einstellungen aufgenommen wird

DATENBANK:

Ich schreibe in diese Tabelle mit diesem Code:


ENUM_STATISTICS Aufzählung hat eine Reihenfolge wie in der Hilfe, Skript zu überprüfen:


alles funktioniert,ABER der Code-Text ist ziemlich umfangreich, hohe Wahrscheinlichkeit eines Tippfehlers, wie man diese Abfrage an die Datenbank in eine zuverlässigere Art und Weise - das Hauptproblem ist, wiemaninStringFormat zu bekommen

Definieren!!! (obwohl eine normale Überlastung hier ausreicht)

Und was ist der Sinn dieses StringFormats?

Es ist nicht schneller als ein normales add.... (Ich habe Dutzende von Gigabytes an Textdateien erstellt =....) selbst ein normales Add-on ist schneller, so ist es nun mal...


Wenn Sie es über diese reguläre Funktion machen wollen, verstehe ich das Problem auch nicht ))

 
Alexandr Andreev:

Und was hat es mit diesem String-Format auf sich?

Es ist nie schneller als ein normales add.... (Ich habe Dutzende von Gigabytes an Textdateien erstellt =....) selbst ein normales Add-on ist schneller, das ist die Sache...

Ich weiß es nicht.

Ich habe die Hilfe und den Artikel gelesen und eine Datenbankabfrage anhand der Beispiele erstellt

Es scheint zu funktionieren, aber ich vermute, dass ich einige Tippfehler mache, wenn ich einen Teil dieses Codes verwende

Alles in allem sieht das vielleicht seltsam aus, also frage ich, wie man es kompakter machen kann, ohne )))) zu vermasseln.

 
Igor Makanu:

Es besteht die Notwendigkeit, Testergebnisstatistiken in eine Datenbanktabelle zu schreiben,

Die DB wird vorher erstellt, die interessierenden Pässe werden geschrieben, indem die Variable sinput in die EA-Einstellungen aufgenommen wird

DB:

Ich schreibe in diese Tabelle mit diesem Code:


ENUM_STATISTICS Aufzählung hat eine Reihenfolge wie in der Hilfe, Skript zu überprüfen:


alles funktioniert,aber der Text des Codes ist ziemlich umfangreich, es gibt eine hohe Wahrscheinlichkeit eines Tippfehlers, wie man diese Abfrage an die Datenbank in einer zuverlässigeren Weise zu bekommen - das Hauptproblem ist, wieStringFormat zu bekommen

Denken Sie daran, dass die Feldtypen in SQLite optional sind und Sie sich nicht mit Typisierung und Casting herumschlagen müssen. Es heißt nicht umsonst "Lite".

eine lange Anfrage kann in 3-4-5 Teile aufgeteilt werden :-)

BEGIN TRANSACTION

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

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

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

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

dies ist ein altes Gedächtnis, d.h. Sie sollten sich mit der Hilfe

 
Igor Makanu:

Ich weiß es nicht

ich habe die Hilfe und den Artikel gelesen und eine Datenbankabfrage anhand der Beispiele erstellt

Es scheint zu funktionieren, aber ich habe den Verdacht, dass ich, wenn ich diesen Code teilweise verwende, Druckfehler machen könnte

Ich würde gerne wissen, wie man es kompakter machen kann, ohne )))) zu vermasseln.

Ihre Aufgabe sollte folgendermaßen gelöst werden:

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:

Ihr spezielles Problem sollte folgendermaßen gelöst werden:

Verdammt!

Richtig! Arrays!

DANKESCHÖN!!!!!