エラー、バグ、質問 - ページ 2635

 

このプラットフォーム(MT5)は、金融市場での取引用に設計されているのか、それともサーカスなのか?あなたのアップデートのために、いちいちコードをやり直さなければならないのですか?もう、うんざりです。

 
Aleksandr Prishenko:

このプラットフォーム(MT5)は、金融市場での取引用に設計されているのか、それともサーカスなのか?あなたのアップデートのために、いちいちコードをやり直さなければならないのですか?もう、うんざりです。

ふむ

具体的に何を見直せばいいのか、私もそうかもしれません。

アップデートについては何もしていないつもりなのですが・・・・・・・。

 
#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 array out of range in 'Oscillator For BBS.mq5' (308,41)

 
Aleksandr Prishenko:

このようなエラーは、何度かビルドしていますが、見たことがありません。

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)

А...なるほど...。

まあアップデートとは関係ないんでしょうけど。その理由を考えなければならない......。

 
Vladislav Andruschenko:

А...なるほど...。

まあ、アップデートとは関係ないんでしょうけど。理由を考えなければ......。

5年以上使えています))コードは変わっていない)

 
Aleksandr Prishenko:

5年以上使えています))コードは変更されていません)

プラットフォームのアップデートによるエラーというのは全く成り立ちませんね。アレイから 外れる

 
Evgeny Potapov:

こんにちは。

バッチファイルでMT4を動かしたいのですが、どうすればいいですか?

どうすればいいのか、なぜ私のコードがうまくいかないのか、教えてください。

せいぜいMT4が数台動く程度で、あとはハングアップしてしまう。

もちろん、RAMが不足することはありません。

さらに、異なるPCで試したところ

ひょっとして、ポータブルモードキーが必要なのでしょうか?

全端末を手動で起動するのでしょうか?

 
Alexey Viktorov:

ローマン、あなたがドキュメントを 読もうとしない基本的な姿勢に引っかかったのはこれで2度目です。

また、記憶が正しければ、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のページヘッダーで、プロフィールボタンの横に3つのアイコンが表示されるようになりました。

1.お気に入り

2.フィード

3.メッセージ

もう一つ、こんな感じのアイコンを追加してください。

4.お金

その日のうちに受け取ったすべての資金(マーケット、フリーランスなど)の金額が表示されれば、とても便利なのに、今はそのためにプロフィールから利用可能残高を確認しなければならない。