Artyom Trishkin: En quelque sorte (solution de @fxsaber) :
//+------------------------------------------------------------------+ //| Возвращает смещение бара по времени | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+
Quelqu'un a écrit quelque part que dans la ligne sélectionnée vous devriez faire ceci : if (time>=last_bar) res=0 ;
Je ne l'ai pas vérifié, pour être honnête - je ne le reçois pas tout le temps. Vérifiez-le et écrivez le résultat, s'il vous plaît.
Je l'ai écrit. Et c'est logique, car si l'heure coïncide avec l'heure d'ouverture de la barre actuelle, son indice sera également de 0. Oui, la solution fxsaber pure fonctionnera avec des erreurs.
Alexey Kozitsyn: Je ne sais pas si ma solution est "plus facile", mais essayez celle-ci : https://www.mql5.com/ru/forum/160945#comment_4053382.
Il n'y a pas de fonction standard dans la langue et chacun doit construire son propre vélo et ensuite mesurer ses performances?
Il semble que j'ai trouvé toutes les solutions sauf celle-ci, mais après avoir examiné les différentes solutions, il est évident qu'il s'agit de "qui peut faire quoi".
Il n'y a pas de fonction standard dans la langue et chacun doit construire son propre vélo et ensuite mesurer ses performances?
Il me semble avoir trouvé toutes les solutions sauf celle-ci, mais après avoir examiné les différentes solutions, il est évident qu'il s'agit de "qui peut faire quoi".
Il n'y en a pas de standard. Vous avez fourni une variante de l'article https://www.mql5.com/ru/articles/81. La "béquille" y est également décrite.
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
Après ce que j'ai vu aujourd'hui, j'ai commencé à douter de la justesse de ma décision.
Question : Quelle variante est la meilleure, car je suis en train d'apprendre ?
Dans ce cas, votre implémentation devrait fonctionner plus rapidement - car il y a moins d'appels à la copie - vous copiez trois valeurs à la fois au lieu d'une.
Bien que personne ne vous empêche de convertir le code pour obtenir une valeur à la fois :
//+------------------------------------------------------------------+ //| 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); }
en code pour obtenir plusieurs valeurs à la fois. Je suis juste paresseux :)
Dans ce cas, votre implémentation devrait fonctionner plus rapidement - car il y a moins d'appels de copie - vous copiez trois valeurs à la fois au lieu d'une à la fois.
Bien que personne ne vous empêche de convertir le code pour obtenir une valeur à la fois :
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) }
en code pour obtenir plusieurs valeurs à la fois. Je suis juste paresseux :)
Merci pour la réponse !
Donc, il vaut mieux appliquer la solution que j'ai postée ? Il suffit d'un contrôle, il n'y aura pas d'erreurs ?
Alors, est-il préférable d'appliquer la solution que j'ai postée ? Un seul contrôle suffit, il n'y aura pas d'erreurs ?
Votre solution n'est pas optimale non plus, car vous initialisez un tas de variables avec les valeurs du tableau que vous avez déjà. La question est : pourquoi ? Quand seul un tableau peut être utilisé ? Nommez-le Bars et vous serez heureux :
Votre solution n'est pas non plus optimale, car vous initialisez un tas de variables avec des valeurs provenant d'un tableau déjà dérivé. La question est : pourquoi ? Quand seul un tableau peut être utilisé ? Appelez-le Bars et vous serez heureux :
Vous l'appelezBars et le compilateur vous donne une tape sur les doigts. Avez-vous vérifié cette construction ou avez-vous simplement supposé qu'elle devait fonctionner, ou est-ce que je fais quelque chose de mal ?
En quelque sorte (solution de @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);
}
//+------------------------------------------------------------------+
Je ne l'ai pas vérifié, pour être honnête - je ne le reçois pas tout le temps. Vérifiez-le et écrivez le résultat, s'il vous plaît.
Je ne sais pas si ma solution est "plus facile", mais essayez celle-ci : https://www.mql5.com/ru/forum/160945#comment_4053382.
Il n'y a pas de fonction standard dans la langue et chacun doit construire son propre vélo et ensuite mesurer ses performances?
Il semble que j'ai trouvé toutes les solutions sauf celle-ci, mais après avoir examiné les différentes solutions, il est évident qu'il s'agit de "qui peut faire quoi".
Il n'y a pas de fonction standard dans la langue et chacun doit construire son propre vélo et ensuite mesurer ses performances?
Il me semble avoir trouvé toutes les solutions sauf celle-ci, mais après avoir examiné les différentes solutions, il est évident qu'il s'agit de "qui peut faire quoi".
Une dernière question. Aujourd'hui dans la base de code j'ai vu un code d'un "master", donc il utilise ceci :
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);
Hier encore, j'en ai écrit une semblable, mais de cette façon :
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;
Après ce que j'ai vu aujourd'hui, j'ai commencé à douter de la justesse de ma décision.
Question : Quelle option est la meilleure, car je suis en train d'apprendre ?
Une dernière question. Aujourd'hui dans la base de code j'ai vu un code d'un "master", donc il utilise ceci :
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);
Hier encore, j'ai écrit une chose similaire, mais de cette façon :
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;
Après ce que j'ai vu aujourd'hui, j'ai commencé à douter de la justesse de ma décision.
Question : Quelle variante est la meilleure, car je suis en train d'apprendre ?
Dans ce cas, votre implémentation devrait fonctionner plus rapidement - car il y a moins d'appels à la copie - vous copiez trois valeurs à la fois au lieu d'une.
Bien que personne ne vous empêche de convertir le code pour obtenir une valeur à la fois :
//| 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);
}
en code pour obtenir plusieurs valeurs à la fois. Je suis juste paresseux :)
Dans ce cas, votre implémentation devrait fonctionner plus rapidement - car il y a moins d'appels de copie - vous copiez trois valeurs à la fois au lieu d'une à la fois.
Bien que personne ne vous empêche de convertir le code pour obtenir une valeur à la fois :
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
}
en code pour obtenir plusieurs valeurs à la fois. Je suis juste paresseux :)
Merci pour la réponse !
Donc, il vaut mieux appliquer la solution que j'ai postée ? Il suffit d'un contrôle, il n'y aura pas d'erreurs ?
Merci pour la réponse !
Alors, est-il préférable d'appliquer la solution que j'ai postée ? Un seul contrôle suffit, il n'y aura pas d'erreurs ?
CopyRates a besoin d'au moins deux contrôles :
Merci pour la réponse !
Alors, est-il préférable d'appliquer la solution que j'ai postée ? Un seul contrôle suffit, il n'y aura pas d'erreurs ?
Votre solution n'est pas optimale non plus, car vous initialisez un tas de variables avec les valeurs du tableau que vous avez déjà. La question est : pourquoi ? Quand seul un tableau peut être utilisé ? Nommez-le Bars et vous serez heureux :
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
Votre solution n'est pas non plus optimale, car vous initialisez un tas de variables avec des valeurs provenant d'un tableau déjà dérivé. La question est : pourquoi ? Quand seul un tableau peut être utilisé ? Appelez-le Bars et vous serez heureux :
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
Vous l'appelezBars et le compilateur vous donne une tape sur les doigts. Avez-vous vérifié cette construction ou avez-vous simplement supposé qu'elle devait fonctionner, ou est-ce que je fais quelque chose de mal ?
AppeléBars, le compilateur est grondé comme l'enfer. Avez-vous testé cette conception, ou avez-vous simplement supposé qu'elle devait fonctionner ?