こんにちは 、
私は、MT4MT5を使用している線図で、適切なトレンドラインを描かないためにMT4MT5を責めにしているすべての人に、非常に特別なアイデアを持っています。
どのCoderもこの周期変換器を通常のMT4 - 算術 - 線形図から対数グラフ尺度に変更することができます。
私はこれがすべての技術トレンドラインの恋人のためのMT4MT5の対数グラフを得る唯一の方法だと思います。
ここにindiとソースコードがあります:
// ------------------------------------ ----------- -------------------
//| Period_Converter_Opt.mq4 |
//| Copyright(c)2005、MetaQuotes Software Corp. |
//|
http://www.metaquotes.net|
//| miccllyによって変更されたVer.1.6 |
//| Ver.1.5がfaiによって変更されました|
//| Period_Converterに基づいてwfy05 @ talkforexによって変更されました。
//|
http://www.talkforex.com|
// ------------------------------------ ----------- -------------------
#property copyright
#property link http://www.mql4.com/codebase/indiors/277/
#property indior_chart_window

#include lt; WinUser32.mqhgt;

/*
Readme:

I.特徴:
これはMT4の周期コンバータの改良バージョンです。
メタクォートによるMT4のデフォルト期間コンバータ
既定の期間コンバータスクリプトはリアルタイムの更新をサポートしていませんが、
多くのCPU(50%〜9x%)を消費するため、システム全体が遅くなります。
また、デフォルトのスクリプトは、MT4を終了すると保存されないスクリプトですが、
再起動後は、すべてのコンバータースクリプトを再適用しなければなりません
迷惑な。

これは上記の問題をすべて解決しました。
1.リアルタイム更新またはカスタムインターバルミリ秒レベルの更新。
2.低CPUコスト、平均5%〜10%以下。
3.インジケータとして機能するので、再起動時に保存して再ロードすることができます。
4.それはスクリプトではないので、グラフの制限ごとに1つのコンバータはありません
それ以上の場合は、1つのウィンドウをソースとして使用して複数のウィンドウを生成できます
可能な限り新しい時間枠図。
5.新しい履歴ブロックがロードされている場合、自動更新。

II。使い方:
mq4ファイルをMT4インジケータフォルダにコピーします(エキスパート\インジケータ)
スクリプトではなく指標としてインストールします。カスタムインジケータで
リストに、必要なチャートにperiod_converter_optを添付します。
それは4つのパラメータをサポートします:
PeriodMultiplier:新しい期間乗数係数です。デフォルトは2です。
UpdateInterval:更新間隔(ミリ秒単位)
ゼロはリアルタイムで更新されることを意味します。デフォルトは0です。
有効:このオプションで削除せずに無効にすることができます。

他のパラメータはコメントまたはデバッグのために無視しても安全です。

また、[共通]タブで[DLLのインポートを許可する]オプションが選択されていることを確認するか、
それは動作しません

その後、FileOpen Offlineを使用して、生成されたオフラインデータを開きます。次に
オフラインデータは自動的に更新されます。

ソースチャートを開いたままにして、コンバーターインジケーター
実行中、インジケータを含む生成されたチャートは常に
更新します。生成されたグラフを閉じて再度開くこともできます
後でFileOpen Offlineから問題なく。

MT4を終了したい場合は、それらのオフラインチャートを他のものとして残すことができます
通常のオンラインチャート。次回MT4を起動すると、これらのグラフは
ロードして更新することもできます。


III。ノート:
オフラインチャートの一般的なプロパティでオフラインチャートオプションをオフにしないでください。
またはMT4を再起動すると、そのチャートがオンラインのチャートおよびリクエストとして扱われます
サーバーからのデータ、空のグラフウィンドウ。
2.同じウィンドウに複数のコンバータを別々に取り付けることができます
PeriodMultiplier(例:3つのコンバーターを
PeriodMultiplier = 2,4,10からM1を選択してM2、M4、M10を同時に生成する。
M1チャートを使用してH2のようなHourlyチャートを生成することもOKです。
最初の変換時にCPUリソースをわずかに増やすだけです。しかし、通常は
ほとんどのサーバーは短期間に多くのデータを持っていません。その結果
生成されたデータは長期間十分に長くはありません。それは示唆されている
必要に応じて時間別/日別チャートをソースとして使用できます。
3.リアルタイム更新モードでは、できるだけ速く見積もりを更新しますが、
これはスクリプトを介して行われ、MTはstart()関数の呼び出しをスキップします。
あなたのPCは忙しく、引用収入がたくさんあります。とにかく、これはめったに起こらない、
少なくとも毎秒10回の更新が可能です
十分です。
4.オフラインチャートには、チャートに入札行が表示されていませんが、すべてのデータ
インジケータを含むチャートではまだ更新中ですが、
だから心配しないで。オフラインチャートをクリック解除して入札単価を表示することができます
オプションを使用します。しかし、それはあまり役に立たないし、忘れると
終了する前にオフラインチャートのオプションをチェックする。エラーが発生し、
次の起動時に空になります。ウィンドウを閉じて開いて
もう一度FileOpenオフラインから、問題のない価値があります。

IV。歴史:
2014.03.10 1.6ビルド600以降をサポートするように変更されました
2009.08.07 1.5オプションの追加(ShiftTiming、GMTShift、OmitDigit)
2005.12.24 1.4浮動小数点を削除してデータを変更した場合の検出が高速
CSVファイルをリアルタイムで出力するためのサポートが追加されました。
OutputCSVFile = 0はCSVがないことを意味します。
OutputCSVFile = 1はCSV HSTを意味します
OutputCSVFile = 2 CSVのみ、HSTはありません。
(内蔵期間にCSVを生成する場合に便利です)
CSVファイル名は、拡張子を除くHSTファイルと同じになります。
期間乗数を安全にチェックしました。
2005.12.04 1.3大量のデータがある場合の欠落データの修正
いくつかのブロックにロードされ、自動更新をサポートします
新しい履歴がロードされたとき。
2005.11.29 1.2欠落したデータとサーバーの変更に関する追加の修正。
2005.11.29 1.1再起動後の部分データの欠落を修正しました。
サーバーまたはデータの変更後に再初期化します。
2005.11.28 1.0初回リリース
*


extern doubleバージョン= 1.6;/コードバージョン
extern string BuildInfo = 2014.03.10 by micclly;
extern int PeriodMultiplier = 1;/新しい周期倍率
extern int OutputCSVFile = 0;/CSVファイルも出力しますか?
extern int UpdateInterval = 0;/間隔をミリ秒で更新します。ゼロはリアルタイム更新を意味します。
extern bool Enabled = true;
extern bool Debug = false;

extern int ShiftTiming = 0;/0-3、H1ChartとPeriodMultiplierを使用する= 4;
//if 1、ServerH4Chart = 00:00/04:00/08:00/12:00 ...
//= gt; OfflineH4Chart = 01:00/05:00/09:00/13:00 ...
extern int GMTShift = 0;/9の場合、Server Time = GMT 0オフラインチャート時間= GMT 9
extern int OmitDigit = 0;/1,5桁の場合4桁

int FileHandle = -1;
int CSVHandle = -1;
int NewPeriod = 0;
string MySymbol =;
int ShiftBase;
#define OUTPUT_HST_ONLY 0
#define OUTPUT_CSV_HST 1
#define OUTPUT_CSV_ONLY 2


#define CHART_CMD_UPDATE_DATA 33324

void DebugMsg(string msg)
{
if(Debug)アラート(msg);
}

int init()
{
ShiftBase =期間()* 60;/秒
文字列接尾辞=;
if(ShiftTiming!= 0)suffix = StringConenate(接尾辞、s、シフトタイミング);
if(GMTShift!= 0)suffix = StringConenate(サフィックス、g、GMTSh ift);
if(OmitDigit!= 0)suffix = StringConenate(接尾辞、o*、OmitDigit *);
MySymbol = Symbol() _ 接尾辞。
if(StringLen(MySymbol)gt; 11)
MySymbol = StringConenate(StringSubstr(MySy mbol、0,11-StringLen(接尾辞))、接尾辞);
//期間乗数の安全なチェック。
if(PeriodMultiplier lt; = 1 suffix ==){
//出力するCSVファイルのみ
期間乗算器= 1;
出力CSVファイル= 2;
}
NewPeriod = Period()* PeriodMultiplier;
if(OpenHistoryFile()lt; 0)return(-1);
WriteHistoryHeader();
UpdateHistoryFile(Bars-1、true);
UpdateChartWindow();
return(0);
}

void deinit()
{
//ファイルハンドルを閉じる
if(FileHandle gt; = 0){
FileClose(FileHandle);
FileHandle = -1;
}
if(CSVHandle gt; = 0){
FileClose(CSVHandle);
CSVHandle = -1;
}
}


int OpenHistoryFile()
{
文字列名。
名前= MySymbol NewPeriod;
if(OutputCSVFile!= OUTPUT_CSV_ONLY){
FileHandle = FileOpenHistory(名前 .hst、FILE_BIN | FILE_WRITE | FILE_SHARE_READ);
if(FileHandle lt; 0)は、(-1)を返します。
}
if(OutputCSVFile!= OUTPUT_HST_ONLY){
CSVHandle = FileOpen(name .csv、FILE_CSV | FILE_WRITE | FILE_SHARE_READ | FILE_ANSI、 '、');
if(CSVHandle lt; 0)が(-1)を返します。
}
return(0);
}

int WriteHistoryHeader()
{
文字列c_copyright;
int i_digits = Digits-OmitDigit;
int i_unused [13] = {0};
intバージョン= 400;

if(FileHandle lt; 0)は、(-1)を返します。
c_copyright =(C)opyright 2003、MetaQuotes Software Corp .;
FileWriteInteger(FileHandle、version、LONG_VALUE);
FileWriteString(FileHandle、c_copyright、64);
FileWriteString(FileHandle、MySymbol、12);
FileWriteInteger(FileHandle、NewPeriod、LONG_VALUE);
FileWriteInteger(FileHandle、i_digits、LONG_VALUE);
FileWriteInteger(FileHandle、0、LONG_VALUE);/timesign
FileWriteInteger(FileHandle、0、LONG_VALUE);/last_sync
FileWriteArray(FileHandle、i_unused、0、ArraySize(i_unused));
return(0);
}


static double d_open、d_low、d_high、d_close、d_volume;
static int i_time;

void WriteHistoryData()
{
if(FileHandle gt; = 0){
FileWriteInteger(FileHandle、i_time GMTShift * 60 * 60、LONG_VALUE);
FileWriteDouble(FileHandle、d_open、DOUBLE_VALUE);
FileWriteDouble(FileHandle、d_low、DOUBLE_VALUE);
FileWriteDouble(FileHandle、d_high、DOUBLE_VALUE);
FileWriteDouble(FileHandle、d_close、DOUBLE_VALUE);
FileWriteDouble(FileHandle、d_volume、DOUBLE_VALUE);
}
if(CSVHandle gt; = 0){
int i_digits = Digits-OmitDigit;
FileWrite(CSVHandle、
TimeToStr(i_time、TIME_DATE)、
TimeToStr(i_time、TIME_MINUTES)、
DoubleToStr(d_open、i_digits)、
DoubleToStr(d_high、i_digits)、
DoubleToStr(d_low、i_digits)、
DoubleToStr(d_close、i_digits)、
d_volume);
}
}

int UpdateHistoryFile(int start_pos、bool init = false)
{
static int last_fpos、csv_fpos;
int i、ps;
//if(FileHandle lt; 0)return(-1);
//オープンタイムを正規化する
ps = NewPeriod * 60;
i_time =(時刻[start_pos] -ShiftBase * ShiftTiming)/ps;
i_time = i_time * ps ShiftBase * ShiftTiming;
if(init){
//最初のデータ、initデータ
d_open = [start_pos]を開きます。
d_low =ロー[start_pos];
d_high =高[start_pos];
d_close =閉じる[start_pos];
d_volume =ボリューム[start_pos];
i = start_pos - 1;
if(FileHandle gt; = 0)last_fpos = FileTell(FileHandle);
if(CSVHandle gt; = 0)csv_fpos = FileTell(CSVHandle);
} else {
i = start_pos;
if(FileHandle gt; = 0)FileSeek(FileHandle、last_fpos、SEEK_ SET);
if(CSVHandle gt; = 0)FileSeek(CSVHandle、csv_fpos、SEEK_SET);
}
if(i lt; 0)return(-1);

int cnt = 0;
int LastBarTime;
//処理バー
while(i gt = 0){
LastBarTime = Time [i];

//新しいバー
if(LastBarTime gt; = i_time ps){
//バーデータを書き込む
WriteHistoryData();
cnt ;
i_time =(LastBarTime-ShiftBase * ShiftTiming)/ps;
i_time = i_time * ps ShiftBase * ShiftTiming;
d_open = [i]を開く。
d_low = Low [i];
d_high =高[i];
d_close =閉じる[i];
d_volume =ボリューム[i]。
} else {
//新しいバーがありません
d_volume = Volume [i];
if(Low [i] lt; d_low)d_low = Low [i];
if(High [i] get; d'high)d'high =高[i];
d_close =閉じる[i];
}
私 - ;
}
//最後のバーを書き込む前にlast_fposを記録します。
if(FileHandle gt; = 0)last_fpos = FileTell(FileHandle);
if(CSVHandle gt; = 0)csv_fpos = FileTell(CSVHandle);
WriteHistoryData();
cnt ;
d_volume - =ボリューム[0]。
//書き込まれたデータをフラッシュする
if(FileHandle gt; = 0)FileFlush(FileHandle);
if(CSVHandle gt; = 0)FileFlush(CSVHandle);
return(cnt);
}

int UpdateChartWindow()
{
static int hwnd = 0;

if(FileHandle lt; 0){
//HSTファイルは開かず、更新する必要はありません。
return(-1);
}
if(hwnd == 0){
//更新のためにチャートウィンドウを検出しようとしています
hwnd = WindowHandle(MySymbol、NewPeriod);
}
if(hwnd!= 0){
if(IsDllsAllowed()== false){
//DLL呼び出しを許可する必要があります
DebugMsg(Dll呼び出しを許可する必要があります)。
return(-1);
}
if(PostMessageA(hwnd、WM_COMMAND、CHART _CMD_UPDATE_DATA、0)== 0){
//PostMessageに失敗しました。チャートウィンドウが閉じました
hwnd = 0;
} else {
//PostMessage succeed
return(0);
}
}
//ウィンドウが見つからないか、PostMessageが失敗しました
return(-1);
}


/*
int PerfCheck(bool Start)
{
static int StartTime = 0;
static int Index = 0;
if(Start){
StartTime = GetTickCount();
インデックス= 0;
return(StartTime);
}
索引 ;
int diff = GetTickCount() - StartTime;
アラート(使用時間[ インデックス ]: diff);
StartTime = GetTickCount();
return(diff);
}
*

static int LastStartTime = 0;
static int LastEndTime = 0;
static int LastBarCount = 0;

void reinit()
{
deinit();
その中に();
LastStartTime =時間[Bars-1];
LastEndTime =時間[0]。
LastBarCount =バー。
}

bool IsDataChanged()
{
/*
static int LastBars = 0、LastTime = 0、LastVolume = 0;
スタティックダブルLastOpen = 0、LastClose = 0、LastHigh = 0、LastLow = 0;
if(LastVolume!= Volume [0] || LastBars!=バー|| LastTime!= Time [0] ||
LastClose!=閉じる[0] || LastHigh!=高[0] || LastLow!= Low [0] ||
LastOpen!= Open [0]){

LastBars =バー;
LastVolume =ボリューム[0]。
最後の時間=時間[0];
LastClose =閉じる[0];
LastHigh =高[0]。
LastLow = Low [0];
LastOpen =開く[0];
return(true);
}
return(false);
*
/*
浮動小数点演算なしの高速版
*
static int LastBars = 0、LastTime = 0、LastVolume = 0;
ブールret;
ret = false;
if(LastVolume!= Volume [0]){
LastVolume =ボリューム[0]。
ret = true;
}
if(LastTime!= Time [0]){
最後の時間=時間[0];
ret = true;
}
if(LastBars!= Bars){
LastBars =バー;
ret = true;
}
リターン(ret);
}

int CheckNewData()
{
静的な文字列LastServer =;
if(Bars lt; 2){
//データはまだロードされていません。
DebugMsg(データはロードされず、バー バーのみ)。
return(-1);
}

文字列serv = ServerAddress();
if(serv ==){
//まだサーバーがありません
DebugMsg(サーバーが接続されていません)。
return(-1);
}

//サーバーが変更されましたか?これをチェックして、サーバを変更している間に間違ったデータを防ぐために再設定してください
if(LastServer!= serv){
DebugMsg(サーバーは サーバーから サーバーに変更されました);
LastServer = serv;
reinit();
return(-1);
}

if(!IsDataChanged()){
//リソースを保存するためにデータが変更されなかった場合に戻る
//DebugMsg(データは変更されません);
return(-1);
}

if(Time [Bars-1]!= LastStartTime){
DebugMsg(開始時間の変更、新しい履歴のロードまたはサーバーの変更)。
reinit();
return(-1);
}
int i、cnt;
//通常はTime [0]またはTime [1]のLastEndTimeバーを見つけようとしますが、
//操作が速いので
for(i = 0; i; Bars; i ){
if(Time [i] lt; = LastEndTime){
ブレーク;
}
}
if(i gt; = Bars || Time [i]!= LastEndTime){
DebugMsg(終了時刻 TimeToStr(LastEndTime) 見つからない);
reinit();
return(-1);
}
cnt =バー - i;
if(cnt!= LastBarCount){
DebugMsg(読み込まれたデータ、cntは cnt LastBarCountは LastBarCountです);
reinit();
return(-1);
}

//新しいデータが読み込まれず、LastEndTimeの位置に戻ります。
LastBarCount =バー。
LastEndTime =時間[0]。
return(i);
}

// ------------------------------------ ----------- -------------------
//|プログラム開始機能|
// ------------------------------------ ----------- -------------------
int start()
{
static int last_time = 0;

if(!Enabled)return(0);
//常に一定の間隔の後にのみ更新または更新する
if(UpdateInterval!= 0){
int cur_time;
cur_time = GetTickCount();
if(MathAbs(cur_time - last_time)lt; UpdateInterval){
return(0);
}
last_time = cur_time;
}

//if(Debug)PerfCheck(true);
int n = CheckNewData();
//if(デバッグ)PerfCheck(false);
if(n lt; 0)return(0);

//履歴ファイルを新しいデータで更新する
UpdateHistoryFile(n);
//チャートウィンドウを更新する
UpdateChartWindow();
//if(デバッグ)PerfCheck(false);
return(0);
}

アタッチメントインジケータ:
添付ファイル


https://www.forexgroove.com/attachme...9574793598.mq460 KB | 0ダウンロード