
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
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?
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;
}
//---
}
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?
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!
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
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
What dema are you using for comparison?
See post 2631 above with attached DEMA.mq4...Does that help?
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
regardsYes I am familiar with DEMA though never memorized the formula...Here is the practical difference between a 5-SMA (red) and 5-DEMA (green)