Fehler, Irrtümer, Fragen - Seite 2635

 

Ist diese Plattform (MT5) für den Handel auf den Finanzmärkten konzipiert oder ist sie ein Zirkus? Was müssen wir jedes Mal tun, wenn wir die Codes für Ihre Aktualisierungen neu erstellen müssen? Ich habe es satt.

 
Aleksandr Prishenko:

Ist diese Plattform (MT5) für den Handel auf den Finanzmärkten konzipiert oder ist sie ein Zirkus? Was müssen wir jedes Mal tun, wenn wir die Codes für Ihre Aktualisierungen neu erstellen müssen? Ich habe es satt.

hmm....

Was genau müssen Sie überarbeiten? Vielleicht muss ich das auch?

Ich glaube nicht, dass ich etwas gegen Updates unternommen habe.........

 
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   4
//--- plot Value
#property indicator_label1  "Volume;Volume1"
#property indicator_type1   DRAW_FILLING
#property indicator_color1  clrBlue,clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot Middle
#property indicator_label2  "Middle line"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrMediumOrchid
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot OverBought
#property indicator_label3  "Bands upper"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDeepPink
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- plot OverSold
#property indicator_label4  "Bands lower" //нижняя линия
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrDeepPink
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
//---
enum OSCILLATOR_NAME {
   MACD,             // MACD
   MOMENTUM,         // Momentum
   RSI,              // RSI
   MFI,               // MFI 
   AC                // AC
};
//---
enum LEVEL_MODE {
   CONST_VALUE_MODE, // Constant level value mode
   MA_MODE,          // Moving Average mode
   BB_MODE           // Bollinger Bands Mode
};
//---
enum DRAW_MODE {
   LINE,             // Line
   FILLING,          // Filling
   HISTOGRAM         // Histogram
};
//--- input parameters
input ENUM_TIMEFRAMES      TF_Oscillator = PERIOD_CURRENT;                        // TIMEFRAMES Oscillator
input OSCILLATOR_NAME      InpOscillator = MACD;                         // Oscillator
input int                  InpOscPeriod1 = 1;                          // MACD Fast EMA / Period for: RSI,MFI,Momentum 
input int                  InpOscPeriod2 = 34;                           //  MACD Slow EMA
input int                  InpOscPeriod3 = 1;                           //  MACD Signal
input ENUM_APPLIED_PRICE   InpAppliedPrice = PRICE_CLOSE;               // Applied price
input  ENUM_APPLIED_VOLUME InpVOLUME = VOLUME_TICK;                    //Applied Volume for MFI
input DRAW_MODE            InpDrawMode = LINE;                       // Draw Mode 
input int                  InpLevelsPeriod = 40;                        // Levels Period Upper
input int                  InpLevelsPeriod1 = 35;                        // Levels Period  Lower
input double               InpLevelsIndent = 3.0;                       // Deviation Upper
input double               InpLevelsIndent1 = 4.0;                       //  Deviation Lower

 LEVEL_MODE           InpLevelsMode = BB_MODE;                     // Levels Mode
bool                 InpIndentAutoCorrection = true;              // Levels Auto Correction
//input string               InpDivider = "---For Stochastic or MACD---"; // Just Divider NOT Parameter 
//input ENUM_STO_PRICE       InpStochPrice = STO_LOWHIGH;                 // Stochastic Price

//--- indicator buffers
double         ExtBuffer1[]; //Line
double         ExtBuffer2[];//Middle
double         ExtBuffer3[];//Upper
double         ExtBuffer4[];//Lowe
double         ExtBuffer5[];
double         ExtBuffer6[];
//--- global variables
int            oscPeriod1;
int            levelsPeriod;
int            levelsPeriod1;
int            minRequiredBars;
int            oscHandle;
int            oscPeriod2;
int            oscPeriod3;
double         midValue;
double         addValue;
double         levelsIndent,levelsIndent1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//---
   if ( InpOscPeriod1 < 1 ) {
      oscPeriod1 = 14;
      printf("Incorrected input parameter InpOscPeriod1 = %d. Indicator will use value %d.", InpOscPeriod1, oscPeriod1);
   } else {
      oscPeriod1 = InpOscPeriod1;
   }
   
   if ( InpLevelsPeriod < 1 ) {
      levelsPeriod = 10;
      printf("Incorrected input parameter InpLevelsPeriod = %d. Indicator will use value %d.", InpLevelsPeriod, levelsPeriod);
   } else {
      levelsPeriod = InpLevelsPeriod;
   }
   if ( InpLevelsPeriod1 < 1 ) {
      levelsPeriod = 10;
      printf("Incorrected input parameter InpLevelsPeriod = %d. Indicator will use value %d.", InpLevelsPeriod, levelsPeriod);
   } else {
      levelsPeriod1 = InpLevelsPeriod1;
   }
   
   if ( InpOscPeriod2 < 1 ) {
      oscPeriod2 = 3;
      printf("Incorrected input parameter InpOscPeriod2 = %d. Indicator will use value %d.", InpOscPeriod2, oscPeriod2);
   } else {
      oscPeriod2 = InpOscPeriod2;
   }
   
   if ( InpOscPeriod3 < 1 ) {
      oscPeriod3 = 3;
      printf("Incorrected input parameter InpOscPeriod3 = %d. Indicator will use value %d.", InpOscPeriod3, oscPeriod3);
   } else {
      oscPeriod3 = InpOscPeriod3;
   }
   
   levelsIndent = MathAbs(InpLevelsIndent);// Levels Indent / Deviation
   levelsIndent1 = MathAbs(InpLevelsIndent1);// Levels Indent / Deviation
//---
   minRequiredBars = 20; // oscPeriod1 + oscPeriod2 + oscPeriod3 + levelsPeriod - 1;
//--- indicator buffers mapping
   SetIndexBuffer(0, ExtBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, ExtBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, ExtBuffer4, INDICATOR_DATA);
   SetIndexBuffer(4, ExtBuffer5, INDICATOR_DATA);
   SetIndexBuffer(5, ExtBuffer6, INDICATOR_DATA);
//---
   string shortname = "Oscillator For BBS: ";
//---
   switch ( InpOscillator ) {
 
      case MACD:
         oscHandle = iMACD(_Symbol, TF_Oscillator, oscPeriod1, oscPeriod2, oscPeriod3, InpAppliedPrice);
         midValue = 0.0;
         shortname += "MACD (" + (string)oscPeriod1 + ", " + (string)oscPeriod2 + ", " + (string)oscPeriod3 + ")";
         break;
         
      case MOMENTUM:
         oscHandle = iMomentum(_Symbol, TF_Oscillator, oscPeriod1, InpAppliedPrice);
         midValue = 100.0;
         levelsAutoCorrect(0.03, 5.0, 0.5);
         shortname += "Momentum (" + (string)oscPeriod1 + ")";
         break;
         
      case RSI:
         oscHandle = iRSI(_Symbol, TF_Oscillator, oscPeriod1, InpAppliedPrice);
         midValue = 50.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "RSI (" + (string)oscPeriod1 + ")";
         break;
      case MFI:
         oscHandle = iMFI(_Symbol, TF_Oscillator, oscPeriod1, InpVOLUME);
         midValue = 50.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "MFI (" + (string)oscPeriod1 + ")";
         break;
         
       case AC:
         oscHandle = iAC(_Symbol,0);
         midValue = 0.0;
         levelsAutoCorrect(5.0, 50.0, 20.0);
         shortname += "AC";
         break; 
               
      default:
         oscHandle = INVALID_HANDLE;
         Print("Unknown Oscillator!");
         return(-1);
   }
//---
   switch ( InpDrawMode ) {
      case FILLING:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_FILLING);
         break;
         
      case HISTOGRAM:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_COLOR_INDEX);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_COLOR_HISTOGRAM2);
         break;
         
      case LINE:
      default:
         SetIndexBuffer(2, ExtBuffer3, INDICATOR_DATA);
         PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
         break;
   }
//---
   IndicatorSetString(INDICATOR_SHORTNAME, shortname); 
//---
   return(0);
}
//+------------------------------------------------------------------+
//| Levels indent / deviation correction function                    |
//+------------------------------------------------------------------+
void levelsAutoCorrect(double minIndent, double maxIndent, double correctIndent)
 {
//---
   if ( InpLevelsMode == BB_MODE ) {
      if ( levelsIndent > 4.0   ) {
         levelsIndent = 2.0;
         printf("Incorrected deviation input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent);
      }
      if ( levelsIndent1 > 4.0  ) {
         levelsIndent1 = 2.0;
         printf("Incorrected deviation input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent1);
      }
   } else {
      if ( levelsIndent < minIndent || levelsIndent > maxIndent ) {
         levelsIndent = correctIndent;
         printf("Incorrected indent input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent);
      }
      
      if ( levelsIndent1 < minIndent || levelsIndent1 > maxIndent ) {
         levelsIndent1 = correctIndent;
         printf("Incorrected indent input parameter InpLevelsIndent = %f. Indicator will use value %f.", 
            InpLevelsIndent, levelsIndent1);
      } 
      
   }
//---
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
   int startBar, calculated, toCopy;
//---
   if ( rates_total < minRequiredBars ) {
      Print("Not enough bars for calculation.");
      return(0);
   }
//---
   calculated = BarsCalculated(oscHandle);
   if ( calculated < rates_total ) {
      Print("Not all data of oscHandle is calculated (", calculated, " bars. Error #", GetLastError());
      return(0);
   }
//---
   if ( prev_calculated > rates_total || prev_calculated <= 0 ) {
      startBar = minRequiredBars;
      toCopy = rates_total;
   } else {
      startBar = prev_calculated - 1;
      toCopy = rates_total - prev_calculated;
      if ( prev_calculated > 0 ) {
         toCopy += 1;
      }
   }
//---
   if ( CopyBuffer(oscHandle, 0, 0, toCopy, ExtBuffer1) <= 0 ) {
      Print("Getting Oscillator is failed. Error #", GetLastError());
      return(0);
   }
//---
   if ( InpLevelsMode != CONST_VALUE_MODE ) { //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      SimpleMAOnBuffer(rates_total, prev_calculated, oscPeriod1+levelsPeriod, levelsPeriod, ExtBuffer1, ExtBuffer2);
   }
//---   
   for ( int bar = startBar; bar < rates_total; bar++ ) {
      double value, sum = 0.0, sum1 = 0.0;
      double middleLine, indent, indent1;
      //---
      switch ( InpLevelsMode ) {
         case MA_MODE:
            middleLine = ExtBuffer2[bar];
            indent = levelsIndent;
            indent1 = levelsIndent1;
            break;
         case BB_MODE:          //просмотреть формулу
            middleLine = value = ExtBuffer2[bar];
            for ( int i = bar - levelsPeriod + 1; i <= bar; i++ ) {
               sum += MathPow(ExtBuffer1[i]-value, 2);
            }
            indent = levelsIndent * MathSqrt(sum/levelsPeriod); 
            for ( int k = bar - levelsPeriod1 + 1; k <= bar; k++ ) {
               sum1 += MathPow(ExtBuffer1[k]-value, 2);
            }
            indent1 = levelsIndent1 * MathSqrt(sum/levelsPeriod1);            
            break;
         case CONST_VALUE_MODE:
         default:
            middleLine = ExtBuffer2[bar] = midValue;
            indent = levelsIndent;
            indent1 = levelsIndent1;
            break;
      }
      //---
      switch ( InpDrawMode ) {
         case LINE:
            ExtBuffer3[bar] = middleLine + indent; //Upper
            ExtBuffer4[bar] = middleLine - indent1; //Lowe
            break;
         case FILLING:
            ExtBuffer3[bar] = middleLine;
            ExtBuffer4[bar] = middleLine + indent;
            ExtBuffer5[bar] = middleLine - indent1;
            break;
         case HISTOGRAM:
            if ( ExtBuffer1[bar] >= ExtBuffer2[bar] ) {
               ExtBuffer3[bar] = 0;
            } else {
               ExtBuffer3[bar] = 1;
            }
            ExtBuffer4[bar] = middleLine;
            ExtBuffer5[bar] = middleLine + indent;
            ExtBuffer6[bar] = middleLine - indent1;
            break;
      }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+

Welche Art von Fehler tritt hier auf? Ich habe diese Art von Fehler seit einigen Builds nicht mehr gesehen.

         case BB_MODE:
            middleLine = value = ExtBuffer2[bar];
            for ( int i = bar - levelsPeriod + 1; i <= bar; i++ ) {
               sum += MathPow(ExtBuffer1[i]-value, 2);
2020.02.05 10:56:13.220 Core 1 2017.11.01 00:00:00 array out of range in 'Oscillator For BBS.mq5' (308,41)

 
Aleksandr Prishenko:

Was ist der Fehler hier? Ich habe einen solchen Fehler schon seit einigen Builds nicht mehr gesehen.

2020.02.05 10:56:13.220 Core 1 2017.11.01 00:00:00 array out of range in 'Oscillator For BBS.mq5' (308,41)

А... Ich verstehe...

Es hat wahrscheinlich nichts mit den Updates zu tun. Wir müssen herausfinden, warum.....

 
Vladislav Andruschenko:

А... Ich verstehe...

Nun, das hat wahrscheinlich nichts mit den Updates zu tun. Ich muss herausfinden, warum.....

Es funktioniert seit über 5 Jahren)) Der Code hat sich nicht geändert.)

 
Aleksandr Prishenko:

Es funktioniert seit über 5 Jahren)) Der Code hat sich nicht geändert)

Daraus ergibt sich keineswegs, dass die Fehler auf Plattform-Updates zurückzuführen sind. Sie sind nicht mehr in der Reihe.

 
Evgeny Potapov:

Hallo!

Ich möchte einige MT4 mit einer Batch-Datei ausführen.

Können Sie mir bitte sagen, wie man das macht und warum mein Code nicht funktioniert:

Im besten Fall läuft er ein paar MT4s und hängt sich dann auf.

Natürlich gibt es keinen Mangel an Arbeitsspeicher.

Außerdem habe ich es auf verschiedenen Computern ausprobiert

Ist der Schlüssel für den portablen Modus zufällig erforderlich?

Werden alle Terminals manuell gestartet?

 
Alexey Viktorov:

Roman, das ist schon das zweite Mal, dass Sie darauf hereinfallen, dass Sie nicht bereit sind, die Dokumentation zu lesen.

Und in der mql4-Dokumentation, wenn ich mich richtig erinnere, wurde klar gesagt, dass Variablen nicht als Array-Größe verwendet werden sollten.

Das ist zwar nicht ganz dasselbe, aber trotzdem danke für das Zitat aus den Unterlagen.

 
Koldun Zloy:

Ich bin kein Entwickler, aber ich werde mich dazu äußern.

Bei einem statischen Array muss der Compiler zur Kompilierungszeit eine bestimmte Anzahl von Bytes im Speicher zuweisen.

Wie viel Speicher sollte der Compiler zuweisen, wenn row und col zur Kompilierungszeit unbekannt sind?

Die Anfangswerte werden nur verwendet, wenn beim Aufruf keine Parameter angegeben werden. Die tatsächlichen Parameter sind erst zur Laufzeit bekannt.

Also, keine Spielereien, sondern die Sprache lernen.

Das hört sich gut an, danke, ich hatte den gleichen Gedanken im Kopf.
Die C-Beispiele sind genau das, woran ich mich orientiere.

int N, M;
int i, j;
scanf("%d", &N);
scanf("%d", &M);

int A[N][M];
for (i = 0; i < N; i++) { 
   for (j = 0; j < M; j++) {
      A[i][j] = 10 + rand() % (20 - 10 + 1);
      printf("%d ", A[i][j]);
   }
}

puts("\n");

Aber offenbar sind moderne Compiler strenger geworden.
Ich überprüfte diesen Code in VS und es beschwert sich auch von nicht zugewiesenen Array-Speicher.
Vielleicht ist dieses Beispiel für andere Compiler gedacht, oder ist es veraltet und hängt vom Sprachstandard ab?

 

Es gibt jetzt drei Symbole in der Kopfzeile der mql5.com-Seite neben dem Profil-Button:

1.Favoriten

2. füttern

3. Nachrichten

Bitte fügen Sie ein weiteres Symbol hinzu, etwa so:

4. Geld

wo der Betrag aller im Laufe des Tages eingegangenen Gelder (Markt, Freiberufler usw.) angezeigt werden würde, wäre das sehr praktisch, und jetzt muss man dafür zum Profil gehen, um den verfügbaren Saldo zu sehen.