新しいMQL4のオフラインチャート
全ての以前の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にします。
データの作成後、またオフラインチャートを開きます。
まとめ
- オフラインチャートは、新しいターミナルで以前と同様に動作します。ソースデータの新しい形式も、以前のものもサポートされます。
- 古いEX4ファイルは、新しいターミナルで機能を失うことなく動作します。
- 言語の新しい機能を使用して、新しいMQL4プログラムを作成し、その可能性の全てを開いてください。
関連記事:
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1387
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索