expert advisor - verschiedene Fragen - Seite 13

 

Sie könnten eine Funktion wie diese schreiben:

void DrawLabel(string name, string text, int x, int y, int fontsize=10)

Wenn Sie die Funktion ohne den endgültigen Wert aufrufen, wird der Standardwert verwendet , d. h. die Schriftgröße beträgt 10

DrawLabel("MyLabel","Hello,World!",50,50); // final parameter not passed (default value used)

Oder Sie können den Standardwert für die Schriftgröße explizit außer Kraft setzen:

DrawLabel("MyLabel","Hello,World!",50,50,24); // fontsize parameter is 24

Ist es das, was Sie meinen?

 
honest_knave:

Ist es das, was Sie meinen?

Vielleicht verhindert mein Englisch, Ihren Kommentar zu verstehen.
Vielen Dank für Ihren Kommentar.
Wenn ich richtig verstehe, verstehe ich Sie so: Ich kann 1x Void Funktion für Label schreiben, und ich kann es mit zwei Methoden wie unten verwenden. (Ich kann eine Void-Funktion für ein Label-Objekt mit und ohne Schriftgrößen-Parameter verwenden, ist das korrekt? )

DrawLabel("MyLabel","Hello,World!",50,50);    // #1
DrawLabel("MyLabel","Hello,World!",50,50,24); // #2

Also, ich möchte sagen, dass ich einige Stunden für dieses Spreadsheet-Objekt verbracht habe, um herauszufinden , woher das Problem kommt und wie ich es lösen kann.
Also, ich glaube, es kommt von unten Code, nicht von Label-Funktionen, weil ich hatte 2x Label-Funktionen, habe ich eine von ihnen entfernt, Bid und Ask Preisindikatoren (Marktpreise) noch gut funktioniert, aber Spreadsheet funktioniert nicht mit Label-Funktion. Spreadsheet funktioniert gut ohne Label-Funktion.

Ich muss einen Teil des Codes aus der Tabellenkalkulation teilen. Ich bezweifle, wie unten Code. (Auch - ich muss noch einmal erwähnen unten Code funktioniert gut, wenn ich Label-Objekt ohne Label-Funktion für Spreadsheet erstellen)

double  spread                                                 ;
        spread       = MarketInfo  ( symbol, MODE_SPREAD ) / 10;
        spreadstring = DoubleToStr ( spread, 1           )     ;

Vielen Dank für alles.

 

Es ist eine gute Praxis, zu überprüfen, ob etwas, das Sie zu erstellen versuchen, auch tatsächlich erstellt wird.

Wenn es zum Beispiel um Bildschirmgrößen geht, verwenden viele Benutzer unterschiedliche Auflösungen, und wann immer aus welchem Grund auch immer ein Objekt über die Grenzen der Diagrammbreite oder -höhe hinaus erstellt wird, wird das Objekt nicht gezeichnet oder verschwindet.

Oder die Fehlermeldung 4200 zeigt an, dass das Objekt, das Sie zu erstellen versuchen, bereits existiert.

Dies ist wichtig, wenn Sie versuchen, Ihrem Objekt verschiedene Werte zuzuweisen, da die neuen Werte nicht zugewiesen werden, wenn die Erstellung fehlschlägt.

Aus diesem Grund geben diese Funktionen einen Wert zurück, damit Sie überprüfen können, ob die Erstellung erfolgreich war oder nicht.

Es liegt an Ihnen zu überprüfen, ob die Funktion erfolgreich war oder nicht, aber ein guter Programmierer wird das Ergebnis überprüfen.

Wenn du eine ungültige Funktion schreibst, gibt sie nichts zurück, so dass du das Ergebnis nicht überprüfen kannst, indem du analysierst, was zurückkommt, wenn du sie aufrufst.

Sie können aber auch einfach in der Funktion selbst prüfen und eine einfache Warnung auslösen, wenn etwas schief gelaufen ist.

Wenn Sie das tun, werden Sie diese Warnungen normalerweise nicht sehen, aber wenn etwas schief geht, werden Sie sofort auf das Problem selbst hingewiesen.


Bei der zweiten Frage können Sie oft zumindest einige der Parameter weglassen, dann nimmt die Funktion die Standardwerte an.

Wenn Sie also nicht von den Standardparametern abweichen müssen oder wollen, geben Sie sie an.

Die Schriftgröße ist ein gutes Beispiel dafür, dass, wenn Sie sie nicht angeben, einfach die Standardeinstellungen verwendet werden.

Außerdem gibt es leichte Unterschiede zwischen bestimmten Objekten, was bei der Analyse der Parameter, die an die Funktion übergeben werden, deutlich wird.

Sie haben nicht alle den gleichen Satz von Variablen, so dass es wichtig ist, zu prüfen, was als Referenz übergeben werden kann und was nicht.

Ich bin mir nicht sicher, was Sie mit dem Spreadstring machen wollen, vielleicht können Sie ein wenig mehr erklären, wofür er da ist und wie Sie ihn verwenden wollen?

 
Marco vd Heijden:

Ich bin mir nicht sicher, was Sie mit dem Spreadstring machen wollen, vielleicht können Sie ein wenig mehr erklären, wofür er ist und wie Sie ihn verwenden wollen?

Ich verwende Label Object Function für Bid, Ask, Spreadsheet, und so weiter. Alles funktioniert perfekt, ohne Spreadsheet - und ich gelöscht und neu zu schreiben, keine guten Auswirkungen.

Nachdem ich die @honest_knave-Methode des Fehlercodes für die Fehlerbeschreibung verwendet habe. Ich sehe keine Warnungen mehr 4200.
Wie ich bereits erwähnt habe, verwende ich'Spreadsheet' an zwei Stellen, #1 in der Init() Funktion - #2 in der OnTick() Funktion, aber ich verwende auch Bid, Ask an 2 Stellen mit 'Spreadsheet', sie haben keine Fehler, Warnungen. Aber dieses Spreadsheet gibt mir keine Warnungen, aber es wird auch nicht aktualisiert.

Erstellung absolut erfolgreich, keine Fehler, keine Warnungen, für alle Objekte, in meinem EA-Codes.

Ich weiß nicht, ich bin gut coder oder was?! (Ich halte mich nicht für einen Coder oder Programmierer.) Aber ich sehe das Ergebnis. Deshalb kann ich nur Label Object verwenden (ohne Funktion, nur für Tabellenkalkulation).

Void-Funktion liefert Ergebnisse für das, was ich will, auch diese Funktion erstellt Objekt für anfängliche Spread-Wert, aber nicht aktualisiert.



Ich bin mir nicht sicher, was du mit dem Spreadstring machen willst, vielleicht kannst du ein bisschen mehr erklären, wofür er ist und wie du ihn benutzen willst?

OK, ich möchte ihn einfach so verwenden: Ich möchte nur, dass es mir Spreadsheet Size ( / Wert ), wenn ich öffnen / fügen Sie meine EA's auf dem Chart für jetzt. Dann werde ich versuchen, Code für die aktuelle Stunde Spread High / Low Größen ( / Werte ) zu schreiben.

Vielen Dank im Voraus.

 

Nun, man kann sie auch in einem Double-Array[] speichern und dann alle vergleichen, um zu sehen, wo die niedrigste Spanne ist.


double spread[];
--

ArrayResize(spread,SymbolsTotal(1),0);
   for(int i=0;i<SymbolsTotal(1);i++)
     {
      spread[i]=MarketInfo(SymbolName(i,1),13);
     }
 

Wenn ich den untenstehenden Code entferne, dann funktioniert die Tabelle perfekt.
Also, ich brauche nur zu helfen, wie kann ich gut schreiben ( / Optimal ) Code statt es, bitte?

{
    Print(__FUNCTION__, ": failed to create text label! Error code = ", GetLastError());
    return(false);
}

Ich behalte nur untenstehenden Code für die Funktion Label Object.

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) ) 

Vielen Dank im Voraus.

(Wenn dieses Problem wirklich ein Problem ist, hoffe ich, dass MetaQuotes es beheben wird, denn es hat mich einige Stunden gekostet, anderen zu helfen, die neu in dieser Code-Branche sind)

 

Löschen Sie die "return(false)"-Anweisung, behalten Sie aber die Print-Anweisung bei und führen Sie Ihren Code aus.

Ich denke, Sie werden einige Meldungen erhalten. Ich denke, Sie versuchen, das Etikett immer wieder zu erstellen, anstatt den Wert zu ändern.

 
honest_knave:

Löschen Sie das "return(false)", aber behalten Sie die Print-Anweisung und führen Sie Ihren Code aus.

WAS ZUR HÖLLE!
Diese
Scheiße hat mich einige Stunden gekostet, ich weiß nicht, was ich dazu sagen soll.
Kann ich das aus allen meinen Objects-Funktionen entfernen?
Können Sie mir auch sagen, wie es funktioniert?

return(false);

Einfach danke.

 
Max Enrik:

WAS ZUR HÖLLE!
Kann
ich das aus allen meinen Objects-Funktionen entfernen?

Ja, aber es wäre besser, sie zu behalten und die Fehlerquelle zu beseitigen.

Max Enrik:

WAS ZUR HÖLLE!
Können Sie mir
auch sagen, wie das funktioniert?

return(false);

Der Return-Operator sagt der Funktion einfach, dass sie sofort beendet werden soll. Wenn die Funktion einen Wert zurückgibt (in Ihrem Fall ist es ein bool), müssen Sie auch einen Wert zurückgeben.

Sie werden Ihren Fehler (4200, richtig?) los, wenn Sie prüfen, ob das Objekt existiert, bevor Sie es erstellen.

Return Operator - Operators - Language Basics - MQL4 Reference
Return Operator - Operators - Language Basics - MQL4 Reference
  • docs.mql4.com
Return Operator - Operators - Language Basics - MQL4 Reference
 
honest_knave:

Vielen Dank für Ihre Kommentare klar, Mann.

Ich habe es bereits mit Ihrer Methode, wie unten Code ersetzen. ( für Label Object Funktion )

War - vor deinem Kommentar über die Fehlerbeschreibung:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    Print( __FUNCTION__, ": failed to create text label! Error code = ", GetLastError() );
    return(false);
}

// which one this code gives me error no: 4200 

nach:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false);
}

// prevent error no: 4200 - but was not update spreadsheet values 

Jetzt - und funktioniert perfekt:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false); // removed this line
}

// now spreadsheet values updates, no any more error no: 4200 

Alles Gute für Sie.