MetaTrader 4 Build 529 ベータ版リリース、新コンパイラー搭載 - ページ 18

 
mr_Johns:
MQL4ハンドブック(エディター内にあるもの)もそれに合わせて更新されたのでしょうか?


はい、更新のお願いで。 MQL4のハンドブックは ほぼ5をベースにしており、現時点ではコンパイラの実情に 対応していません。
 
ALXIMIKS:

間違っていたら訂正してください。

あるインジケータでライブラリ関数を使用しています。この関数は、インジケータ配列の計算に関与するいくつかの静的 変数を宣言しています。

指標計算を修正するために指標パラメータを変更したい場合(静的変数に依存する)。

再初期化を担当するライブラリ関数にフラグを渡す (スタティック変数を持つ各関数の入力パラメータを拡張する必要がある)

本体でスタティック変数をゼロにし、計算が完了する前にフラグを外すことを忘れないようにしてください。

静的変数に宣言時に設定するパラメータがあれば、再初期化時にこれらの変数がゼロにリセットされるかどうかを決定することができ、より簡単になります。

ローカル静的変数の代わりにグローバル変 数を作成し(関数の外側)、最初の呼び出しで初期化する。
 
ALXIMIKS:

静的変数に宣言時に設定するパラメータがあり、再初期化時にその変数の値をリセットするかどうかを担当すれば、よりシンプルになります。

ResetStaticVars()のような特別な関数を作れば、さらに簡単です。

// ちなみに、そんなに簡単なことではありません。私ならしない。単純にデータセグメント全体をゼロにすることと、すべてのユーザーの初期値を正しく割り当てることは別のことです。 首が痛くなるけど。

実は(パラダイムとして)プログラムのライフサイクル中に値を保存することは、むしろ便利なことなのです。 ただ、ここには後方互換性の問題があるので......。

 

私はこのフォーラムのロシア語圏の部分であることを知っているが、私はロシア語を話すのが苦手なので、(私はそれを読むことができるにもかかわらず)誰もここにこれを投稿気にしないことを望む(英語パートは、これらの問題に関する限り完全に非アクティブと思われるので、私は誰かがこの問題について投稿したのを見ていなかったので)。

新しいメタトレーダーには、外部文字列パラメーターに関する重大な問題が1つあります。最初は正しい値を持っていますが、タイムフレームやシンボルが 変更されるとすぐに文字列パラメータの内容が失われます。ここでは、何が起こっているのかを正確に示す簡単な例を示します。この問題は、そのようなインジケータがiCustom()呼び出しを通じて使用される場合にも発生し、そのようなインジケータはEAまたは他のコードから使用できなくなります。

#property indicator_chart_window

extern string TestString = "whatever value that we want initially set";

int OnInit() { return(0); }
int deinit() { return(0); }
int start()
{
   Comment(TestString);
   return(0);
}
 
ALXIMIKS:

アップデート要求ではい。MQL4のハンドブックは
ほぼ5をベースにしており、 現時点ではコンパイラの実情に対応していません。

もしかしたら、近い将来の何かを残しているかもしれませんね。 期待しています。
 
mr_Johns:
MQL4ハンドブック(エディター内にあるもの)もそれに合わせて更新されたのでしょうか?

はい、ずいぶん前に更新され、日々積極的に補填されています。
 

なぜこのようなデザインが必要なのかがわからない

#property icon "\\Files\\button.ico"
 
VOLDEMAR:

なぜこのようなデザインが必要なのかがわからない

EAを起動すると、「一般」タブに絵が表示されます。
 
むだづかい
 
mladen:

私はこのフォーラムのロシア語圏の部分であることを知っているが、私はロシア語を話すのが苦手なので、(私はそれを読むことができるにもかかわらず)誰もここにこれを投稿気にしないことを望む(英語パートは、これらの問題に関する限り完全に非アクティブと思われるので、私は誰かがこの問題について投稿したのを見ていなかったので)。

新しいメタトレーダーには、外部文字列パラメーターに関する重大な問題が1つあります。最初は正しい値を持っていますが、タイムフレームやシンボルが変更されるとすぐに文字列パラメータの内容が失われます。ここでは、何が起こっているのかを正確に示す簡単な例を紹介します。この問題は、そのようなインジケータがiCustom()呼び出しを通じて使用される場合にも発生し、そのようなインジケータはEAまたは他のコードから使用できなくなります。

ムラデンさんは読解力があるので、ロシア語で答えるのが楽ですね。

この問題に対する私の解決策を紹介します。私のinit()コードには、これらのグローバル変数を 再初期化するReInit()関数が含まれており、タイムフレームやシンボルが変更されたときにその値が復元されるようになっています。

//-----------------------------------------------------------------------------
int init(){
   int Error;
   if( МинНаклонТренда<Zero ) МинНаклонТренда=0;
   if( МинНаклонТренда-МаксНаклонТренда>Zero ) МаксНаклонТренда=МинНаклонТренда;
   if( БарОкончания<1 ) БарОкончания=1;
   if( МинБазовыйПериод<1 ) МинБазовыйПериод=1;
   if( МаксБазовыйПериод<МинБазовыйПериод ) МаксБазовыйПериод=МинБазовыйПериод;
   if( БарНачала<МинБазовыйПериод+БарОкончания ) БарНачала=МинБазовыйПериод+БарОкончания;
   if( БарНачала>Bars-1 ){
      if( Bars>МинБазовыйПериод+БарОкончания ) БарНачала=Bars-1;
      else Alert("Неразрешимая ошибка: история("+Bars+")<=активация("+МинБазовыйПериод
                +")+окончание("+БарОкончания+")");
   }
   if( ТолщинаТрендовой<1 ) ТолщинаТрендовой=1;
   if( ТолщинаТрендовой>5 ) ТолщинаТрендовой=5;
   if( РазмерИндикатораТиков<1 ) РазмерИндикатораТиков=1;
   if( РазмерИндикатораТиков>5 ) РазмерИндикатораТиков=5;
   if( СдвигИндикатораТиков<3 ) СдвигИндикатораТиков=3;
   if( СдвигИндикатораТиков>100 ) СдвигИндикатораТиков=100;
   if( ПоказыватьВсе ) Visibility=0; else Visibility=EMPTY;
   LastBar     =БарОкончания;
   ЦветЛиний[0]=ЦветПоддержки;
   ЦветЛиний[1]=ЦветСопротивления;
   ЦветХорды[0]=ЦветВосходящейХорды;
   ЦветХорды[1]=ЦветНисходящейХорды;
   Цвет123[0]  =Цвет123 ВТ;
   Цвет123[1]  =Цвет123 НТ;
   NewTime     =0;
   ReInit();                                       // Повторная инициализация
   ClearScreen();                                  // Очистить экран
   Error=fVLine("StartLine","Старт",0,БарНачала,0,0,0,0,0,ЦветВертикалей);
   Error=fVLine("DeadLine","Пуск",0,БарОкончания,0,0,0,0,0,ЦветВертикалей);
   DeadLine=TimeCurrent();
   if( СтатическийРежим ){
      if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
      РежимРаботы=РежимРаботы+"Статический режим Пауза "+ПериодИмитацииТиков+" мс";
      МоделироватьДинамику=false;
      //РежимОтладки=false;
      while( true ){                               // Бесконечный цикл
         ReInit();                                 // Повторная инициализация
         start();                                  // Имитация тика
         Sleep(ПериодИмитацииТиков);               // Не работает в индикаторах
   }  }
   else {
      if( МоделироватьДинамику ){
         РежимРаботы=" Режим имитации динамики Размерность "+DoubleToStr(0.5*БарНачала*БарНачала,0);
         Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
         LastBar=БарНачала;
         while( LastBar>БарОкончания ){            // Перебор всех баров истории
            LastBar--;
            start();                               // Имитация тика
         }
         МоделироватьДинамику=false;
         Print("      Режим имитации динамики отключен!");
   }  }
   if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
   РежимРаботы=РежимРаботы+"Динамический режим";
   Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
   if( !ПечататьПредупреждения ) Print("Печать предупреждений запрещена!");
   if( РежимОтладки ) start();                     // Имитация тика
   return(0);
}
//-----------------------------------------------------------------------------
// Повторная инициализация глобальных переменных и массивов
void ReInit(){
   StartTime[0]   =Time[БарНачала];
   StartTime[1]   =Time[БарНачала];
   Groups[0]      =0;
   Groups[1]      =0;
   OldMG[0]       =0;
   OldMG[1]       =0;
   MainGroup[0]   =0;
   MainGroup[1]   =0;
   QualityMax[0]  =0;
   QualityMax[1]  =0;
   OldStopLine    =0;
   return;
}
//-----------------------------------------------------------------------------