English Русский 中文 Español Deutsch Português
新しいMQL4のオフラインチャート

新しいMQL4のオフラインチャート

MetaTrader 4 | 6 10月 2015, 17:43
2 886 0
MetaQuotes
MetaQuotes
新しいバージョンのMQL4では、履歴データの保存方法が変更され、MqlRates構造体が新たに追加されました。MqlRates構造体は、Time、Open、Low、High、Close、Volumeなどの値を保存するのに役立ちます。長年にわたってトレーダーは、オフラインチャートを作成する為にHSTファイルに自分のデータを集めて書き込む、自分のプログラムをMQL4で作成していました。各トレーダーは、以前にコンパイルされた全てのEX4ファイルが、新しいMetaTrader4ターミナルで、以前と同様に動作すると確信していることでしょう。


全ての以前のEX4プログラムは、新しいMetaTrader 4ターミナルで動作します。

既に上述したように、ターミナルを以前のバージョンから新しいものに更新する時に、以前のコンパイラーでコンパイルされたカスタムのEX4実行ファイルは、1つとして削除されたり変更されたりすることはありません。これはつまり、ターミナルの標準パッケージに含まれていない、あなたが作成した全てのプログラムは、自動的に新しい保存場所へコピーされ、以前と同様にターミナルで起動することができます。


MetaTrader 4ターミナルでオフラインチャート

新しいバージョンの顧客ターミナルの標準パッケージには、新しい形式でHSTファイルを作成する、更新されたPeriodConverterスクリプトが入っています。しかし、もし以前のperiod_converterスクリプトで作成され、以前のバージョンのコンパイラーでコンパイルされた独自のプログラムがある場合、これらのプログラムは以前と同様に動作します。

例えば、私たちに以前のバージョンで作成され、コンパイルされた形のperiod_converter_509.ex4スクリプトがあるとしましょう。更新時に、このスクリプトは新しい保存場所に自動的にコピーされ、ターミナルのナビゲーターから起動することができます。EURUSD M2の独自の履歴を作成する為に、EURUSD M1のチャートへこのスクリプトを適用します。



初期設定では乗数は3に設定されていますが、これを2に設定します。そして、作成後に履歴を開く、EURUSD M2のオフラインチャートを操作できるように、起動するスクリプトにDLLの呼び出し許可を設定してください。

スクリプトが『エキスパートアドバイザ』の操作ログにデータファイル形成についての通知をしたら、メニューの『ファイル』の『オフラインチャート』を開き、EURUSD M2の列を探します。これらのデータは、私たちのスクリプトによって作成されたものです。


オフラインチャートを開くと、私たちのスクリプトは、以前通りEURUSD M1で動作し、リアルタイムモードで新たに入ってくるティックの変換を続け、指定された時間軸でオフラインチャートが開いていることを判別して、定期的に2秒に1度更新のコマンドを送信します。


このように、以前のコンパイラーでコンパイルされた古いスクリプトは、新しいターミナルで正常に動作し、備えられた全ての機能を実行します。

こちらに書かれた手順を、全てご自身で行ってみてください。period_converter_509.ex4実行ファイルをダウンロードし、<data folder>\MQL4\Scriptsへ置いてください。



新しいコンパイラーの為の、古いのスクリプトの更新

遅かれ早かれ、自身のプログラムのソースコードを変更し、それを新しいMetaEditorでコンパイルする必要が出てくるかもしれません。このスクリプト(period_converter_509)の例では、2つの必要不可欠な修正で、どのようにMQL4言語での変更を検討するかを示します。私たちは勿論のこと、period_conveter_509.mq4のソースコードを変更することなく、ありのままの形でコンパイルすることができ、これは正常に動作します。しかし、言語での変更を考慮し、コードに小さな変更を加えることを勧めします。

ファイルを開く際、共有アクセスモードを明示的に指示する必要があります
以前のMQL4では全てのファイルは、共有モードで開かれていたことに留意してください。新しいMQL4では、ファイルを開く時に、共有モードにするには、FILE_SHARE_WRITEとFILE_SHARE_READのフラグを明示的に指定する必要があります。これらがない場合、ファイルの専有者によって閉じられるまで、他の誰かにファイルを開けられないように、排他モードでファイルが開かれます。そして、私たちにはスクリプトで作成されるソースデータのファイルを、オフラインモードのMetaTrader 4ターミナルで開く必要があります。その為、FileOpenHistory()関数の呼び出しに、この2つのフラグを追加します。

   // 1-st change - add share flags
   ExtHandle=FileOpenHistory(c_symbol+i_period+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);

FileFlush()関数が記録されているデータをすぐにディスクへ書き込みます。
古いスクリプトでは、頻繁にFileFlush()関数を使用します。最初のファイル作成時に、バーデータの各記録後に、これを呼び出す必要はありません。非標準の通貨ペアや時間軸の全ての準備されたデータの記録時、つまり一番最後の段階でこれを行えば十分です。MQL4言語の新バージョンでは、FileFlush()関数の実装は、物理ディスクへ即座にデータを落とす為に変更されました。古いバージョンではライトバックが使われ、多数の呼び出しによるスクリプトの動作の遅延には繋がりませんでした。

last_fpos=FileTell(ExtHandle);
last_volume=Volume[i];
//--- 形成されたバーデータの書込み
FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);
// 2-nd change - remove FileFlush from here
//FileFlush(ExtHandle);

これらの2つの修正後に取得したファイルを、period_converter_580.mq4として保存し、コンパイルします。これはこの記事に添付したファイルからダウンロードすることができます。もう1つ、EURUSD M1のチャートを開いて、EURUSDの3分の非標準チャートを作成する為に、パラメータ3のスクリプトを実行します。


データファイル作成後、これをオフラインのEURUSD M3チャートとして開きます。


予想通り、実行したスクリプトperiod_converter_580は、このチャートが開かれた後にこれを検出して、操作ログへメッセージを送りました。今後も同様にスクリプトは、オフラインチャートへ2秒に1度更新コマンドを送信します。


私たちは、以前のデータソースの保存形式の動作をチェックし、全て以前同様に動作することを確認しました。


新しいスクリプト PeriodConverter

MetaTrader 4顧客ターミナルの新バージョンの標準パッケージには、その先行機能と同じタスクを実行するPeriodConverterスクリプトが含まれています。しかし、若干の違いがあり、ソースコードは新しいスタイルで書かれ、MQL4言語の新しい性能を使用します。

以前のバージョンとの主要な違いは、新しい形式での価格バーのデータを使い動作する、新しいMqlRates構造体の使用にあります。

if(time0>=rate.time+periodseconds || i==0)
  {
   if(i==0 && time0<rate.time+periodseconds)
     {
      rate.tick_volume+=(long)Volume[0];
      if(rate.low>Low[0])
         rate.low=Low[0];
      if(rate.high<High[0])
         rate.high=High[0];
      rate.close=Close[0];
     }
   last_fpos=FileTell(ExtHandle);
   last_volume=(long)Volume[i];
   FileWriteStruct(ExtHandle,rate);
   cnt++;
   if(time0>=rate.time+periodseconds)
     {
      rate.time=time0/periodseconds;
      rate.time*=periodseconds;
      rate.open=Open[i];
      rate.low=Low[i];
      rate.high=High[i];
      rate.close=Close[i];
      rate.tick_volume=last_volume;
     }
  }

オフラインチャートを積極的に使っていたMQL4のプログラマーは、新しいアプローチの利便性をすぐさま評価しました。

価格、ボリュームとスプレッドの情報を保存する構造体

struct MqlRates
  {
   datetime time;    // время начала периода
   double open;      // オープン価格
   double high;      // 期間中の最高値
   double low;       // 期間中の最安値
   double close;     // クローズ価格
   long tick_volume; // ティックボリューム
   int spread;       // スプレッド
   long real_volume; // ティックボリューム
  };

新しいPeriodConverterスクリプトをコンパイルし、これを以前と同様に、新しいEURUSD M1のチャートで実行します。


この時、EURUSD M4のオフラインチャートのデータを用意する為、乗数を4にします。


データの作成後、またオフラインチャートを開きます。


ご覧のように、スクリプトの3つのバージョン全てが同様に動作しています。動作の為に好ましいもしくは必要な、通過ペアや非標準時間軸の独自のチャートは、MetaTrader 4の新しいバージョンで使用できるだけでなく、必要に応じて、既存のソースコードを仕上げたり、新しいもの作成することができます。根本的な変化や、新しいリソースへの移行の困難は生じません。


まとめ

  1. オフラインチャートは、新しいターミナルで以前と同様に動作します。ソースデータの新しい形式も、以前のものもサポートされます。
  2. 古いEX4ファイルは、新しいターミナルで機能を失うことなく動作します。
  3. 言語の新しい機能を使用して、新しいMQL4プログラムを作成し、その可能性の全てを開いてください。

関連記事:

  1. 非標準時間軸でのエキスパートアドバイザのテスト
  2. 日中取引での時間変換の原理
  3. 等量チャートの新しい見方
  4. 合成バー―価格チャート情報の表示での新しい言葉
  5. 「穴」のないチャート

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1387

追加バッファなしの中間計算用物価系列の平均化 追加バッファなしの中間計算用物価系列の平均化
本稿は、もっともシンプルでシングルタイプのクラスに搭載された、従来のまた独自の平均化アルゴリズムを数々取り上げます。それらはほとんどすべてといってよいほどインディケータの開発に汎用的に使用されます。提案するクラスが、カスタムインディケータおよびテクニカルインディケータの「大量」呼び出しに対する有効な代替手段になればよいと思っています。
標準ライブラリクラスを使ってオリジナルのMarket Watchを作成します。 標準ライブラリクラスを使ってオリジナルのMarket Watchを作成します。
新しいMetaTrader 5クライアント端末とMQL5言語はトレーダーにビジュアル情報を提供する機会をもたらします。 本稿では、汎用的拡張可能なクラスセットを提案します。それはチャート上の任意のテキストの表示作成作業をすべて行うものです。 Market Watch インディケータの例を提供します。
スペクトラム分析の構築 スペクトラム分析の構築
本稿は、MQL5言語のグラフィカルオブジェクト使用が可能なバリアントを知っていただくのが目的です。それはグラフィカルオブジェクトを使用し、シンプルなスペクトラム分析を管理するパネルの実装を行うインディケータを分析します。読者のみなさんには本稿をとおしてMQL5の基本を知っていただきたいと思います。
ファジー理論を使用しインディケータを作成する簡単な例 ファジー理論を使用しインディケータを作成する簡単な例
本稿はファイナンシャルマーケット分析にファジー理論の概念を実用的に適用することに特化しています。エンベロープインディケータ上で2つのファジールールに基づくインディケータ生成シグナルの例を提供します。作成されたインディケータは複数のインディケータバッファを使用します。7個のバッファを計算に、5個のバッファをチャート表示に、2個をカラーバッファとします。