Fehler, Irrtümer, Fragen - Seite 2270

 

Was ist der Unterschied?

SetIndexPuffer(1,WerteMalerei,INDICATOR_COLOR_INDEX);

и

PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);

?

Ich verdrehe den Code und kann nicht herausfinden, wie man den Mouwing einfärbt.

Wenn eine Farbe zunimmt und eine andere abnimmt.

Kann mir jemand ein Beispiel zeigen?

 
Vladimir Pastushak:

Ich habe den Code durchgespielt und kann nicht herausfinden, wie man den Mouwing einfärbt.

Wenn eine Farbe steigt, fällt eine andere.

Kann mir jemand ein Beispiel zeigen?

Ich lerne gerade MQL5, aber es sollte so aussehen:

//+------------------------------------------------------------------+
//|                                                         myMA.mq5 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Red
#property indicator_label1  "Red"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot Blue
#property indicator_label2  "Blue"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//--- input parameters
input int      PeriodMA=10;
//--- indicator buffers
double         RedBuffer[];
double         BlueBuffer[];
int handleMA;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ArraySetAsSeries(RedBuffer,true);
   ArraySetAsSeries(BlueBuffer,true);
   SetIndexBuffer(0,RedBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,BlueBuffer,INDICATOR_DATA);
   handleMA=iMA(NULL,0,PeriodMA,0,MODE_SMA,PRICE_CLOSE);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   int i,limit;
   double ma[];
   if(prev_calculated==0) limit=rates_total-2; else limit=rates_total-prev_calculated;
   for(i=limit;i>=0;i--)
     {
      CopyBuffer(handleMA,0,i,2,ma);
      if(ma[0]<ma[1])
        {
         RedBuffer[i]=ma[0]; BlueBuffer[i]=EMPTY_VALUE;
        }
      else
        {
         BlueBuffer[i]=ma[0];RedBuffer[i]=EMPTY_VALUE;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Ein Kompilierungsfehler:
template<typename T>
void f( T& ) {}
void g1() { class A {} a; f( a ); } //(1)//нормально 
void g2() { class A {} a; f( a ); } //(2)//Error: '&' - parameter conversion not allowed

Was ist der grundlegende Unterschied zwischen (1) und (2)? Warum liegt in einem Fall ein Fehler und im anderen Fall ein normaler Fehler vor?

 
A100:

Und was ist der grundlegende Unterschied zwischen (1) und (2)? Warum liegt in einem Fall ein Fehler vor und im anderen Fall eine normale Situation?

So können Klassen innerhalb von Funktionen denselben Namen, aber unterschiedliche Inhalte haben. Bei der zweiten Variante ist die Signatur f nicht eindeutig.

Nach der ersten wird sie definiert. Und nach dem zweiten Mal wird sie nicht mit demselben Namen neu definiert.

 
Vladimir Pastushak:

Was ist der Unterschied?

SetIndexPuffer(1,WerteMalerei,INDICATOR_COLOR_INDEX);

и

PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);

?

Ich verdrehe den Code und kann nicht herausfinden, wie man den Mouwing einfärbt.

Wenn eine Farbe zunimmt und eine andere abnimmt.

Kann mir jemand ein Beispiel zeigen?

//+------------------------------------------------------------------+
//|                                                      ColorMA.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property description "Colored Moving Average"
#property indicator_chart_window
#property indicator_buffers 2    // Всего буферов 2 - рисуемый буфер и буфер цвета
#property indicator_plots   1    // Один рисуемый буфер
//--- plot ClrMA
#property indicator_label1  "Colored MA"
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrBlue,clrRed,clrDarkGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- input parameters
input uint                 InpPeriod         =  14;            // Период расчёта
input ENUM_MA_METHOD       InpMethod         =  MODE_SMA;      // Метод расчёта
input ENUM_APPLIED_PRICE   InpAppliedPrice   =  PRICE_CLOSE;   // Цена расчёта
//--- indicator buffers
double         BufferMA[];       // Рисуемый буфер
double         BufferColors[];   // Буфер цвета
//--- global variables
int            period;
int            handle_ma;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- set global variables
   period=int(InpPeriod<1 ? 1 : InpPeriod);
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMA,INDICATOR_DATA);            // Рисуемый буфер
   SetIndexBuffer(1,BufferColors,INDICATOR_COLOR_INDEX); // Буфер цвета
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Colored MA");
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(BufferMA,true);
   ArraySetAsSeries(BufferColors,true);
//--- create MA's handles
   ResetLastError();
   handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,InpMethod,InpAppliedPrice);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл iMA(",(string)period,") ",EnumToString(InpAppliedPrice),". Ошибка: ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка и расчёт количества просчитываемых баров
   if(rates_total<fmax(period,4)) return 0;  // три бара и меньше в расчёт не берём
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      /*
      Почему больше 1. Например, загрузилась история, и разница будет больше одного.
      Если все нормально, то разница rates_total-prev_calculated равна или 0, или 1
      0 - пришел новый тик, новый бар формироваться не начал.
      1 - пришел новый тик и начал формироваться новый бар
      */
      limit=rates_total-2; // rates_total - это Bars для текущего символа и периода
                           // Если не требуется проверять в цикле расчёта i+число, то limit=rates_total-1 (чтобы не вылететь за пределы массива), 
                           // иначе, если требуется проверять, например, i+period, то limit=rates_total-period-1
      ArrayInitialize(BufferMA,EMPTY_VALUE);
      ArrayInitialize(BufferColors,2);
     }
//--- Подготовка данных - в данном случае это и есть расчёт МА - копирование в буфер её значений из хэндла
   int count=(limit>1 ? rates_total : 1);       // если новый бар, то копируем всю доступную историю, иначе - только один текущий
   int copied=CopyBuffer(handle_ma,0,0,count,BufferMA);
   if(copied!=count) return 0;   // Если скопировать не удалось - выходим до следующего тика

//--- Установка цвета линии
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // Тут всё просто: 
      // У нас задано три цвета: #property indicator_color1  clrBlue,clrRed,clrDarkGray
      // 1. если МА на текущем баре выше чем МА на прошлом, то цвет под номером 0
      // 2. если МА на текущем баре ниже чем МА на прошлом, то цвет под номером 1
      // 3. иначе - цвет под номером 2 (в блоке инициализации в строке 86 задаётся этот цвет начальным для отображения линии, что, впрочем делать там не обязательно)
      BufferColors[i]=(BufferMA[i]>BufferMA[i+1] ? 0 : BufferMA[i]<BufferMA[i+1] ? 1 : 2);
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ich habe Ihnen ein etwas ungeschicktes Beispiel per E-Mail geschickt (ich habe die Copy-Paste-Fehler nicht korrigiert)

 
fxsaber:

So können Klassen innerhalb von Funktionen denselben Namen, aber unterschiedliche Inhalte haben. Bei der zweiten Variante ist die Signatur f nicht eindeutig.

Hier ist alles gleich geblieben... und es funktioniert

#define  CLASS \
class A { \
public: \
        void f( int i ) { Print( i ); } \
        int a; \
}
void g1() { CLASS a; a.f( 1 ); }
void g2() { CLASS a; a.f( 2 ); }
void OnStart()
{
        g1();
        g2();
}

Das vorherige Beispiel in C++ funktioniert... so dass die Unterschriften dort irgendwie aussortiert werden.

 
Ein Kompilierungsfehler:
void OnStart()
{
        struct A1 { int i; }; //(1)
        struct B1 : A1 {};    //(2)
        class  A2 { int i; }; //(3)
        class  B2 : A2 {};    //(4)//Error: 'B2' - struct undefined
}

Was ist der grundlegende Unterschied zwischen (1)(2) und (3)(4)?

 
Es gibt einen Fehler im Zigarrenservice. Wenn Sie die Hebelwirkung ändern, zeigt es das Gegenteil an. Wenn Sie ihn zum Beispiel von 1:500 auf 1:100 ändern, wird angezeigt, dass die Hebelwirkung von 1:100 auf 1:500 geändert wurde. Ich muss etwas dagegen tun... )
 
A100:

Hier ist alles dasselbe... und es funktioniert.

Die Situation hier ist also völlig anders - es gibt keine Vorlage.

Das vorherige Beispiel funktioniert in C++... die Unterschriften werden also irgendwie dort erledigt

Was gibt C++ hier preis?

template<typename T>
void f( T& ) { Print(__FUNCSIG__); }
void g1() { class A { int i; } a; f( a ); }
void g2() { class A { double d; } a; f( a ); }

Damit es in MQL5 funktioniert, sollte die Ausgabe zwei verschiedene Zeichenketten enthalten, nicht dieselbe. Aber der Mechanismus zur Erzeugung von Signaturen muss in diesem Fall ganz anders aussehen. Wenn C++ das gleiche Ergebnis in print erzeugt, sinkt der __FUNCSIG__-Wert drastisch.

 

Worauf lässt sich das folgende Verhalten zurückführen

Der Indikator "Kompilieren" funktioniert richtig, der Indikator "Erneut kompilieren" funktioniert nicht richtig. Funktioniert es im Testgerät korrekt?