Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 650

 
AlexeyVik:

Nach meinem Verständnis muss er Objektparameter aus einem anderen Diagramm abrufen.

Wenn aus einem anderen Diagramm, lassen Sie ihn die Funktionsvariante mit dem Diagramm-Identifikator verwenden.

auch kein Problem.

 
sergeev:

Wenn es aus einem anderen Diagramm stammt, lassen Sie es eine Funktionsvariante mit einem Diagrammbezeichner verwenden.

auch kein Problem.

Absolut richtig, aber ich habe noch keinen Diagrammbezeichner verwenden müssen und bin nur theoretisch damit vertraut, deshalb habe ich die Möglichkeit vorgeschlagen, Objekte dem aktuellen Diagramm zuzuordnen.
 
rov_kvn:



Das ist großartig! Das war genau der Punkt. Danke, liebe Genossin!
 
sergeev:

Wenn es aus einem anderen Diagramm stammt, lassen Sie es eine Funktionsvariante mit einem Diagrammbezeichner verwenden.

Auch das ist kein Problem.


Wie ich es verstehe, sind die einzigen Optionen ObjectGetDouble() für Preis und ObjectGetInteger() für Datum in meinem Fall.

Ich versuche, den Preis in der aktuellen TF mit chart_id = 0 zu erhalten

double price1 = ObjectGetDouble(0,"Supply",3);

- Wert, wie er sein sollte. Ich habe beide IDs und Werte von hier https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes anstelle von 0 ausprobiert, aber es gibt 0 zurück.

 
.roman.:

Wie ich es verstehe, sind die einzigen Optionen ObjectGetDouble() für Preis und ObjectGetInteger() für Datum in meinem Fall.

Ich versuche, den Preis in der aktuellen TF mit chart_id = 0 zu erhalten

- Wert, wie er sein sollte. Ich habe beide IDs und Werte von hier https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes anstelle von 0 ausprobiert, aber es gibt 0 zurück.

chart_id = 0 ist nicht die TF, sondern das aktuelle Diagramm. Sie müssen die chart_id für das Diagramm finden, das das gewünschte Objekt enthält. Das habe ich nicht getan, weil es vorübergehend unnötig war.
 
.roman.:

Wie ich es verstehe, sind die einzigen Optionen ObjectGetDouble() für Preis und ObjectGetInteger() für Datum in meinem Fall.

Ich versuche, den Preis im aktuellen TF mit chart_id = 0 zu ermitteln.

double price1 = ObjectGetDouble(0,"Supply",3);


Was ist 3?



- Der Wert ist so, wie er sein sollte. Ich habe beide IDs und Werte von hier https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes anstelle von 0 ausprobiert, aber es gibt 0 zurück.

Was haben die TF-Perioden mit chart_id zu tun?


Sie haben eine unrealistische Vorstellung davon, was zu verwenden ist.


Beschreiben Sie Ihr Problem, werden Sie nicht zu undeutlich und um den heißen Brei herum.

Was benötige ich, um Daten von einem Objekt abzurufen?

- ObjectGet Warum hat es Ihnen nicht gefallen?

 
sergeev:

Was ist 3?


Der Preiswert der unteren Grenze des Rechtecks. https://docs.mql4.com/constants/objectconstants/enum_object_property


Was haben die TF-Perioden mit der Chart-ID zu tun?

Ich habe keine Ahnung wie. Deshalb versuche ich, es selbst zu tun und zu fragen, da ich gescheitert bin.

sergeev:
Beschreiben Sie Ihre Aufgabe, tappen Sie nicht im Dunkeln und tasten Sie nicht herum. was genau brauchen Sie? holen Sie Daten von einem Objekt? - ObjectGet Was stimmt damit nicht?

Fragen Sie das ernsthaft? Ich habe bereits 3 Mal geschrieben, dass ich Rechteckdaten (2 Preiskoordinaten und zwei Zeitkoordinaten, die zum Aufbau von Rechtecken verwendet werden) von zwei anderen Zeitrahmen (H4 und D) erhalten muss, während ich mich im dritten (H1) befinde.

ObjectGet ist nicht geeignet, da es nichts aus einem anderen Zeitrahmen empfangen kann.

Der Indikator zeichnet Rechtecke auf allen Timeframes und ich habe einen Code hinzugefügt, der die Rechteckkoordinaten anderer Timeframes überträgt, ohne auf diese umzuschalten. Ich weiß nicht, wie ich es anders erklären soll.

 
.roman.:

Der Wert des Preises der unteren Grenze des Rechtecks. https://docs.mql4.com/constants/objectconstants/enum_object_property



Ich habe keine Ahnung wie. Deshalb versuche ich es mit Bauchgefühl und Fragen, weil es nicht funktioniert hat.

Fragen Sie das ernsthaft? Ich habe bereits 3 Mal geschrieben, dass ich Rechteckdaten (2 Preiskoordinaten und zwei Zeitkoordinaten, um Rechtecke zu erstellen) von zwei anderen Zeitrahmen (H4 und D) erhalten muss, während ich mich im dritten (H1) befinde.

ObjectGet ist nicht geeignet, weil ich damit nichts aus einem anderen Zeitrahmen holen kann.

Es zeichnet Rechtecke auf allen Timeframes und ich füge Code hinzu, mit dem es die Koordinaten von Rechtecken anderer Timeframes weitergibt, ohne zu ihnen zu wechseln.

Verstehen Sie einfach, dass ein anderer Zeitrahmen und ein anderer Chart oder ein anderes Diagramm unterschiedliche Konzepte und dementsprechend auch unterschiedliche Lösungsansätze darstellen.
 
AlexeyVik:
Verstehen, dass eine andere TF und ein anderes Diagramm oder eine andere Grafik unterschiedliche Konzepte und damit unterschiedliche Lösungsansätze sind.

Ich bin also nur dann bereit, jede Lösung zu verstehen und zu akzeptieren, wenn ich Ideen habe. Deshalb bitte ich um Ratschläge, wie man sie umsetzen kann.
 
Top2n:

Ich danke Ihnen! Verstanden. Nur ist bei dem OrderSelect-Fehler nicht klar, wie man aufhören kann, außer umfortzufahren.

Gelöschte späte Nachricht, hat fast das Gleiche getan wie beschrieben.

Manchmal können Sie Rückgabewert und Fehlerzeichen kombinieren. Wann ist es sinnvoll, einen bestimmten Wert als Zeichen für einen Fehler zu betrachten? Zum Beispiel ist ein Durchschnittspreis von 0.

Sobald OrderSelect() dann ein Fehlerzeichen zurückgibt, gibt unsere Funktion sofort ein Fehlerzeichen zurück:

#property strict

/******************************************************************************/
double CenaUsrednenija(const int type,const int Magic){
  double nn = 0, bb = 0;

  for(int i = OrdersTotal() - 1; i >= 0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if(OrderSymbol() == Symbol() && OrderType() == type && OrderMagicNumber() == Magic)
      {
        double op = OrderOpenPrice();
        double llot = OrderLots();

        bb += op * llot;
        nn += llot;
        Print("  type = ", type, " Цена открытия = ", op, " Лот = ", llot, " itog = op * llot = ", op * llot, " factb = bb / nn = ", bb / nn);
      }
    } else {
      return 0; // Цена == 0 - признак ошибки (OrderSelect() не смогла выбрать ордер)
    }
  }

  return nn != 0 ? NormalizeDouble(bb / nn, _Digits) : 0; // Делить на 0 не следует
}

/******************************************************************************/
void OnStart() {
  Print("CenaUsrednenija(OP_BUY, 536525) = ", CenaUsrednenija(OP_BUY, 536525));
}

Wenn ich es alleine mache, habe ich es:

23:32:03 Script 1 EURUSD,H1: loaded successfully
23:32:03 1 EURUSD,H1: initialized
23:32:03 1 EURUSD,H1:   type = 0 Цена открытия = 1.36626 Лот = 0.1 itog = op * llot = 0.136626 factb = bb / nn = 1.36626
23:32:03 1 EURUSD,H1:   type = 0 Цена открытия = 1.36931 Лот = 0.1 itog = op * llot = 0.136931 factb = bb / nn = 1.367785
23:32:03 1 EURUSD,H1: CenaUsrednenija(OP_BUY, 536525) = 1.36779
23:32:03 1 EURUSD,H1: uninit reason 0
23:32:03 Script 1 EURUSD,H1: removed

Es scheint wahr zu sein...

Ja, ich habe keinen bedingten Ausdruck in Print() verwendet, um eine hypothetische Division durch 0 zu vermeiden, weil dieses Print() ein Debugging-Ausdruck ist...