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

 
evillive:

Warum sollte es eine zusätzliche Variable geben? Die direkte Kontrolle funktioniert gut:

Eine Variable sollte angelegt werden, wenn Sie den Wert einer Funktion an verschiedenen Stellen im Programm sehen wollen, damit Sie sie nicht mehrmals aufrufen müssen.
Die Variable soll das Verständnis für Neueinsteiger erleichtern. Ist jetzt klar, wofür sie gedacht ist?
 
Vinin:
Schauen Sie öfters vorbei. Es wird weniger Fragen geben. Es wird ein besseres Wissen geben.
Ignorieren.
 

Guten Tag. Sie müssen eine Position am Ende des Tages irgendwie schließen (rein Expert Advisor; tägliche Balken). Die Modellierung erfolgt entweder durch Öffnungen oder durch Zecken. D.h. wir geben uns entweder mit Eröffnungen zufrieden oder stolpern über den Kopf, wenn wir versuchen, die vergangenen Tage auf einem 15-Minuten-Zeitrahmen zu analysieren und den Anfang und das Ende des aktuellen Tages zu erfassen. Gibt es Lösungen für dieses Problem? Ich sehe mehrere virtuell-hypothetische Optionen:

1) Hacking - Schließen einer Position zu einem beliebigen Preis und zu einem beliebigen Zeitpunkt. Nehmen wir an, das wäre unfair, aber wir könnten die Position einfach zum gewünschten Preis schließen, ohne sie zu verderben.

2) Simulation des Öffnens und Schließens innerhalb eines Taktes. D.h. erst ein Tick Open, dann ein Tick Close.

3) Festlegung eines Auftrags, der zu einem bestimmten Zeitpunkt (z. B. am Ende des Tages) automatisch geschlossen wird.

Für jede Hilfe wären wir dankbar. Ich danke Ihnen.

 

Ein Fehler?

int OnInit()
  {
   int subwindow = ChartWindowFind(ChartID(),WindowExpertName());
   Print("Подокно запрашиваемого индикатора: ",subwindow);
   
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }


2015.04.13 20:51:10.710 indi AUDJPY,H1: Angeforderter Indikator-Unterrahmen: -1


 
tuner:

Ein Fehler?


2015.04.13 20:51:10.710 indi AUDJPY,H1: Angeforderter Indikator-Unterrahmen: -1


Nein, das ist kein Fehler.

Rückgabewert.

Nummer des Teilfensters im Erfolgsfall. Null zeigt das Hauptdiagrammfenster an. Gibt im Falle eines Fehlers -1 zurück.

 
AlexeyVik:

Nein, das ist kein Fehler.


Welcher Fehler tritt auf, wenn der Funktion die ID des aktuellen Diagramms, auf dem der Indikator läuft, und der Name des aktuellen Indikators, der auf dem aktuellen Diagramm läuft, übergeben wird?
 
tuner:
Was ist der Fehler, wenn die Funktion die ID des aktuellen Charts, auf dem der Indikator läuft, und den Namen des aktuellen Indikators, der auf dem aktuellen Chart läuft, übergibt?

Wenn ich Sie richtig verstehe und Sie die Nummer des Unterfensters benötigen, in dem Ihr beigefügter Indikator-Testcode funktioniert, dann ist es aufgrund der Beschreibung der Funktion besser, ihre zweite Version anzuwenden.

Testcode (ich habe einige Zeilen zu Ihrem Code hinzugefügt):

#define  LINE    __LINE__,": "
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   int subwindow=ChartWindowFind(ChartID(),WindowExpertName());
   Print(LINE,"Подокно запрашиваемого индикатора: ",subwindow);
   
   int subwindow1=ChartWindowFind();
   Print(LINE,"Подокно запрашиваемого индикатора: ",subwindow1);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+

In der Hilfe zur Funktion ChartWindowFind() gibt es noch ein gutes Beispiel zu diesem Thema (auch in Form von Kommentaren):

//+------------------------------------------------------------------+
//| Сообщает номер окна графика с указанным индикатором              |
//+------------------------------------------------------------------+
int GetIndicatorSubWindowNumber(long chartID=0,string short_name="")
  {
   int window=-1;
//--- 
   if((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE)==PROGRAM_INDICATOR)
     {
      //--- функция вызвана из индикатора,имя не требуется
      window=ChartWindowFind();
     }
   else
     {
      //--- функция вызвана из эксперта или скрипта
      window=ChartWindowFind(0,short_name);
      if(window==-1) Print(__FUNCTION__+"(): Error = ",GetLastError());
     }
//---
   return(window);
  }
 
DiPach:

Wenn ich Sie richtig verstehe und Sie die Nummer des Unterfensters benötigen, in dem Ihr beigefügter Indikator-Testcode funktioniert, dann ist es aufgrund der Beschreibung der Funktion besser, ihre zweite Version anzuwenden.

Testcode (ich habe einige Zeilen zu Ihrem Code hinzugefügt):

Die Hilfe der Funktion ChartWindowFind() enthält ein gutes Beispiel zu diesem Thema (auch in Form von Kommentaren):

Danke für den Tipp, aber ich habe eine etwas andere Aufgabe, bei der die Verwendung der 2. Variante der Funktion keinen Sinn macht: Ich möchte die Anzahl der Indikatoren mit einem bestimmten Namen in allen offenen Terminal-Charts zählen. Die Aufgabe wurde bereits gelöst, aber ich wollte den resultierenden Code mitChartWindowFind() der ersten Variante vereinfachen, aber es stellte sich heraus, dass diese Funktion nicht nur mit anderen Fenstern, sondern auch mit dem aktuellen Fenster nicht funktioniert.
 

Guten Abend!

Ich kann es nicht verstehen: In der Startfunktion verlangt der Compiler "return" - die Funktion muss einen Wert zurückgeben".

Welcher Wert muss in diesem Fall zurückgegeben werden?

int start()
{
if (Orders!=0||Ord > 0)
{
CritCloseBuy();
CritCloseSell();
}
else
{
CritOpen();
}
return;
}

Könnte dies der Grund sein, warum OrderClose() keine offene Position sieht?

 
rapid_minus:

Guten Abend!

Ich kann es nicht verstehen: In der Startfunktion verlangt der Compiler "return" - die Funktion muss einen Wert zurückgeben".

Welcher Wert muss in diesem Fall zurückgegeben werden?

int start()

Kann dies der Grund sein, warum OrderClose() keine offene Position sieht?

make void start() und es wird kein Fehler auftreten