グローバル初期化に失敗した!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ページ 2

 

No problem, angevogeur

コードは元々このようなものでした。

int init()
  {
      // Check for input errors
      if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively.");
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1.");
         }
      }
      
      IndicatorShortName("White Wolf Custom Software Moving Averages Indicator");
      
//---- indicators
      SetIndexStyle(0,DRAW_LINE);
      SetIndexBuffer(0,EMABuffer1);
      SetIndexStyle(1,DRAW_LINE);
      SetIndexBuffer(1,EMABuffer2);
      SetIndexStyle(2,DRAW_LINE);
      SetIndexBuffer(2,EMABuffer3);
      SetIndexStyle(3,DRAW_LINE);
      SetIndexBuffer(3,SMABuffer);
   
      SetIndexEmptyValue(0,0.0);
      SetIndexEmptyValue(1,0.0);
      SetIndexEmptyValue(2,0.0);
      SetIndexEmptyValue(3,0.0);
//----

      // MA Period Buttons
      MA_Display_Time_Frame = Period(); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
      ResetLastError();
      Alert("In init() - Calling CreateMAPeriodButtons()");
      CreateMAPeriodButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
         
      ResetLastError();
      Alert("In init() - Calling CreateDismissSignalButtons()");
      CreateDismissSignalButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
      
      ResetLastError();
      Alert("In init() - Calling SetPeriodButtonState()");
      SetPeriodButtonState();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
   
   // Set normalization factor for current currency pair
   if ((Digits == 4) || (Digits == 5))
         NormalizationFactor = 0.0001;
      else
         NormalizationFactor = 0.01;
   
   return(0);
  }

void deinit()
  {
      Alert("In de-init() - getting ready to delete objects ");
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_LABEL);
      Alert("In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString(GetLastError()));
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_BUTTON);
      Alert("In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString(GetLastError()));

return(0);
 }

私はそれを単純にこのように修正しました。

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int OnInit()
  {
      // Check for input errors
      if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively.");
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1.");
         }
      }
      
      IndicatorShortName("White Wolf Custom Software Moving Averages Indicator");
      
//---- indicators
      SetIndexStyle(0,DRAW_LINE);
      SetIndexBuffer(0,EMABuffer1);
      SetIndexStyle(1,DRAW_LINE);
      SetIndexBuffer(1,EMABuffer2);
      SetIndexStyle(2,DRAW_LINE);
      SetIndexBuffer(2,EMABuffer3);
      SetIndexStyle(3,DRAW_LINE);
      SetIndexBuffer(3,SMABuffer);
   
      SetIndexEmptyValue(0,0.0);
      SetIndexEmptyValue(1,0.0);
      SetIndexEmptyValue(2,0.0);
      SetIndexEmptyValue(3,0.0);
//----

      // MA Period Buttons
      MA_Display_Time_Frame = Period(); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
      ResetLastError();
      Alert("In init() - Calling CreateMAPeriodButtons()");
      CreateMAPeriodButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
         
      ResetLastError();
      Alert("In init() - Calling CreateDismissSignalButtons()");
      CreateDismissSignalButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
      
      ResetLastError();
      Alert("In init() - Calling SetPeriodButtonState()");
      SetPeriodButtonState();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
   
   // Set normalization factor for current currency pair
   if ((Digits == 4) || (Digits == 5))
         NormalizationFactor = 0.0001;
      else
         NormalizationFactor = 0.01;
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
      Alert("In de-init() - getting ready to delete objects ");
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_LABEL);
      Alert("In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString(GetLastError()));
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_BUTTON);
      Alert("In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString(GetLastError()));
  }

見ての通り、関数の「本体」は変えていません。私は単に新しい機能に適合するために必要な修正を行いました。ひとつだけ、start()からOnStart()またはOnTick()に変更したことについては、まだ少し混乱しています(今は忘れてしまいましたが、私はまだ問題なくstart()を使用しています)。これはカスタムインディケーター であることを明記しておきます。もう一つ不満なのは、EA、インジケータ、スクリプトのどれをコーディングするかによって、使えるものに制限があることです。EAでないとトレードができないなど、理にかなったものとそうでないものがあります(MessageBoxを使ったインジケータの禁止など)。もうひとつ、トレードのオープンやクローズなどのイベントがないのは本当に不満です。これは、私が今組み立てているものにとって本当に役に立つでしょう。

私が最後の発言で得ようとしていることの例は、次のとおりです。私は、特定の条件が満たされた場合に買いシグナルを表示し、特定の条件が満たされた場合にそのための買い取引終了シグナルを表示できるようにしたいのですが、私はまた、ユーザーが希望すれば、買いシグナルをキャンセルして別のシグナルを待つことができ、同様に終了シグナルもできるようにしたいと思います。もし、ユーザーが取引を終了することを選択した場合、買いシグナルと決済買いシグナルは消え、インジケータは次の取引のためのエントリー基準を監視するようにしたいのです。キャンセル部分は完璧に動作しますが、MQL4がメッセージングを提供しないため、OpenとCloseイベントを検出することができません。

私のプロフィールを見ていただければ、私が決して素人プログラマーではないことがお分かりいただけると思います。この言語は、プロフェッショナルが最新の開発プラットフォームに期待し、必要とするすべての機能を提供していないだけなのです。もうひとつ、デバッグがうまくいかないのは、大きな不満です。ドキュメントに従ったのですが、デバッガーを動かそうとすると、チャートが表示され、インジケーターを初期化するためのプロパティダイアログがポップアップしますが、オーケーを押してインジケーターの設定を終了するとチャートは消えてしまい、それきりです。おそらく、ロシア語から英語への翻訳で物事が失われていて、私が何かを見逃しているだけか、あるいは「ケーキ」がまだ焼けていないだけなのでしょう。プロフェッショナルとして、このような開発言語と環境を作ることがいかに大変な作業であるか、私は知っています。このような開発言語や開発環境の整備がいかに大変な作業であるかは、プロフェッショナルである私にもよくわかるので、苦言というよりは、開発スタッフへの参考意見という意味合いが強いです。

教授

 
ProfessorMetal:

No problem, angevogeur

元々はこのようなコードでした。


教授

申し訳ありませんが、あなたが投稿したコードはコンパイルされませんでした。あなたの問題を再現するために、コードをお聞きします。
 

もし私が設定する変数を宣言していなければ、また私が呼び出すメソッドを宣言して肉付けしていなければ、コンパイルできないでしょう。それは無理だ。そんなこと知ってると思ってたよ。私は、あなたが求めていると思われるもの、つまり私の問題を解決する解決策を投稿しました。とりあえず、MetaQuotesを使っていて、MetaTraderで何が起こっているのかを把握して解決しようとしているのなら、以下に詳細を投稿しておきます。init()のifブロックをコメントアウトし、MA_Display_Time_Frameをグローバルに整数で 宣言し、これらのメソッドを追加 してください。

void CreateMAPeriodButtons()
  {
//  Alert("In CreateMAPeriodButtons()");
      int X_Distance = 10;
      int Y_Distance = 20;
      // Create MA Period Label
      ObjectCreate("MAPeriodLabel", OBJ_LABEL, 0, 0, 0);
      ObjectSet("MAPeriodLabel", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      ObjectSet("MAPeriodLabel", OBJPROP_XDISTANCE, X_Distance);
      ObjectSet("MAPeriodLabel", OBJPROP_YDISTANCE, Y_Distance);
      ObjectSetText("MAPeriodLabel", "MA Display Period", 12, "Arial", clrYellow);
      
      // Create Period Buttons
      CreateButton("M1", "M1", 1, 140, 50, 100, 20, "Arial", 12, clrYellow, clrGray);
}

void CreateDismissSignalButtons()
  {
      int X_Distance = 25;
      int Y_Distance = 100;
      
      // Create Dismiss Label
      ObjectCreate("DismissSignalsLabel", OBJ_LABEL, 0, 0, 0);
      ObjectSet("DismissSignalsLabel", OBJPROP_CORNER, CORNER_RIGHT_LOWER);
      ObjectSet("DismissSignalsLabel", OBJPROP_XDISTANCE, X_Distance);
      ObjectSet("DismissSignalsLabel", OBJPROP_YDISTANCE, Y_Distance);
      ObjectSetText("DismissSignalsLabel", "Dismiss Trade Signals", 12, "Arial", clrYellow);
      
      // Create Dismiss Buttons
      
      CreateButton("DismissBuySignal", "Dismiss Buy Signal", CORNER_RIGHT_LOWER, 200, 95, 190, 20, "Arial", 12, clrYellow, clrGray);
}

void CreateButton(string strButtonName, string strButtonText, const int nCorner, const int nXpos, const int nYpos, int nWidth, int nHeight, string strFont, 
                    int nFontSize, int nFontColor, int nBackColor, bool bSelected = false)
  {      
      ObjectCreate(0, strButtonName, OBJ_BUTTON, 0, 0, 0);

      //--- set button coordinates
      
      ObjectSetInteger(0, strButtonName, OBJPROP_CORNER, nCorner);

      ObjectSetInteger(0, strButtonName, OBJPROP_XDISTANCE, nXpos);

      ObjectSetInteger(0, strButtonName, OBJPROP_YDISTANCE, nYpos);
 
      //--- set button size
      ObjectSet(strButtonName, OBJPROP_XSIZE, nWidth);
     
      ObjectSet(strButtonName, OBJPROP_YSIZE, nHeight);

      //--- set the chart's corner, relative to which point coordinates are defined
      
      ObjectSet(strButtonName, OBJPROP_CORNER, nCorner);

      //--- set the text
      
      ObjectSetString(0, strButtonName, OBJPROP_TEXT, strButtonText);
      ObjectSetString(0, strButtonName, OBJPROP_FONT, strFont);
      ObjectSetInteger(0, strButtonName, OBJPROP_FONTSIZE, nFontSize);
      ObjectSetInteger(0, strButtonName, OBJPROP_COLOR, nFontColor);

      //--- set background color
      
      ObjectSetInteger(0, strButtonName, OBJPROP_BGCOLOR, nBackColor);
      
      return;
  }

これは商用製品を想定しているので、決して全てのインジケータコードではありませんが、これでコンパイルでき、オリジナルのinit()とdeinit()メソッドを使用して問題が発生する可能性があります。いくつかのラベルとボタンを作成するのに十分です。投稿者の一人が述べたように、不具合は断続的に発生しました。しかし、インディケータのプロパティを変更したり、タイムフレームを変更したり、ターミナルを停止して再起動するなど、インディケータが非初期化する原因となるあらゆる動作に関連していました。プロパティを変更してテストしたい場合は、これらのエクスターンをグローバルに追加してください。

extern int               Number_Of_TimeFrames = 2;
extern int               Number_Of_Periods_For_Trend_Agreement = 25;
extern bool             Allow_Modify_Entry_Timeframe = true;

externsを追加すれば、それを参照するifブロックをコメントアウトする必要はありません。これで、コンパイルして問題を再現してみるには十分でしょう。古い初期化関数や 初期化解除関数を変更し、新しいバージョンにしてから、問題は発生していません。他に何か必要なものがあれば教えてください。このスレッドを見守っています。

 

私も似たような状況で、チャート上にドロップするとインジが正常に動作しました。

パラメータを 変更しても、Tfを移動させても問題なく動作しました。

MT4を終了して再起動すると、indiが表示されなくなりました。

チャート上のインジケーターリストには表示されていたのですが、動作しませんでした。

パラメータウィンドウを開き、OKボタンをクリックすると、すぐにリストからindiが消えました。

上記の投稿に書かれているものを含め、すべてのトリックを試しましたが、何もうまくいきませんでした。

結局、0による除算の問題であることがわかりました。

単純に、if(x!=0) の条件で解決しました。

 

そう、ちょうど別のindiで同じ問題が発生したところです。

プラットフォームを起動するたびに "if "がないと、indiは0による除算の問題があります。

新しいMT4では、ティックされるまで情報が保存されないようです。

他の解決策としては、start()やOnStart()の代わりにOnCalculate()を使うことでしょうかね?

でも、これはMetaQuotesに文句を言うべきことですね。

   double pipValue = MarketInfo(Symbol(),MODE_TICKVALUE); 

   if(pipValue!=0)
    {
   double lots   = AccountBalance()*(RiskPercent/100.0)/(StopLoss*pipValue);
    }
 

return(0)の トリックを使う必要があります。

もし興味があれば、誰かが少し詳しく説明するでしょう。

 
deysmacro:

リターン(0)の トリックを使う必要があります。

興味があれば、誰かが少し詳しく説明してくれるでしょう。


さて、ネット上のどこにでもあるような古いインジケータは、コードが自動的に修正されるわけではありません。

コードをいじれる人、問題を理解している人なら自力でできる。

それ以外の人は、MT4を開くたびにindiが表示されないという不快感を味わうことになるのです。

テンプレートがあれば、それを使ってインジを復元することができますが、毎回これをやることになります。

テンプレートは、新しいBuilt 625では、別の話です。

 

みんな

あなた方は的外れです。あなたが言っているのは、常に問題になっているタイミングの問題です。これを使えば、簡単に解決できます。

// Wait for the server "turmoil" to settle before doing anything
      string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(0);

ゼロによる除算の エラーは、サーバーが落ち着く前に計算を行おうとしたことが原因です。もし、初期化関数の中で計算をしているのなら、それはいけません!上記のコードをstart()またはOnStart()の中に入れてから、必要なことを行ってください。ダダスさん、あなたのようにシンプルに作ろうとすると、大変なことになりますよ。あなたはIndiで幸運を掴んでいます。

indiが消えたら、初期化に失敗したんだ。ログを見ると "グローバル初期化失敗 "とある。なぜそうなるのか、原因を突き止め、改善する必要があります。そうしないと、縫わなければならない傷にバンドエイドを貼ったようなもので、必ず自分に跳ね返ってきます。

 

このエラーはOnInit()とは関係なく、エラーの説明も誤解を招くような内容になっているように思えます。

たった1行のコードで

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[])
  {
//---
  Print(High[rates_total]);
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }

配列が範囲 外というエラーが出ます。

タイムフレームを変更すると、Global initialisation failed となり、インジケータはチャートから削除されます。

 
GumRaiさん、そうかもしれませんね。ひとつはdeinit()が呼ばれるべき時に呼ばれず、ぶら下がったままになっていることです。OnCalculate()については、MQLの関数の 実装に不具合があるようです。もう一つは、サーバーが落ち着き、サーバー側の情報を「初期化」する前に何かをしようとしている場合です。これは推測ですが、OnCalculate()で表示されているのは、この2つの原因によるものだと思われます。MQLの開発者は、少しデバッグが必要なようですね。公平に見て、彼らが試みていることは些細なことではありません。不具合が発生するのは当然です。