Questions des débutants MQL5 MT5 MetaTrader 5 - page 729
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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 ?