Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1324

 
Yurij Kozhevnikov:

Danke, eine solche Implementierung ist mir auch schon eingefallen, aber es ist nicht ganz das Gleiche, weil Value1 selbst fehlt. Das heißt, das von mir erstellte Beispiel ist natürlich extrem vereinfacht, aber es impliziert, dass dies nicht der Hauptwert der Klasse ist, dass es eine Reihe solcher Werte geben kann und dass für jeden ein solches Konstrukt beschrieben werden kann.

Oder ist es bei einer solchen Implementierung möglich, nur eine separate Klasse oder Struktur zu beschreiben, in der die Überladung implementiert wird, und in dieser Klasse Variablen des erstellten Typs zu beschreiben? Wenn aber noch andere Variablen der Klasse an der Zuweisung beteiligt sind, dann passt das wiederum nicht zusammen.

Eigentlich wollte ich etwas ähnliches wie Let/Set/Get-Methoden in vbs implementieren.

Ich verstehe die Frage nicht ganz, aber C++ / MQL hat keine Schlüsseleigenschaft Property

vielleicht brauchen Sie eine Vorlagenklassehttps://www.mql5.com/ru/docs/basis/oop/class_templates


UPD: Hier ist ein Artikel auf Habra über dieselbe Sachehttps://habr.com/ru/post/121799/ , aber ich bezweifle, dass er "direkt" auf MQL zutrifft

 

Herzlichen Dank!

Es übersteigt ein wenig meine Kenntnisse, da ich nie C++ studiert habe, aber es scheint genau das zu sein, was ich wollte. Ich werde versuchen, es herauszufinden.

 
Yurij Kozhevnikov:

Herzlichen Dank!

Das übersteigt ein wenig meine Kenntnisse, da ich nie C++ studiert habe, aber es scheint genau das zu sein, was ich wollte. Ich werde versuchen, es herauszufinden.

Versuchen Sie, Ihre Frage in diesem Thema kurz zu formulieren:https://www.mql5.com/ru/forum/85652

Es gibt dort ein paar wirklich coole Programmierer, die solche Sachen machen... Vielleicht hilft dir das, es schneller herauszufinden

 

Ja, ich danke Ihnen.

Ich erinnerte mich daran, dass ich eine benutzt hatte, hatte aber vergessen, dass sie "Property" heißt, und war etwas begriffsstutzig, als ich erklärte, was ich wollte.

In den Kommentaren zu dem Artikel wurde erwähnt, dass man Makro-Substitution verwenden kann. Das brachte mich auf den Gedanken, dass man vielleicht durch die Annahme einer strikten Syntaxvereinbarung mit mir selbst einen nicht so häufigen Fall viel einfacher implementieren kann.

 
class TestClass
{
  private:
    double cValue1;
    double cValue2;
    double cValue3;
    int cIndex;
    void _Set(double mValue);
  public:
    TestClass():cIndex(-1){}
    double Value1()
    {return cValue1;}

    TestClass* Value(int param)
    {
      cIndex=param;
      return &this;
    }
    void operator =(double mValue) {_Set(mValue);}
};
//---------------------------------------------
void TestClass::_Set(double mValue){
   switch(cIndex){
      case 1:  cValue1=mValue; break;
      case 2:  cValue2=mValue; break;
      case 3:  cValue3=mValue; break;
   }
   cIndex=-1;
}

void TestFunction()
{
  TestClass test;
  test.Value(1)=0.5;
  Print(test.Value1());
}

void OnStart(void)
  {
   TestFunction();
  }
Eine solche Krücke kann dargestellt werden)
 
Vladimir Simakov:
Das ist die Art von Krücke, die man herstellen kann)

Danke, diese Krücke ist natürlich viel einfacher, obwohl ich auch mit ihr noch nicht alles verstehe.

Ist es unmöglich, eine beliebige Menge von Zeichen in eine Makrosubstitution zu setzen? Etwa so:

#define .<один любой набор символов>()=<второй любой набор символов> Set<один любой набор символов>(<второй любой набор символов>)
#define .<один любой набор символов>(par1)=<второй любой набор символов> Set<один любой набор символов>(par1,<второй любой набор символов>)
 
Aleksey Mavrin:

DoubleToString einfach überladen, wenn es die Zeichenkette "EMPTY_VALUE" zurückgibt sonst ::DoubleToString aufrufen

Ich verstehe das hier nicht.

 
Fast235:

Ich verstehe das hier nicht.

aber sonst

#define DoubleToString(value,digits)  (value!=EMPTY_VALUE?DoubleToString(value,digits):"EMPTY_VALUE") 
 
Aleksey Mavrin:

aber sonst

in einem seltenen Fall die Quelle erstellen und löschen, damit Sie sie nicht mehr sehen)


wenn der Puffer ein Indikatorpuffer wäre, könnten Sie ihn durch EMPTY_VALUE ersetzen

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

aber die Anzahl der Puffer ist unbekannt
 

Nachmittags. Ich versuche, einen Stop-Loss-Wert aus dem atr-Indikator an meinen EA anzuhängen. Die Eingabevariablen sind wie folgt.

  extern   ENUM_TIMEFRAMES   PeriodForWork_sl        =  PERIOD_H4;           // ТФ РАСЧЁТА ЗНАЧЕНИЙ СТОП ЛОСА ПО АТР
  extern double sl= 14; // ПЕРИОД АТR СТОП ЛОССА

Ich füge die Atr-Werte zu einer Variablen für einen Stop-Loss hinzu.

sl=iATR( NULL,PeriodForWork_sl,sl,1);// ПОЛУЧЕНИЕ ЗНАЧЕНИЙ АТР ДЛЯ ВЫСТАВЛЕНИЯ СТОПЛОССА

Dann versuche ich, Aufträge wie diesen zu öffnen.


OrderSend(Symbol(),OP_BUY,lot,Ask,slippages,Bid-sl*Point,Bid+tp*Point,"ДИВЕРГЕНЦИЯ НА БАЙ АО"); // ОТКРЫВАЕМ БАЙ ОРДЕР

Aber nichts funktioniert. Ich drucke den Wert der Stop-Loss-Variable aus, aber sie sagt, dass ihr Wert 0 ist. Was mache ich falsch und wo muss ich nachbessern, damit es funktioniert?