und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
Fast iBarShift und Bars für MT5 - Bibliothek für den MetaTrader 5
- Ansichten:
- 775
- Rating:
- Veröffentlicht:
- 2018.06.22 09:48
- Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Es gibt viele Versionen von iBarShift für MetaTrader 5. Diese Version ist jedoch besonders einfach, schnell und korrekt.
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false) { int Res=iBars(Symb,TimeFrame,time+1,UINT_MAX); if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==iBars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1); return(Res); }
Seit der Veröffentlichung dieses Codes hat die in dieser iBarShift-Funktion verwendete integrierte Bars-Funktion einen Fehler, der sich im Programm für mehr als 10 Sekunden bemerkbar macht. Grundsätzlich geschieht dies, wenn die Funktion Bars den Wert Null zurückgeben muss.
Zum Beispiel bei der Ausführung des Codes:
Print("1"); Print(Bars(_Symbol,PERIOD_D1,D'2018.05.02 01:58:03',D'2018.05.02 12:56:11')); Print("2");
"2" wird erst nach mehr als 10 Sekunden nach "1" gedruckt.
Ich würde Ihnen empfehlen, die Standardfunktion Bars in Ihren Programmen durch diese iBars-Funktion zu ersetzen, besonders wenn Sie merkwürdige Verzögerungen für 10 Sekunden oder länger bemerken.
Die in dieser Include-Datei enthaltene iBars-Funktion behebt diese Unannehmlichkeiten und arbeitet durch den Algorithmus der Speicherung der vorhergehenden Werte wesentlich schneller.
int iBars(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime start_time,datetime stop_time) // stop_time > start_time { static string LastSymb=NULL; static ENUM_TIMEFRAMES LastTimeFrame=0; static datetime LastTime=0; static datetime LastTime0=0; static int PerSec=0; static int PreBars=0,PreBarsS=0,PreBarsF=0; static datetime LastBAR=0; static datetime LastTimeCur=0; static bool flag=true; static int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS); datetime TimeCur; if (timeframe==0) timeframe=_Period; const bool changeTF=LastTimeFrame!=timeframe; const bool changeSymb=LastSymb!=symbol_name; const bool change=changeTF || changeSymb || flag; LastTimeFrame=timeframe; LastSymb=symbol_name; if(changeTF) PerSec=::PeriodSeconds(timeframe); if(PerSec==0) { flag=true; return(0);} if(stop_time<start_time) { TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; } if(changeSymb) { if(!SymbolInfoInteger(symbol_name,SYMBOL_SELECT)) { SymbolSelect(symbol_name,true); ChartRedraw(); } } TimeCur=TimeCurrent(); if(timeframe==PERIOD_W1) TimeCur-=(TimeCur+345600)%PerSec; // 01.01.1970 - Thursday. Minus 4 days. if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec; if(start_time>TimeCur) { flag=true; return(0);} if(timeframe==PERIOD_MN1) { MqlDateTime dt; TimeToStruct(TimeCur,dt); TimeCur=dt.year*12+dt.mon; } if(changeTF || changeSymb || TimeCur!=LastTimeCur) LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE); LastTimeCur=TimeCur; if(start_time>LastBAR) { flag=true; return(0);} datetime tS,tF=0; if(timeframe==PERIOD_W1) tS=start_time-(start_time+345599)%PerSec-1; else if(timeframe<PERIOD_MN1) tS=start_time-(start_time-1)%PerSec-1; else // PERIOD_MN1 { MqlDateTime dt; TimeToStruct(start_time-1,dt); tS=dt.year*12+dt.mon; } if(change || tS!=LastTime) { PreBarsS=Bars(symbol_name,timeframe,start_time,UINT_MAX); LastTime=tS;} if(stop_time<=LastBAR) { if(PreBarsS>=max_bars) PreBars=Bars(symbol_name,timeframe,start_time,stop_time); else { if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec; else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time+345600)%PerSec; else // PERIOD_MN1 { MqlDateTime dt0; TimeToStruct(stop_time-1,dt0); tF=dt0.year*12+dt0.mon; } if(change || tF!=LastTime0) { PreBarsF=Bars(symbol_name,timeframe,stop_time+1,UINT_MAX); LastTime0=tF; } PreBars=PreBarsS-PreBarsF; } } else PreBars=PreBarsS; flag=false; return(PreBars); } //+------------------------------------------------------------------+ int iBars(string symbol_name,ENUM_TIMEFRAMES timeframe) {return(Bars(symbol_name,timeframe));} //+------------------------------------------------------------------+
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/20417
Der EA verwendet den Indikator Pivot-2 und den Oszillator Heiken Ashi Smoothed.
CCI - EMA basedAnstelle des einfachen gleitenden Durchschnitts wird ein EMA (einfacher gleitender Durchschnitt) verwendet, und anstelle der mittleren Abweichung wird die EMA-Abweichung verwendet (ursprünglich hier als EMA Deviation veröffentlicht).
Kein Indikator: Nur die Analyse der Preise von Open und Close. Eingabeparameter: Stop Loss, Take Profit, und Trailing.
ChannelEA2ChannelEA2 - ein Expert Advisor, der unter Verwendung von Pending-Orders mit einem Kanal arbeitet.