コーディングのヘルプ - ページ 263

 
mladen:
MrWigglesworth タイプ4としてdemaを追加したバージョンはこちら :ma__dema_crossover_with_arrow_and_email.mq4

素晴らしい!MLadenのご協力に感謝します。

ハッピーホリデー!

 

どなたか、コードからブローカーのGMTを自動的に(自分のGMTでなく)調べる方法をご存じないでしょうか?

 
techmac:
どなたか、コードからブローカーのGMTを自動的に(自分のGMTでなく)調べる方法をご存じないでしょうか?

ブローカーのための自動的な方法はありません(すべてのデータで利用可能なそのような情報はありません - 新しいメタトレーダー4でもありません - 少なくとも私はそれを見つけていない)。

 

mladenさん、こんにちは。

実際のチャートから数時間切り離すスクリプトについて質問させていただきました。今、私は各バーに遅延を入れ、私のチャートにタイムオフセットがあるようにしたいと思っています。

その方法でやってみましたが、うまくいきません(私が思っているような)。

input int TimeDelay_Minutes = 60;

input int StartHour = 8;

input int StartMinute = 0;

input int CloseHour = 16;

input int CloseMinute = 30;

int InpPeriodMultiplier=1; // Period multiplier factor

int ExtHandle=-1;

//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

void OnStart()

{

datetime time0;

ulong last_fpos=0;

long last_volume=0;

int i, start_pos, periodseconds;

int hwnd=0, cnt=0;

//---- History header

int version=401;

string c_copyright;

string c_symbol=Symbol();

int i_period=Period()*InpPeriodMultiplier;

int i_digits=Digits;

int i_unused[13];

MqlRates rate;

//---

ExtHandle=FileOpenHistory(c_symbol+(string)3+".hst", FILE_BIN|FILE_WRITE|FILE_SHARE_READ|FILE_ANSI);

if(ExtHandle<0)

return;

ArrayInitialize(i_unused,0);

//--- write history file header

FileWriteInteger(ExtHandle, version, LONG_VALUE);

FileWriteString(ExtHandle, c_copyright, 64);

FileWriteString(ExtHandle, c_symbol, 12);

FileWriteInteger(ExtHandle, 3, LONG_VALUE);

FileWriteInteger(ExtHandle, i_digits, LONG_VALUE);

FileWriteInteger(ExtHandle, 0, LONG_VALUE); //timesign

FileWriteInteger(ExtHandle, 0, LONG_VALUE); //last_sync

FileWriteArray(ExtHandle, i_unused, 0, 13);

//--- write history file

periodseconds=i_period*60;

start_pos=Bars-1;

rate.open=Open[start_pos];

rate.low=Low[start_pos];

rate.high=High[start_pos];

rate.tick_volume=(long)Volume[start_pos];

rate.spread=0;

rate.real_volume=0;

//--- normalize open time

rate.time=Time[start_pos]/periodseconds;

rate.time*=periodseconds;

for(i=start_pos-1; i>=0; i--)

{

if(IsStopped())

break;

time0=Time- 1 * 60 *TimeDelay_Minutes;

//--- history may be updated

if(i==0)

{

//--- modify index if history was updated

if(RefreshRates())

i=iBarShift(NULL,0,time0);

}

//---

if((time0>=rate.time+periodseconds || i==0)&& MainTime(time0)==true)

{

if(i==0)

{

rate.time=time0/periodseconds; //NEU

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;

FileWriteStruct(ExtHandle,rate);

cnt++;

if(time0>=rate.time+periodseconds)

{

rate.time=time0/periodseconds;

rate.time*=periodseconds;

rate.open=Open;

rate.low=Low;

rate.high=High;

rate.close=Close;

rate.tick_volume=last_volume;

}

}

else if(MainTime(time0)==true)

{

rate.time=time0/periodseconds; //NEU

rate.tick_volume+=(long)Volume;

if(rate.low>Low)

rate.low=Low;

if(rate.high<High)

rate.high=High;

rate.close=Close;

}

}

FileFlush(ExtHandle);

//Print(cnt," record(s) written");

//--- collect incoming ticks

datetime last_time=LocalTime()-5;

while(!IsStopped())

{

datetime cur_time=LocalTime();

//--- check for new rates

if(RefreshRates())

{

time0=Time[0]- 1 * 60 *TimeDelay_Minutes;

FileSeek(ExtHandle,last_fpos,SEEK_SET);

//--- is there current bar?

if(time0<rate.time+periodseconds && MainTime(time0)==true)

{

rate.tick_volume+=(long)Volume[0]-last_volume;

last_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];

}

else if(MainTime(time0)==true)

{

//--- no, there is new bar

rate.tick_volume+=(long)Volume[1]-last_volume;

if(rate.low>Low[1])

rate.low=Low[1];

if(rate.high<High[1])

rate.high=High[1];

//--- write previous bar remains

FileWriteStruct(ExtHandle,rate);

last_fpos=FileTell(ExtHandle);

//----

rate.time=time0/periodseconds;

rate.time*=periodseconds;

rate.open=Open[0];

rate.low=Low[0];

rate.high=High[0];

rate.close=Close[0];

rate.tick_volume=(long)Volume[0];

last_volume=rate.tick_volume;

}

//----

FileWriteStruct(ExtHandle,rate);

FileFlush(ExtHandle);

//---

if(hwnd==0)

{

hwnd=WindowHandle(Symbol(),i_period);

if(hwnd!=0)

Print(" "); //Chart window detected

}

//--- refresh window not frequently than 1 time in 2 seconds

if(hwnd!=0 && cur_time-last_time>=2)

{

PostMessageA(hwnd,WM_COMMAND,33324,0);

last_time=cur_time;

}

}

Sleep(50);

}

//---

}

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

