Coding help - page 263

 
mladen:
MrWigglesworth Here is a version with dema added as type 4 : ma__dema_crossover_with_arrow_and_email.mq4

Great! Many thanks for your help MLaden

Happy Holidays!!

 

Does anybody now how can I find out the GMT of the broker automatically (not my own GMT) from code?

 
techmac:
Does anybody now how can I find out the GMT of the broker automatically (not my own GMT) from code?

No automatic way for broker (there is no such information available in all the data - not even in the new metatrader 4 - at least I haven't found it)

 

Hi mladen,

I have asked a question about a script which cutted a few hours away from the actual chart. Now I want to put in a delay on each bar, so that I have a timeoffset in my chart.

I tried it that way, but it doesn't work (like I think)

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:
Hi mladen,

I have asked a question about a script which cutted a few hours away from the actual chart. Now I want to put in a delay on each bar, so that I have a timeoffset in my chart.

I tried it that way, but it doesn't work (like I think)

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;

}

//---

}

Why don't you simply add some time shift to rate.time prior to writing to file (addition can be positive or negative) and then, when you wrote the filed to the file, revert the original value of it?

 
mladen:
MrWigglesworth Here is a version with dema added as type 4 : ma__dema_crossover_with_arrow_and_email.mq4

Hello Mr. MLaden,

How are you today? Attached is a chart with 5 and 12 DEMA indicators..Also on the chart is the ma+DEMA indicator you modified. It is set to 5-ma1 and 12-ma2 and chose type 4 (DEMA) for both MA's...As you can see from the arrows, they don't seem to match up with the lines...Any thoughts on what's wrong? Thanks much!

 
MrWigglesworth:
Hello Mr. MLaden,

How are you today? Attached is a chart with 5 and 12 DEMA indicators..Also on the chart is the ma+DEMA indicator you modified. It is set to 5-ma1 and 12-ma2 and chose type 4 (DEMA) for both MA's...As you can see from the arrows, they don't seem to match up with the lines...Any thoughts on what's wrong? Thanks much!

Oh and by the way here is the DEMA indicator I'm using if it helps

Files:
dema_1.mq4  4 kb
 
MrWigglesworth:
Hello Mr. MLaden,

How are you today? Attached is a chart with 5 and 12 DEMA indicators..Also on the chart is the ma+DEMA indicator you modified. It is set to 5-ma1 and 12-ma2 and chose type 4 (DEMA) for both MA's...As you can see from the arrows, they don't seem to match up with the lines...Any thoughts on what's wrong? Thanks much!

What dema are you using for comparison?

Just to remind : dema is not an ema of an ema but a difference of 2 x ema and ema. of ema

Formula for that can be found even here : Double Exponential Moving Average - MetaTrader 5 Help

regards

 
mladen:
What dema are you using for comparison?

See post 2631 above with attached DEMA.mq4...Does that help?

 
mladen:
What dema are you using for comparison?

Just to remind : dema is not an ema of an ema but a difference of 2 x ema and ema. of ema

Formula for that can be found even here : Double Exponential Moving Average - MetaTrader 5 Help

regards

Yes I am familiar with DEMA though never memorized the formula...Here is the practical difference between a 5-SMA (red) and 5-DEMA (green)

Files:
Reason: