Hilfe bei der Codierung - Seite 263

 
mladen:
MrWigglesworth Hier ist eine Version mit dema als Typ 4: ma__dema_crossover_with_arrow_and_email.mq4

Super! Vielen Dank für Ihre Hilfe MLaden

Frohe Feiertage!!

 

Weiß jemand, wie ich die GMT des Brokers automatisch (nicht meine eigene GMT) aus dem Code herausfinden kann?

 
techmac:
Weiß jemand, wie ich die GMT des Brokers automatisch (nicht meine eigene GMT) aus dem Code herausfinden kann?

Kein automatischer Weg für Makler (es gibt keine solche Informationen in allen Daten zur Verfügung - auch nicht in der neuen metatrader 4 - zumindest habe ich es nicht gefunden)

 

Hallo mladen,

ich habe eine Frage zu einem Skript gestellt, das ein paar Stunden vom aktuellen Chart weggeschnitten hat. Nun möchte ich bei jedem Balken eine Verzögerung einfügen, so dass ich einen Zeitversatz im Chart habe.

Ich habe es auf diese Weise versucht, aber es funktioniert nicht (wie ich denke)

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

Ich habe eine Frage zu einem Skript gestellt, das ein paar Stunden vom aktuellen Chart abweicht. Nun möchte ich bei jedem Balken eine Verzögerung einfügen, so dass ich einen Zeitversatz in meinem Chart habe.

Ich habe es auf diese Weise versucht, aber es funktioniert nicht (wie ich denke).

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;

}

//---

}

Warum fügst du nicht einfach eine Zeitverschiebung zu rate.time hinzu, bevor du in die Datei schreibst (die Addition kann positiv oder negativ sein) und stellst dann, wenn du die Datei geschrieben hast, den ursprünglichen Wert wieder her?

 
mladen:
MrWigglesworth Hier ist eine Version mit DEMA als Typ 4: ma__dema_crossover_with_arrow_and_email.mq4

Hallo Herr MLaden,

wie geht es Ihnen heute? Beigefügt ist ein Chart mit 5 und 12 DEMA Indikatoren...Auch auf dem Chart ist der ma+DEMA Indikator, den Sie modifiziert haben. Er ist auf 5-ma1 und 12-ma2 eingestellt und hat den Typ 4 (DEMA) für beide MA's gewählt...Wie Sie an den Pfeilen sehen können, scheinen sie nicht mit den Linien übereinzustimmen...Irgendwelche Ideen, was falsch ist? Vielen Dank!

 
MrWigglesworth:
Hallo Mr. MLaden,

Wie geht es Ihnen heute? Beigefügt ist ein Diagramm mit 5 und 12 DEMA Indikatoren...Auch auf dem Diagramm ist die ma+DEMA Indikator, den Sie geändert. Es ist auf 5-ma1 und 12-ma2 gesetzt und wählte Typ 4 (DEMA) für beide MA's...Wie Sie aus den Pfeilen sehen können, scheinen sie nicht mit den Linien übereinstimmen...Irgendwelche Gedanken auf, was falsch ist? Vielen Dank!

Oh, und übrigens, hier ist der DEMA-Indikator, den ich verwende, wenn es hilft

Dateien:
dema_1.mq4  4 kb
 
MrWigglesworth:
Hallo Herr MLaden,

Wie geht es Ihnen heute? Beigefügt ist ein Diagramm mit 5 und 12 DEMA Indikatoren...Auch auf dem Diagramm ist die ma+DEMA Indikator, den Sie geändert. Es ist auf 5-ma1 und 12-ma2 gesetzt und wählte Typ 4 (DEMA) für beide MA's...Wie Sie aus den Pfeilen sehen können, scheinen sie nicht mit den Linien übereinstimmen...Irgendwelche Gedanken auf, was falsch ist? Vielen Dank!

Welchen Dema verwenden Sie zum Vergleich?

Zur Erinnerung: dema ist nicht ein ema von einem ema, sondern eine Differenz von 2 x ema und ema. von ema

Die Formel dafür finden Sie auch hier: Double Exponential Moving Average - MetaTrader 5 Hilfe

mit freundlichen Grüßen

 
mladen:
Welche DEMA verwenden Sie zum Vergleich?

Siehe Beitrag 2631 oben mit angehängter DEMA.mq4... Hilft das?

 
mladen:
Welchen DEMA verwenden Sie zum Vergleich?

Zur Erinnerung: dema ist nicht ein ema von einem ema, sondern eine Differenz von 2 x ema und ema. von ema

Die Formel dafür finden Sie auch hier: Double Exponential Moving Average - MetaTrader 5 Hilfe

Grüße

Ja, ich bin mit DEMA vertraut, obwohl ich die Formel nie auswendig gelernt habe... Hier ist der praktische Unterschied zwischen einem 5-SMA (rot) und 5-DEMA (grün)

Dateien: