错误、漏洞、问题 - 页 2635

 

这个平台(MT5)是为金融市场交易设计的,还是一个马戏团?每次我们都要为你的更新重做代码,我们要怎么做?我已经厌烦了。

 
Aleksandr Prishenko:

这个平台(MT5)是为金融市场交易设计的,还是一个马戏团?每次我们都要为你的更新重做代码,我们要怎么做?我已经厌烦了。

hmm....

你到底需要修改什么? 也许我也需要?

我不认为我已经做了什么更新.........。

 
#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);
}
//+------------------------------------------------------------------+

这里有什么错误? 我已经有好几次没有看到这种错误了。

         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 'Oscillator For BBS.mq5'中的数组超出了范围(308,41) 。

 
Aleksandr Prishenko:

这里的错误是什么? 我已经有好几个版本没有看到这样的错误了。

2020.02.05 10:56:13.220 Core 1 2017.11.01 00:00:00 'Oscillator For BBS.mq5'中的数组超出了范围(308,41) 。

А...我明白了...

嗯,这可能与更新没有关系。必须弄清楚为什么.....

 
Vladislav Andruschenko:

А...我明白了...

嗯,这可能与更新没有关系。必须弄清楚为什么.....

它已经工作了5年多))。代码并没有改变)。

 
Aleksandr Prishenko:

它已经工作了5年多))。代码并没有改变)

这完全不能说明这些错误是由于平台更新造成的。你已经离开了这个阵列

 
Evgeny Potapov:

你好!

我想用一个批处理文件来运行一些MT4。

请告诉我如何做,为什么我的代码不起作用。

它最多只能运行几个MT4,然后就挂了。

当然,也不乏有RAM的存在。

此外,我在不同的电脑上试了一下

是否需要便携式模式的钥匙?

它是否手动启动所有终端?

 
Alexey Viktorov:

罗曼,这是你第二次上当,因为你基本不愿意阅读文档

而在mql4文档中,如果我没记错的话,它明确指出变量不应该被用作数组大小。

不太一样,但还是要感谢你引用了文档的内容。

 
Koldun Zloy:

我不是一个开发者,但我要发表意见。

对于静态数组,编译器必须在编译时在内存中分配一定数量的字节。

如果在编译时row和col是未知的,编译器应该分配多少内存?

初始值只在调用时省略参数的情况下使用。实际参数只有在运行时才知道。

因此,不搞噱头,学习语言。

这听起来差不多,谢谢你,我心里也有同样的想法。
C的例子正是我的指导思想。

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");

但显然,现代编译器已经变得更加严格。
我在VS中检查了这段代码,它也抱怨说有未分配的阵列内存。
也许这个样本是为其他编译器准备的,或者它已经过时了,取决于语言标准?

 

现在在mql5.com页面标题中,有三个图标,紧挨着个人资料按钮。

1.收藏

2.饲料

3.留言

请添加另一个图标,类似的东西。

4.奖金

当天收到的所有资金(市场、自由职业者等)的数额将被显示出来,这将是非常方便的,而现在你必须到个人资料中去看可用的余额。

原因: