Fehler, Irrtümer, Fragen - Seite 1699

 
Karputov Vladimir:
Man kann nicht jeden falschen Programmierstil auf Bugs schieben.

Was für eine Überraschung ist das?! Ich weise auf einen offensichtlichen Fehler hin und bekomme diesen Blödsinn über "Stil".

Ich bin von A100 und Meat so weit entfernt wie der Mond. Sie zeigen einem Fehler, obwohl ich sie nicht verstehe. Aber ich werde meinen "Stil" nicht an den Tisch bringen.

 
fxsaber:
Das funktioniert nicht.

Hier ist der vollständige Code:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
//if(handle!=INVALID_HANDLE)
   if(prev_calculated!=0)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
         Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

und einen Ausdruck:

2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 18992.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 12498.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       
... экономия бумаги :)
2016.09.23 12:34:31.804 2 (SBRF-12.16,M1)       
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 5343.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 17815.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #4 OnDeinit
Dateien:
2.mq5  3 kb
 
Karputov Vladimir:

Hier ist der vollständige Code:

und einen Ausdruck:

Bei mir funktioniert es nicht - ich komme nicht einmal bis OnDeinit.

Und beachten Sie, dass meine Zahlen im Protokoll übereinstimmen, Ihre aber nicht. Mein Logbuch

PP      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
FE      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 13573.0
IQ      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 13573.0
CF      0       12:41:08.169    Test3 (RTS-12.16,H1)    
JO      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
QI      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 25434.0
NM      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 25434.0
MJ      0       12:41:08.169    Test3 (RTS-12.16,H1)    
DJ      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
QO      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 9469.0
HK      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 9469.0
CM      0       12:41:08.187    Test3 (RTS-12.16,H1)    
JF      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
OS      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 1887.0
NG      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 1887.0
Ich habe nicht einen einzigen Indikator oder EA in meinem Terminal laufen.
 
fxsaber:

Bei mir funktioniert es nicht - ich komme nicht einmal bis OnDeinit.

Und beachten Sie, dass meine Zahlen im Protokoll übereinstimmen, Ihre aber nicht. Mein Logbuch

Ich habe keinen Indikator oder Expert Advisor in meinem Terminal laufen.

Ich habe diese Konfiguration:

2016.09.23 12:25:34.874 Terminal        MetaTrader 5 x64 build 1430 started (MetaQuotes Software Corp.)
2016.09.23 12:25:34.876 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 2446 / 8077 Mb, HDD: 40118 / 233310 Mb, GMT+02:00
2016.09.23 12:25:34.876 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

(Nach dem Neustart der Thermik, Registerkarte Log, erste drei Zeilen)

 
Karputov Vladimir:

Ich habe diese Konfiguration:

(Nach dem Neustart der Thermik, Registerkarte Log, erste drei Zeilen)

2016.09.23 12:42:22.405 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.09.23 12:42:22.405 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700 K  @ 3.50 GHz, RAM: 8098 / 16301 Mb, HDD: 6387 / 30000 Mb, GMT+02:00
2016.09.23 12:42:22.405 Terminal        BCS Broker MetaTrader 5 Terminal x64 build 1430 started (BCS Broker)
 
fxsaber:

Zweideutig. Auf einem x32-Rechner:

2016.09.23 13:23:55.052 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
2016.09.23 13:23:55.052 Terminal        Windows 10 Home (X86 based PC), IE 11.00, UAC, Intel Atom  Z3740 @ 1.33 GHz, RAM: 607 / 1931 Mb, HDD: 20500 / 49784 Mb, GMT+02:00
2016.09.23 13:23:55.049 Terminal        MetaTrader 5 build 1430 started (MetaQuotes Software Corp.)


Funktioniert nicht.

 
Andrey Barinov:
Sie "fallen aus", aber beim Versuch, sie aufzurufen, tritt ein Kompilierungsfehler auf.

Ich brauche das nicht, ich versuche, viel zu tun, um mein Leben in Zukunft einfacher zu machen.

Ich habe mein Problem auf diese Weise in der übergeordneten alle protec und erben geht unter protec dann überschreiben zu überwinden.

 
Karputov Vladimir:

Zweideutig. Auf einem x32-Rechner:


Funktioniert nicht.

Der Antrag ist gestellt, auch wenn ich es leid bin, ihn so oft zu stellen.
 
fxsaber:

Wie erkenne ich meinen Handle auf einem Chart in einem Indikator?ChartIndicatorName ist nicht geeignet, da es einen kurzen Namen liefert. Und mit demselben Namen kann bereits derselbe Indikator mit anderen Eingabeparametern ausgeführt werden.

Ich muss in der Lage sein, den Indikator aus dem Diagramm und den Berechnungen zu entfernen.

Vielleicht haben Sie es schon herausgefunden, aber ich werde es für alle Fälle klarstellen. Das Handle des Indikators ist eigentlich nur der Verweis auf die Beschreibung des Indikators innerhalb des Programms, das ihn erstellt hat (d.h. Expert Advisor, Indikator, Skript), wir können es als eine Art "Nummer" betrachten. Das bedeutet, dass diese "Zahl" keine Bedeutung außerhalb des Programms hat, das den Indikator erstellt hat (das seinen Handle erhalten hat). Auch das Programm, das die Funktion ChartIndicatorGet() aufruft, erhält kein globales Indikator-Handle, sondern erstellt nur die Beschreibung dieses Indikators und weist seine "Nummer" zur Adressierung zu. Es gibt keinen globalen Indikatorgriff, der für das gesamte Terminal eindeutig ist.

Die Verwendung von Kurznamen ist in den Beispielen zu sehen. Sie können dies tun:

   string short_name="unknown ma";
   switch(InpMAMethod)
     {
      case MODE_EMA :  short_name="EMA";  break;
      case MODE_LWMA : short_name="LWMA"; break;
      case MODE_SMA :  short_name="SMA";  break;
      case MODE_SMMA : short_name="SMMA"; break;
     }
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");

Dadurch wird das Problem " derselbeIndikatorwurde bereits mit anderen Eingabeparameternausgeführt " gelöst.

Und visuell ist es klarer, welcher Indikator funktioniert:


 
Anton:

Vielleicht haben Sie es schon herausgefunden, aber ich werde es für alle Fälle klarstellen. Der Indikator-Handle ist eigentlich nur eine Adresse für die Beschreibung des Indikators innerhalb des Programms, das ihn erstellt hat (d.h. Expert Advisor, Indikator, Skript), wir können ihn als eine Art "Nummer" betrachten. Das bedeutet, dass diese "Zahl" keine Bedeutung außerhalb des Programms hat, das den Indikator erstellt hat (das seinen Handle erhalten hat). Auch das Programm, das die Funktion ChartIndicatorGet() aufruft, erhält kein globales Indikator-Handle, sondern erstellt nur die Beschreibung dieses Indikators und weist seine "Nummer" zur Adressierung zu. Es gibt keinen globalen Indikator-Handle, der für das gesamte Terminal eindeutig ist.

Sie können die Verwendung von ShortName in den Beispielen sehen. Sie können das so machen:

Damit wird das Problem " derselbeIndikatorwurde bereits mit anderen Eingabeparameternausgeführt " gelöst.

Und visuell ist es einfacher zu verstehen, welcher Indikator funktioniert:

Danke, so ähnlich hat es mir stringo vor einiger Zeit erklärt. Ich habe mehrere Möglichkeiten gefunden, um festzustellen, dass der Griff zu "mir" gehört:

  1. Ich ändere den Extremwert des Indikatorpuffers und vergleiche ihn mit dem entsprechenden CopyBuffer-Wert. Wenn sie übereinstimmt, ist es "ich". Das ist die Idee hinter dem Indikator "nicht löschbar".
  2. Ich ändere ShortName und vergleiche mit ChartIndicatorName.