Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 553

 
Vitalii Ananev:

Anstelle von Close[2] setzen Sie den Indikatorwert auf den zweiten Balken (z.B. iRSI(.......,2) ) und anstelle von Close[1] setzen Sie den Indikatorwert auf den ersten Balken. Und uroven ist der Wert des Levels.

Und den Rest haben Sie bereits oben erfahren.

Ich danke Ihnen.
 
Können Sie mir sagen, ob jemand eine Seite Volumen des Tages auf der rechten Seite des Charts für mt5 gesehen hat, für mt4 fand ich es hier https://www.mql5.com/ru/code/9777. Ich habe zwei Varianten: entweder die Variablen umschreiben oder eine fertige finden. Oder ich sehe keinen Sinn in der Bestellung,,,,,,, , ich muss eine Gleichgewichtstheorie ,,,, überprüfen. Ich fand eine Arbeit für mt5, wo das Profil des gestrigen Tages auf der linken Seite gezeichnet wird, aber es gibt einen wichtigen Nachteil, es zeichnet nicht, was heute passiert. Ich möchte also dem Chartmuster Informationen von der rechten Seite hinzufügen, was im Moment des Handels geschieht
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • Stimmen: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina:

Voraussetzung:


ProfitSellDBL wird hier berechnet

Gewinn_Upgr = 0,01

Tral_Start__Upgr wird mit einer externen Variablen vom Typ int gleichgesetzt und ist gleich 5.

Tral_Size__Upgr ist ebenfalls gleich 4

TV - Tick-Wert, =10

SummeLotSellDBL = 0,04

Ich habe es gelesen. Ich sah, wie es funktionieren würde, wenn Tral_Start__Upgr, Tral_Size__Upgr und ihre externen Variablen als double definiert wären. D.h. wenn alles vom gleichen Typ ist, ohne Konvertierung und Datenverlust. Das Ergebnis ist das gleiche. Was habe ich falsch gemacht?
 
Maria Baburina:
Lesen. Ich sah, wie es funktionieren würde, wenn Tral_Start__Upgr, Tral_Size__Upgr und ihre externen Variablen als double definiert wären. D.h. wenn alles vom gleichen Typ ist, ohne Konvertierung und Datenverlust. Das Ergebnis ist das gleiche. Was habe ich falsch gemacht?

Ein Blinder spricht mit einem Gehörlosen. Wenn Sie wollen, dass jemand es testet, brauchen Sie so wenig Code wie möglich, der auf einem anderen Rechner kompiliert und getestet werden kann. Kein Code - nichts, worüber man reden könnte.

Hinzugefügt: Debugging verwenden(Debugging):

-Vorkonfiguration

-Haltestellen

-Start derFehlersuche

-ObservierbareAusdrücke

-Stapelansicht aufrufen

-SchrittweiseFehlersuche

-Anhalten, Fortsetzen und Beenden der Fehlersuche

-HistorischeFehlersuche

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

comp, 2016.04.03 18:21

Laufzeitfehler

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    SetIndexBuffer(0, this.Buffer);
  }
};

CLASS* Class;

void OnInit( void )
{
  Class = new CLASS;
    
  delete Class;

  Class = new CLASS;

  Class.Buffer[0] = 0; // array out of range
  
  delete Class;
  
  return;
}

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 vier Fällen hat es gut funktioniert! In fünf Fällen ist es eine Katastrophe. Ist dies eine weitere architektonische Einschränkung im Vergleich zu Quad? Geben Sie mir einen Link zu einer Diskussion über dieses Thema, ich konnte ihn selbst nicht finden.


 
Verstehe ich das richtig, dass Sie den Indikatorpuffern erst nach dem ersten Aufruf von OnCalculate durch das Terminal selbst (nicht manuell) etwas zuweisen können?
 
comp:
Verstehe ich das richtig, dass den Indikatorpuffern erst nach dem ersten Aufruf des Terminals (nicht manuell) OnCalculate etwas zugewiesen werden kann?

Auf Indikatorpuffer kann zugegriffen werden, nachdem OnCalculate() aufgerufen wurde. Gleichzeitig sollte der Indikatorpuffer selbst im Bereich der globalen Variablen deklariert werden:

//+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   1
#property  indicator_type1   DRAW_COLOR_HISTOGRAM
#property  indicator_color1  Green,Red
#property  indicator_width1  2
#property  indicator_label1  "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int    ExtFastSMAHandle;
int    ExtSlowSMAHandle;
//--- bars minimum for calculation
#define  DATA_LIMIT 37
 

Ich glaube, ich habe gefunden, wonach ich gesucht habe, aber die Altertümlichkeit des Codes gibt einen Fehler

Helfen Sie mir, es zu reparieren ......, wenn es nicht zu viel Mühe macht.

und wenn Sie mir helfen können, es auf die rechte Seite des Bildschirms zu drehen, wäre das großartig.

Dateien:
 
Karputov Vladimir:

Auf die Indikatorpuffer kann zugegriffen werden, nachdem OnCalculate() aufgerufen wurde.

Wie sich herausstellt, liegen Sie falsch. Sie können sich nur bewerben, wenn das Terminal OnCalculate aufruft. In diesem Fall ist die Bedingung in MT4 flexibler, da es genügt, OnCalculate nur einmal aufzurufen. Aber in MT5, müssen Sie für den Aufruf von OnCalculate durch das Terminal selbst jedes Mal nach dem SetIndexBuffer warten. Proof

#property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
  #property indicator_plots 1
#endif   

#ifdef __MQL5__
  #define TRUE true
  #define FALSE false
#endif   

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    ::SetIndexBuffer(0, this.Buffer);
  }

  #define  TIMESERIES(X)                                                  \
     ::ArraySetAsSeries(X, TRUE);                                        \
     Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);  

  static int FullOnCalculate( void )
  {
    int Spread[];
    long RealVolume[];
    
    int Size = INT_MAX;
    
    #ifdef __MQL4__
      const int bars = ::Bars;
    #endif

    #ifdef __MQL5__
      const int bars = ::Bars(::Symbol(), ::Period());
    #endif

     TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
    #ifdef __MQL4__
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
    #endif

    #ifdef __MQL5__
      datetime Time[];
      double Open[];
      double High[];
      double Low[];
      double Close[];
      long TickVolume[];
  
      TIMESERIES(Time)
      TIMESERIES(Open)
      TIMESERIES(High)
      TIMESERIES(Low)
      TIMESERIES(Close)
      TIMESERIES(TickVolume)
    
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
    #endif    
  }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_CHART_CHANGE)
  {
    Print(__FUNCTION__);
    
    ::OnDeinit();
    
    ::Class = new CLASS;
        
  if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
  return;
}

void OnDeinit( const int Reason = 0 )
{
  if (::CheckPointer(::Class) == POINTER_DYNAMIC)
    delete ::Class;

  return;
}

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[] )
{  
  Print(__FUNCTION__);  

  if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE;
  
  if (::CheckPointer(::Class) != POINTER_INVALID)
    ::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!

  return(rates_total);
}

In MT4 funktioniert dieser Indikator ohne Probleme, in MT5 stürzt er mit einem Fehler ab. Wie sich herausstellte, müssen Sie in MT4 nur auf den ersten Aufruf von OnCalculate durch das Terminal warten und mit den Puffern tun, was Sie wollen, einschließlich ihrer Neudefinition mit SetIndexBuffer. Aber in MT5 muss man nach JEDEM SetIndexBuffer auf den ersten Aufruf von OnCalculate durch das Terminal warten.

Diese Funktion ist nirgends dokumentiert. Und es scheint nicht der Definition eines "Anfängers" zu entsprechen.

Können wir davon ausgehen, dass dieses Verhalten in MT5 genauso sein wird wie in MT4? D.h. nach dem ersten Aufruf von OnCalculate durch das Terminal selbst wäre es möglich, SetIndexBuffer ohne Probleme aufzurufen?

 
comp:

Wie sich herausstellt, liegen Sie falsch. Sie können ihn nur aufrufen, wenn OnCalculate vom Terminal selbst aufgerufen wird. In diesem Fall ist die Bedingung in MT4 flexibler, da Sie OnCalculate nur einmal aufrufen müssen. Aber in MT5, müssen Sie für den Aufruf von OnCalculate durch das Terminal selbst jedes Mal nach dem SetIndexBuffer warten. Proof

In MT4 funktioniert dieser Indikator ohne Probleme, in MT5 stürzt er mit einem Fehler ab. Wie sich herausstellte, müssen Sie in MT4 nur auf den ersten Aufruf von OnCalculate durch das Terminal warten und dann mit den Puffern tun, was Sie wollen, einschließlich ihrer Neudefinition mit SetIndexBuffer. Aber in MT5 muss man nach JEDEM SetIndexBuffer auf den ersten Aufruf von OnCalculate durch das Terminal warten.

Diese Besonderheit ist nirgends dokumentiert. Und es scheint nicht der Definition eines "Anfängers" zu entsprechen.

Können wir davon ausgehen, dass dieses Verhalten im MT5 genauso sein wird wie im MT4? D.h. nach dem ersten Aufruf von OnCalculate durch das Terminal selbst wird es möglich sein, SetIndexBuffer ohne Probleme aufzurufen?

Lassen Sie sich nicht auf Geschwätz ein - der Aufruf von OnCalculate impliziert natürlich einen Aufruf durch das Terminal selbst, denn
Die Funktion OnCalculate() wird nur in benutzerdefinierten Indikatoren aufgerufen, wenn es notwendig ist, die Indikatorwerte durch das EreignisCalculate zuberechnen. Dies geschieht in der Regel, wenn ein neuer Tick für das Symbol, für das der Indikator berechnet wird, empfangen wird. Der Indikator muss nicht mit einem Preisdiagramm dieses Symbols verbunden sein.