Fehler, Irrtümer, Fragen - Seite 936

 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

Oben Code des Indikators Spread_of_symbols ... Ich beschloss, es neu zu schreiben, damit es schneller funktioniert.... und der Code erschien, siehe unten ... Daten werden nicht kopiert ... wenn Sie Daten von 1 bis 0 in den Code kopieren, zeichnet der Indikator sehr schnell, aber ein Out-of-Range-Fehler auftritt ... was ist falsch in den Code siehe unten ...?

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) 
      to_copy++;   
     }
   if(CopyRates(symbol1,0,0,to_copy,rates1)<=0)
     {
      Print("Данные по первому символу не скопированы, ошибка  ",GetLastError());
      return(0);
     }
   if(CopyRates(symbol2,0,0,to_copy,rates2)<=0)
     {
      Print("Данные по второму символу не скопированы, ошибка ",GetLastError());
      return(0);
     }
   if(prev_calculated<rates_total)
     {
     int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
   for(int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return(rates_total);
  }
 
FinEngineer:
Siehe MQL5-Referenzhandbuch / Zugriff auf Zeitreihen und Indikatoren / Organisieren des Datenzugriffs
 
FinEngineer: aber der Fehler "out of range" wird angezeigt...was ist falsch im Code siehe unten...?
Prüfen Sie, ob die Werte von to_copy und limit übereinstimmen.
 
Im Visualisierungsmodus werden beim Handel mit zwei Symbolen nach dem gleichzeitigen Schließen von Geschäften nur die Daten des Symbols, auf dem der Expert Advisor läuft, in der Historie angezeigt. Die Daten des anderen Symbols gelangen erst nach der Eröffnung weiterer Geschäfte in die Registerkarte "Historie". Infolgedessen gibt es einen Zeitraum, in dem die Daten auf den Registerkarten "Handel" und "Historie" unterschiedlich sind.
 
JF 0 Trades 19:31:10 '***': cancel order #3694236 buy stop 1.10 AUDJPY.m at 95.679<br / translate="no">DS 0 Trades 19:31:10 '***': cancel order #3694238 buy limit 1.10 AUDJPY.m at 93.876
DH 0 Trades 19:31:10 '***': storniere Order #3694237 buy stop 0.36 AUDJPY.m bei 95.679
FI 0 Trades 19:31:10 '***': storniere Order #3694239 Kauflimit 0.36 AUDJPY.m bei 93.876
FP 0 Trades 19:31:10 '***': cancel order #3694236 buy stop 1.10 AUDJPY.m at 95.679 done
QE 0 Trades 19:31:11 '***': storniere Auftrag #3694238 Kauflimit 1.10 AUDJPY.m bei 93.876 erledigt
CG 0 Trades 19:31:11 '***': storniere Auftrag #3694237 buy stop 0.36 AUDJPY.m bei 95.679 erledigt
OL 0 Trades 19:31:11 '***': storniere Auftrag #3694239 Kauflimit 0.36 AUDJPY.m bei 93.876 erledigt

Vier ausstehende Aufträge wurden dem Protokoll zufolge offenbar schnell gelöscht. Aber onTradeTransaction, die Antworten kamen in etwa 15 Sekunden, Ticks wurden in diesem Zeitraum kommen.

KH 0 prp5 (EURUSD.m,M1) 19:31:23 TS=6 cancel sl _ OnTrade PENDING id=84 m=3 b/s=SELL Err=Order done
***

JG 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete tp _ OnTrade PENDING id=85 m=3 b/s=SELL Err=Bid completed
***
RL 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete sl _ OnTrade PENDING id=86 m=3 b/s=SELL Err=Bid completed
***

HK 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete tp _ OnTrade PENDING id=87 m=3 b/s=SELL Err=Order executed

Allerdings gibt es auch hier etwas Merkwürdiges

IE 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 =O= Deal close/reverse price=95.648 m=3 b/s=SELL ... ==>Zeitpunkt vor OrderSendAsync
ES 0 prp5 (EURUSD.m,M1) 19:31:29 TS=6 case 8(real) m=3 b/s=SELL Err=Order placed ==>After OrderSendAsync, 3 sec scheint zu lang zu sein.

P.S. Sieht aus, als gäbe es Verzögerungen bei der Ausführung von Expert, obwohl ich mich frage, wie lange Pakete für OnTradeTransaction in der Warteschlange bleiben können.

 
fyords:

Aus der Referenz:

MQL5 Referenz / Standardbibliothek / Klassen zur Erstellung von Panels und Dialogen / CWnd / StateFlagsSet

Welche Eigenschaften?

StateFlagsSet nicht Eigenschaften, sondern Zustand. Eine Gruppenmethode zur Änderung des Zustands. Die oben genannten Methoden zur Änderung einzelner Statuskennzeichen.

Separat zu verwenden.

 

Wenn man sich die "Datenzugangsorganisation" ansieht, sich das Beispielskript ansieht, das die Daten aufpumpt, und alles verstanden hat, ergeben sich folgende Fragen:

1. Warum kann ich diesen Code nicht in den Indikator in der Funktion OnInit schreiben, so dass der Indikator beim Start seine eigene Historie herunterlädt und die Zeitreihe vorbereitet? Kann ich einen solchen Scheck in meinem Expert Advisor ausstellen?

2. Wie oft muss ich diese Prüfung durchführen? 1 für Expert Advisors und 2 für Indikatoren? Wenn ich die Historie und die Zeitreihen nur einmal zum Kopieren vorbereite, werden dann in Zukunft keine Fehler beim Kopieren auftreten? Oder muss ich jedes Mal oder von Zeit zu Zeit überprüfen, ob der Verlauf und die Zeitreihen bereit sind?

3) Ist diese Prüfung nur für Indikatoren und Expert Advisors erforderlich, die mehrere Zeitrahmen und Symbole verwenden, oder ist sie für alle wünschenswert?

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Swap-Prozesse sind asynchron und der Indikator darf nicht auf Daten warten. Daher ist es möglich, in inite abzufragen, auf keinen Fall zu warten oder zu verlangsamen und nur in oncalculate die Verfügbarkeit und Anzahl zu prüfen.

Bitte beachten Sie, dass der Indikator nicht warten oder in einer Schleife laufen darf, da er sonst die Berechnung nachfolgender Indikatoren unterbricht.
 
Renat:
Swap-Prozesse sind asynchron und der Indikator darf nicht auf Daten warten. So können Sie im inite abfragen, auf keinen Fall warten oder verlangsamen und erst im oncalculate die Verfügbarkeit und Anzahl prüfen.

Bitte beachten Sie, dass der Indikator nicht warten oder in einer Schleife laufen darf, da er sonst die Berechnung nachfolgender Indikatoren unterbricht.

1 Wo kann ich die Daten dann auslagern? Wenn ich einen Indikator mit einem Korb von Währungspaaren und vielen Symbolen erstellen möchte, muss ich für jedes von ihnen die Daten überprüfen und austauschen... sollte ich ein Skript aus dem Indikator heraus ausführen? Warum sollte ein Indikator die Berechnungen der nachfolgenden Indikatoren zunichte machen? In den nächsten Indikatoren reicht es aus, die Berechnung des vorherigen Indikators durch BarsCalculated(indicator1_Handle) zu überprüfen, zu berechnen und die Daten herunterzuladen, oder liege ich da falsch?

2 Eine andere Frage, einer anderen Art - wenn ich Indikator-Handle in der Funktion deklariere, beginnt es zu zählen? Oder beginnt die Zählung, bevor ich einen Befehl zum Kopieren gebe?