//---

if(ExtHandle>=0)

{

FileClose(ExtHandle);

ExtHandle=-1;

}

//---

}

 
sunshineh:
mladenさん、こんにちは。

実際のチャートから数時間切り離すスクリプトについて質問させていただきました。今、私は各バーに遅延を入れ、チャートにタイムオフセットを持たせたいと思っています。

その方法でやってみましたが、うまくいきません(私が思っているような)。

input int TimeDelay_Minutes = 60;

input int StartHour = 8;

input int StartMinute = 0;

input int CloseHour = 16;

input int CloseMinute = 30;

int InpPeriodMultiplier=1; // Period multiplier factor

int ExtHandle=-1;

//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

void OnStart()

{

datetime time0;

ulong last_fpos=0;

long last_volume=0;

int i, start_pos, periodseconds;

int hwnd=0, cnt=0;

//---- History header

int version=401;

string c_copyright;

string c_symbol=Symbol();

int i_period=Period()*InpPeriodMultiplier;

int i_digits=Digits;

int i_unused[13];

MqlRates rate;

//---

ExtHandle=FileOpenHistory(c_symbol+(string)3+".hst", FILE_BIN|FILE_WRITE|FILE_SHARE_READ|FILE_ANSI);

if(ExtHandle<0)

return;

ArrayInitialize(i_unused,0);

//--- write history file header

FileWriteInteger(ExtHandle, version, LONG_VALUE);

FileWriteString(ExtHandle, c_copyright, 64);

FileWriteString(ExtHandle, c_symbol, 12);

FileWriteInteger(ExtHandle, 3, LONG_VALUE);

FileWriteInteger(ExtHandle, i_digits, LONG_VALUE);

FileWriteInteger(ExtHandle, 0, LONG_VALUE); //timesign

FileWriteInteger(ExtHandle, 0, LONG_VALUE); //last_sync

FileWriteArray(ExtHandle, i_unused, 0, 13);

//--- write history file

periodseconds=i_period*60;

start_pos=Bars-1;

rate.open=Open[start_pos];

rate.low=Low[start_pos];

rate.high=High[start_pos];

rate.tick_volume=(long)Volume[start_pos];

rate.spread=0;

rate.real_volume=0;

//--- normalize open time

rate.time=Time[start_pos]/periodseconds;

rate.time*=periodseconds;

for(i=start_pos-1; i>=0; i--)

{

if(IsStopped())

break;

time0=Time- 1 * 60 *TimeDelay_Minutes;

//--- history may be updated

if(i==0)

{

//--- modify index if history was updated

if(RefreshRates())

i=iBarShift(NULL,0,time0);

}

//---

if((time0>=rate.time+periodseconds || i==0)&& MainTime(time0)==true)

{

if(i==0)

{

rate.time=time0/periodseconds; //NEU

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;

FileWriteStruct(ExtHandle,rate);

cnt++;

if(time0>=rate.time+periodseconds)

{

rate.time=time0/periodseconds;

rate.time*=periodseconds;

rate.open=Open;

rate.low=Low;

rate.high=High;

rate.close=Close;

rate.tick_volume=last_volume;

}

}

else if(MainTime(time0)==true)

{

rate.time=time0/periodseconds; //NEU

rate.tick_volume+=(long)Volume;

if(rate.low>Low)

rate.low=Low;

if(rate.high<High)

rate.high=High;

rate.close=Close;

}

}

FileFlush(ExtHandle);

//Print(cnt," record(s) written");

//--- collect incoming ticks

datetime last_time=LocalTime()-5;

while(!IsStopped())

{

datetime cur_time=LocalTime();

//--- check for new rates

if(RefreshRates())

{

time0=Time[0]- 1 * 60 *TimeDelay_Minutes;

FileSeek(ExtHandle,last_fpos,SEEK_SET);

//--- is there current bar?

if(time0<rate.time+periodseconds && MainTime(time0)==true)

{

rate.tick_volume+=(long)Volume[0]-last_volume;

last_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];

}

else if(MainTime(time0)==true)

{

//--- no, there is new bar

rate.tick_volume+=(long)Volume[1]-last_volume;

if(rate.low>Low[1])

rate.low=Low[1];

if(rate.high<High[1])

rate.high=High[1];

//--- write previous bar remains

FileWriteStruct(ExtHandle,rate);

last_fpos=FileTell(ExtHandle);

//----

rate.time=time0/periodseconds;

rate.time*=periodseconds;

rate.open=Open[0];

rate.low=Low[0];

rate.high=High[0];

rate.close=Close[0];

rate.tick_volume=(long)Volume[0];

last_volume=rate.tick_volume;

}

//----

FileWriteStruct(ExtHandle,rate);

FileFlush(ExtHandle);

//---

if(hwnd==0)

{

hwnd=WindowHandle(Symbol(),i_period);

if(hwnd!=0)

Print(" "); //Chart window detected

}

//--- refresh window not frequently than 1 time in 2 seconds

if(hwnd!=0 && cur_time-last_time>=2)

{

PostMessageA(hwnd,WM_COMMAND,33324,0);

last_time=cur_time;

}

}

Sleep(50);

}

//---

}

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

//---

if(ExtHandle>=0)

{

FileClose(ExtHandle);

ExtHandle=-1;

}

//---

}

ファイルに書き込む 前に、単純にrate.timeに 時間的なずれを加えて(加算は正でも負でもよい)、ファイルに書き込んだら、元の値に戻したらどうでしょう?

 
mladen:
MrWigglesworth タイプ4としてDEMAを追加したバージョンはこちらです :ma__dema_crossover_with_arrow_and_email.mq4

MLadenさん、こんにちは。

本日はいかがお過ごしでしょうか?5DEMAと12DEMAのインジケータのチャートを添付します。また、チャート上にはあなたが改造したma+DEMAインジケータもあります。5-ma1と12-ma2に設定し、両方のMAにタイプ4(DEMA)を選択しました...矢印からわかるように、線と一致していないようです...何が悪いのか、何かお考えはありませんか?ありがとうございました。

 
MrWigglesworth:
MLadenさん、こんにちは。

本日はいかがお過ごしでしょうか?5DEMAと12DEMAのインディケータを使ったチャートを添付します。また、チャート上には、あなたが改造したma+DEMAインディケータもあります。5-ma1と12-ma2に設定し、両方のMAにタイプ4(DEMA)を選択しました...矢印からわかるように、線と一致していないようです...何が問題なのか、何かお考えがあれば教えてください。ありがとうございました。

ところで、私が使っているDEMAインジケータは こちらです。

ファイル:
dema_1.mq4  4 kb
 
MrWigglesworth:
こんにちは、MLadenさん。

本日はいかがお過ごしでしょうか?5DEMAと12DEMAのインディケータを使ったチャートを添付します。また、チャート上には、あなたが改造したma+DEMAインディケータもあります。5-ma1と12-ma2に設定し、両方のMAにタイプ4(DEMA)を選択しました...矢印からわかるように、線と一致していないようです...何が問題なのか、何かお考えがあれば教えてください。ありがとうございました。

比較のためにどのようなデモを使用していますか?

念のためですが、demaはemaのemaではなく、emaの2倍とemaのema.の差です。

その計算式は、ここにもあります。二重指数移動平均 - MetaTrader 5 ヘルプ

よろしくお願いします。

 
mladen:
比較のためにどのようなデモを使用していますか?

上記の投稿2631に添付されたDEMA.mq4を見てください...役に立ちましたか?

 
mladen:
比較のためにどのようなDEMAを使用していますか?

注意:demaはemaのemaではなく、emaの2倍とemaのemaの差です。

そのための式は、ここでも見つけることができます。ダブル指数移動平均 - MetaTrader 5 ヘルプ

よろしくお願いします。

5-SMA(赤)と5-DEMA(緑)の実用的な違いです。

ファイル: