//+------------------------------------------------------------------+ //| Возвращает смещение бара по времени | //+------------------------------------------------------------------+ int GetBarShift(conststring symbol_name, constENUM_TIMEFRAMES timeframe, constdatetime time) { int res=-1; datetime last_bar; if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) { if(time>last_bar) res=0; else { constint shift=Bars(symbol_name,timeframe,time,last_bar); if(shift>0) res=shift-1; } } return(res); } //+------------------------------------------------------------------+
Jemand schrieb irgendwo, dass man in der ausgewählten Zeile folgendes tun sollte: if (time>=last_bar) res=0;
Ich habe es nicht überprüft, um ehrlich zu sein - ich bekomme es nicht immer. Prüfen Sie es und schreiben Sie bitte das Ergebnis.
Ich habe es geschrieben. Und das ist logisch, denn wenn die Zeit mit der Eröffnungszeit des aktuellen Balkens übereinstimmt, wird sein Index auch 0 sein. Ja, die reine fxsaber-Lösung wird mit Fehlern funktionieren.
Alexey Kozitsyn: Ich weiß nicht, ob meine Lösung "einfacher" ist, aber versuchen Sie diese: https://www.mql5.com/ru/forum/160945#comment_4053382
Gibt es keine Standardfunktion in der Sprache und muss jeder sein eigenes Fahrrad bauen und dann seine Leistung messen?
Es scheint, dass ich alle gefunden habe, außer dieser einen, aber nachdem ich mir verschiedene Lösungen angesehen habe, ist es offensichtlich, dass sie "wer kann was" sind.
Gibt es keine Standardfunktion in der Sprache und muss jeder sein eigenes Fahrrad bauen und dann die Leistung messen?
Ich scheine alle bis auf diese eine gefunden zu haben, aber nachdem ich mir die verschiedenen Lösungen angeschaut habe, ist es offensichtlich, dass sie "wer kann was" sind.
Es gibt keine Standardlösung. Sie haben eine Variante aus dem Artikel https://www.mql5.com/ru/articles/81 bereitgestellt. Auch die "Krücke" wird dort beschrieben.
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
Nach dem, was ich heute gesehen habe, begann ich irgendwie an der Richtigkeit meiner Entscheidung zu zweifeln.
Frage: Welche Variante ist besser, denn ich lerne gerade erst?
In diesem Fall sollte Ihre Implementierung schneller funktionieren, da es weniger Aufrufe zum Kopieren gibt - Sie kopieren drei Werte auf einmal statt einem.
Allerdings hält Sie niemand davon ab, Code zu konvertieren, um jeweils einen Wert zu erhalten:
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=Period(); doubleClose[1]; double close=0; int copied=CopyClose(symbol,timeframe,index,1,Close); if(copied>0) close=Close[0]; return(close); }
in den Code, um mehrere Werte auf einmal zu erhalten. Ich bin einfach zu faul :)
In diesem Fall sollte Ihre Implementierung schneller funktionieren, da es weniger Kopieraufrufe gibt - Sie kopieren drei Werte auf einmal statt einen nach dem anderen.
Allerdings hindert Sie niemand daran, den Code so zu konvertieren, dass Sie jeweils einen Wert erhalten:
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) }
in den Code, um mehrere Werte auf einmal zu erhalten. Ich bin einfach zu faul :)
Vielen Dank für die Antwort!
Also ist es besser, die Lösung anzuwenden, die ich gepostet habe? Es reicht eine Prüfung, es wird keine Fehler geben?
Ist es also besser, die von mir gepostete Lösung anzuwenden? Reicht eine Prüfung aus, um keine Fehler zu erhalten?
Ihre Lösung ist auch nicht optimal, denn Sie initialisieren eine Reihe von Variablen mit Werten aus dem Array, das Sie bereits haben. Die Frage ist: Warum? Wann darf nur ein Array verwendet werden? Nennen Sie es Bars und Sie werden glücklich sein:
Ihre Lösung ist auch nicht optimal, weil Sie eine Reihe von Variablen mit Werten aus einem bereits abgeleiteten Array initialisieren. Die Frage ist: Warum? Wann darf nur ein Array verwendet werden? Nennen Sie es einfach Bars und Sie werden zufrieden sein:
Sie nennen esBars und der Compiler gibt Ihnen einen Klaps auf die Hand. Haben Sie dieses Konstrukt überprüft oder sind Sie einfach davon ausgegangen, dass es funktionieren sollte, oder mache ich etwas falsch?
Ruft manBars auf, wird der Compiler höllisch gescholten. Haben Sie diesen Entwurf getestet oder sind Sie einfach davon ausgegangen, dass er funktionieren sollte?
Irgendwie (Lösung von @fxsaber):
//| Возвращает смещение бара по времени |
//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
int res=-1;
datetime last_bar;
if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
if(time>last_bar) res=0;
else {
const int shift=Bars(symbol_name,timeframe,time,last_bar);
if(shift>0) res=shift-1;
}
}
return(res);
}
//+------------------------------------------------------------------+
Ich habe es nicht überprüft, um ehrlich zu sein - ich bekomme es nicht immer. Prüfen Sie es und schreiben Sie bitte das Ergebnis.
Ich weiß nicht, ob meine Lösung "einfacher" ist, aber versuchen Sie diese: https://www.mql5.com/ru/forum/160945#comment_4053382
Gibt es keine Standardfunktion in der Sprache und muss jeder sein eigenes Fahrrad bauen und dann seine Leistung messen?
Es scheint, dass ich alle gefunden habe, außer dieser einen, aber nachdem ich mir verschiedene Lösungen angesehen habe, ist es offensichtlich, dass sie "wer kann was" sind.
Gibt es keine Standardfunktion in der Sprache und muss jeder sein eigenes Fahrrad bauen und dann die Leistung messen?
Ich scheine alle bis auf diese eine gefunden zu haben, aber nachdem ich mir die verschiedenen Lösungen angeschaut habe, ist es offensichtlich, dass sie "wer kann was" sind.
Eine letzte Frage. Heute in der Codebasis sah ich einen Code von einem "Master", so dass es diese verwendet:
double open_2=iOpen(2);
double high_0=iHigh(0);
double high_1=iHigh(1);
double high_2=iHigh(2);
double high_3=iHigh(3);
double low_0=iLow(0);
double low_1=iLow(1);
double low_2=iLow(2);
double low_3=iLow(3);
double close_1=iClose(1);
double close_2=iClose(2);
Erst gestern habe ich einen ähnlichen Beitrag geschrieben, allerdings in dieser Form:
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
open1 = Tick[0].open; open2 = Tick[1].open; open3 = Tick[2].open;
high1 = Tick[0].high; high2 = Tick[1].high; high3 = Tick[2].high;
low1 = Tick[0].low; low2 = Tick[1].low; low3 = Tick[2].low;
close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;
Nach dem, was ich heute gesehen habe, begann ich irgendwie an der Richtigkeit meiner Entscheidung zu zweifeln.
Frage: Welche Option ist besser, denn ich lerne gerade erst?
Eine letzte Frage. Heute in der Codebasis sah ich einen Code von einem "Master", so dass es diese verwendet:
double open_2=iOpen(2);
double high_0=iHigh(0);
double high_1=iHigh(1);
double high_2=iHigh(2);
double high_3=iHigh(3);
double low_0=iLow(0);
double low_1=iLow(1);
double low_2=iLow(2);
double low_3=iLow(3);
double close_1=iClose(1);
double close_2=iClose(2);
Erst gestern habe ich etwas Ähnliches geschrieben, allerdings in dieser Form:
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
open1 = Tick[0].open; open2 = Tick[1].open; open3 = Tick[2].open;
high1 = Tick[0].high; high2 = Tick[1].high; high3 = Tick[2].high;
low1 = Tick[0].low; low2 = Tick[1].low; low3 = Tick[2].low;
close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;
Nach dem, was ich heute gesehen habe, begann ich irgendwie an der Richtigkeit meiner Entscheidung zu zweifeln.
Frage: Welche Variante ist besser, denn ich lerne gerade erst?
In diesem Fall sollte Ihre Implementierung schneller funktionieren, da es weniger Aufrufe zum Kopieren gibt - Sie kopieren drei Werte auf einmal statt einem.
Allerdings hält Sie niemand davon ab, Code zu konvertieren, um jeweils einen Wert zu erhalten:
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
{
if(symbol==NULL)
symbol=Symbol();
if(timeframe==0)
timeframe=Period();
double Close[1];
double close=0;
int copied=CopyClose(symbol,timeframe,index,1,Close);
if(copied>0) close=Close[0];
return(close);
}
in den Code, um mehrere Werte auf einmal zu erhalten. Ich bin einfach zu faul :)
In diesem Fall sollte Ihre Implementierung schneller funktionieren, da es weniger Kopieraufrufe gibt - Sie kopieren drei Werte auf einmal statt einen nach dem anderen.
Allerdings hindert Sie niemand daran, den Code so zu konvertieren, dass Sie jeweils einen Wert erhalten:
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
}
in den Code, um mehrere Werte auf einmal zu erhalten. Ich bin einfach zu faul :)
Vielen Dank für die Antwort!
Also ist es besser, die Lösung anzuwenden, die ich gepostet habe? Es reicht eine Prüfung, es wird keine Fehler geben?
Vielen Dank für die Antwort!
Ist es also besser, die von mir gepostete Lösung anzuwenden? Reicht eine Prüfung aus, dann gibt es keine Fehler?
CopyRates benötigt mindestens zwei Prüfungen:
Vielen Dank für die Antwort!
Ist es also besser, die von mir gepostete Lösung anzuwenden? Reicht eine Prüfung aus, um keine Fehler zu erhalten?
Ihre Lösung ist auch nicht optimal, denn Sie initialisieren eine Reihe von Variablen mit Werten aus dem Array, das Sie bereits haben. Die Frage ist: Warum? Wann darf nur ein Array verwendet werden? Nennen Sie es Bars und Sie werden glücklich sein:
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
Ihre Lösung ist auch nicht optimal, weil Sie eine Reihe von Variablen mit Werten aus einem bereits abgeleiteten Array initialisieren. Die Frage ist: Warum? Wann darf nur ein Array verwendet werden? Nennen Sie es einfach Bars und Sie werden zufrieden sein:
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
Sie nennen esBars und der Compiler gibt Ihnen einen Klaps auf die Hand. Haben Sie dieses Konstrukt überprüft oder sind Sie einfach davon ausgegangen, dass es funktionieren sollte, oder mache ich etwas falsch?
Ruft manBars auf, wird der Compiler höllisch gescholten. Haben Sie diesen Entwurf getestet oder sind Sie einfach davon ausgegangen, dass er funktionieren sollte?