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

 
Roman:

Es ist notwendig, im Voraus zu überlegen, wie der Code auf der Ebene des Speichers, der Initialisierung und der Wertrückgabe ausgeführt wird.

Sie müssen nicht darüber nachdenken, es gibt Handbücher für diese Dinge, und es gab noch nie ein Handbuch für die Speicherzuweisung in MQL, nur Nachrichten von Entwicklern, und oft mit einer Klarstellung, dass sich die Implementierung ändern kann

Ok, die Diskussion läuft darauf hinaus, wer welches Programmierbuch liest, ich lese es seit der High School und ich lese es immer noch in den letzten 30 Jahren.

 
Igor Makanu:

Sie müssen nicht darüber nachdenken, es gibt Handbücher für diese Dinge, und es gab noch nie ein Handbuch für die Speicherzuweisung in MQL, nur Nachrichten von Entwicklern, und oft mit einer Klarstellung, dass sich die Implementierung ändern kann

Ok, die Diskussion läuft darauf hinaus, wer welches Programmierbuch liest, ich lese es seit der High School und ich lese es immer noch in den letzten 30 Jahren

Natürlich müssen Sie nicht darüber nachdenken, warum sollten Sie auch... Der Compiler erledigt das ganz von selbst. ))
C# ist nicht C

Und schauen Sie sich das Video auf __inline an.
Dort wird erklärt, wie Funktionen im Speicher für diejenigen funktionieren, die keinen Unterschied machen.

 
Vladimir Karputov:

Zeichnen Sie zunächst ein Bild und geben Sie an, was für Sie der "Null-Balken" für einen Indikator mit dem Shift-Parameter ist.

Gezeichnet. Der Null-Balken wird durch eine vertikale Linie hervorgehoben.


 
RickD:

Gezeichnet. Der Null-Balken wird durch eine vertikale Linie hervorgehoben.


Beispiel-Code:

//+------------------------------------------------------------------+
//|                                        iMA Values on a Chart.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//--- input parameters
input int                  Inp_MA_ma_period     = 12;          // MA: averaging period
input int                  Inp_MA_ma_shift      = 5;           // MA: horizontal shift
input ENUM_MA_METHOD       Inp_MA_ma_method     = MODE_SMA;    // MA: smoothing type
input ENUM_APPLIED_PRICE   Inp_MA_applied_price = PRICE_CLOSE; // MA: type of price
//---
int    handle_iMA;                           // variable for storing the handle of the iMA indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iMA
   handle_iMA=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double array_ma[];
   ArraySetAsSeries(array_ma,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iMA,0,start_pos,count,array_ma))
      return;

   string text="";
   for(int i=0; i<count; i++)
      text=text+IntegerToString(i)+": "+DoubleToString(array_ma[i],Digits()+1)+"\n";

   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+

Ergebnis:


Wie Sie sehen können, ist es ohne weitere Eingriffe kopierbar.

Dateien:
 
Vladimir Karputov:

Beispiel-Code:

Ergebnis:


Wie Sie sehen können, wird es einfach kopiert, ohne Tamburin.

Beispiel-Code. Basierend auf einem Indikator. Der Indikator ist mit der Zuweisung von Pufferspeicher beschäftigt.

#property copyright "Copyright 2019"
#property link      ""
#property version   "1.00"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0

//---

input int                  MA_period = 12;
input int                  MA_shift = 5;
input ENUM_MA_METHOD       MA_method = MODE_SMA;
input ENUM_APPLIED_PRICE   MA_applied_price = PRICE_CLOSE;

int start_pos = 0;

//---

double MA_Calc_Buf[];

int hMA = INVALID_HANDLE;


int OnInit()
{
  SetIndexBuffer(0, MA_Calc_Buf, INDICATOR_CALCULATIONS); 
  ArraySetAsSeries(MA_Calc_Buf, true);
 
  hMA = iMA(NULL, 0, MA_period, MA_shift, MA_method, MA_applied_price);   
  if (hMA == INVALID_HANDLE)
  {
    int LErr = GetLastError();
    PrintFormat("iMA create failed (%d)", LErr);
    return (INIT_FAILED);
  }
 
  return (INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
  if (hMA != INVALID_HANDLE)
  {
    IndicatorRelease(hMA);
    hMA = INVALID_HANDLE;
  }
}

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[])
{ 
  int copied;
  copied = CopyBuffer(hMA, 0, start_pos, rates_total, MA_Calc_Buf);
  if (copied == -1)
  {
    int LErr = GetLastError();
    PrintFormat("CopyBuffer(hMA) failed (%d)", LErr);
    return (prev_calculated);
  }
 
  if (copied == 0)
  {
    PrintFormat("CopyBuffer(hMA) copied 0 bars");
    return (prev_calculated);
  } 
 
  string text = "";
  for (int i=0; i<15; i++)
    text = text + IntegerToString(i) + ": " + DoubleToString(MA_Calc_Buf[i], Digits()+1) + "\n";
 
  Comment(text);

  return (rates_total);
}

Wenn start_pos = 0 ist, befindet sich der Wert, der dem 0. Balken des Diagramms entspricht, an Position 5. 1.017041 Er befindet sich auf Position 0 in Ihrem EA. Gut.


Aber ich muss diesen Wert an der Nullposition erhalten.

Ich stelle start_pos = 5 ein. Ich erhalte nicht das gewünschte Ergebnis. Der Wert, den ich suche, befindet sich wiederum an Position 5.


Ich setze start_pos = -5. Ich erhalte nicht das gewünschte Ergebnis. Auch hier ist der Wert, den ich suche, an Position 5 zu finden.


Ich stelle start_pos = -10 ein. Und erst jetzt erhalte ich das gewünschte Ergebnis.


 
RickD:

Beispiel-Code. Basierend auf dem Indikator. Der Indikator ist mit der Zuweisung von Pufferspeicher beschäftigt.

Wenn start_pos = 0 ist, wird der Wert, der dem 0. Balken des Diagramms entspricht, an Position 5 angezeigt. 1.017041 In Ihrem EA steht er auf Position 0. Gut.


Aber ich muss diesen Wert an der Nullposition erhalten.

Ich stelle start_pos = 5 ein. Ich erhalte nicht das gewünschte Ergebnis. Der Wert, den ich suche, befindet sich wiederum an Position 5.


Ich setze start_pos = -5. Ich erhalte nicht das gewünschte Ergebnis. Auch hier ist der Wert, den ich suche, an Position 5 zu finden.


Ich stelle start_pos = -10 ein. Und erst jetzt erhalte ich das gewünschte Ergebnis.


Wir müssen den Unterschied zwischen der Arbeit des Expert Advisors und der des Indikators verstehen. Für die Arbeit mit dem Indikator verwenden Sie das Beispiel aus der Hilfe(iMA).

Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov:

Sie müssen den Unterschied zwischen der Arbeit mit einem EA und einem Indikator verstehen. Um mit einem Indikator zu arbeiten, verwenden Sie das Beispiel aus der Hilfe(iMA).

Sie nehmen also ein Beispiel aus der iMA-Hilfe und fügen Folgendes hinzu

   ArraySetAsSeries(iMABuffer, true);
   comm = (string)DoubleToString(iMABuffer[0], Digits());
   ArraySetAsSeries(iMABuffer, false);

   Comment(comm);   

und stellen Sie sicher, dass sich der Wert um genau ma_shift of bars vom Ausgabewert Ihres EAs unterscheidet.

Ich, auf der anderen Seite, müssen in den Indikator in iMABuffer[0] den Wert erhalten, wie Sie in Ihrem Expert Advisor in array_ma[0] haben.

Zumindest im Moment können wir sehen, dass das Verhalten von CopyBuffer für Expert Advisors und Indikatoren unterschiedlich ist. Wenn Sie den Unterschied zwischen CopyBuffer bei der Arbeit mit einem EA und einem Indikator verstehen, geben Sie bitte den entsprechenden Abschnitt in der Dokumentation an, den Sie studieren möchten.

 

Ich werde versuchen, die Frage zu vereinfachen. Wie bekomme ich diese MA-Werte (ausgehend von der roten vertikalen Linie und nach links) in den Puffer des Indikators? Können Sie ein Beispiel schreiben?


 
RickD:

Ich werde versuchen, die Frage zu vereinfachen. Wie bekomme ich diese MA-Werte (ausgehend von der roten vertikalen Linie und nach links) in den Puffer des Indikators? Können Sie ein Beispiel schreiben?


Im Screenshot ist die Pufferanzeige um fünf Balken nach rechts verschoben. Um den fünften Balken des Indikatorpuffers (Index 4) und weiter links in der Liste zu erhalten, woher sollen wir sie nehmen? Von Puffer[4] und weiter nach links.

Theoretisch. In der Praxis habe ich den Indikatorcode schon lange nicht mehr geöffnet oder mit ihm gearbeitet - fast ein Jahr... Probieren Sie es aus.

 
Artyom Trishkin:


Theoretisch. In der Praxis habe ich den Indikatorcode schon lange nicht mehr geöffnet oder mit ihm gearbeitet - fast ein Jahr... Probieren Sie es aus.

Du kannst eine Fähigkeit nicht verlieren.

Grund der Beschwerde: