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
Bon les gars, la première partie est faite (lecture des taux de toutes les paires).
Maintenant je dois utiliser les taux de toutes les paires copiées avec la fonction ArrayCopyRates pour créer des indicateurs graphiques comme un RSI... comme je le dessine dans l'image ci-dessous :
Dans ma question initiale, j'ai l'intention de savoir comment faire cela... et non de lire les taux. Je ne pense pas que j'aurai besoin de copier les taux avant de les dessiner, mais il était bon de savoir comment faire... maintenant je dois juste découvrir un moyen de diviser la zone de l'indicateur pour tracer toutes les paires...
Il n'y a aucun moyen de diviser la zone de l'indicateur. Tout doit être dessiné séparément, pas de tampons, pas de mise à l'échelle automatique. Voir
Avez-vous vu une telle image ? (MetaQuotes Software Corp.) - MQL4 forum - Page 12
Avez-vous vu une telle image ? (MetaQuotes Software Corp.) - MQL4 forum - Page 14
Avez-vous vu une telle photo ? (MetaQuotes Software Corp.) - MQL4 forum - Page 36
Il n'y a aucun moyen de diviser la zone de l'indicateur. Tout doit être dessiné séparément, pas de tampons, pas de mise à l'échelle automatique. Voir
Avez-vous vu une telle image ? (MetaQuotes Software Corp.) - MQL4 forum - Page 12
Avez-vous vu une telle image ? (MetaQuotes Software Corp.) - MQL4 forum - Page 14
Avez-vous vu une telle photo ? (MetaQuotes Software Corp.) - MQL4 forum - Page 36
C'est un indicateur que j'ai trouvé quelque part, je n'ai jamais essayé de le déchiffrer. Il montre une représentation de 3 timeframes du graphique actuel. Ce qui est fou, c'est que les bougies sont dessinées avec des histogrammes. C'est joli mais ce n'est pas ce qui m'intéresse en ce moment.
Meilleurs voeux
Une mise à jour pour ceux qui suivent ce fil !
J'ai aidé l'OP via PM à corriger son code car il a des difficultés en anglais et nous parlons tous les deux portugais. Lors de nos tests, nous sommes tombés sur un autre phénomène "bizarre" qui se produit avec la fonction"ArrayCopyRates()". Lorsque l'on utilise un tableau MqlRates avec"ArrayCopyRates()" dans un EA, le tableau de données est un tableau virtuel qui rapporte toujours l'état actuel des choses, donc les données sont toujours fraîches.
Cependant, dans un Indicateur, cela ne semble pas être le cas. Le tableau n'est pas une copie virtuelle mais plutôt une copie statique fixée dans le temps au moment où"ArrayCopyRates()" a été appelé. Les données ne sont pas mises à jour lorsque le symbole est différent du symbole du graphique. Lorsqu'il s'agit du même symbole que le graphique, les données du tableau sont "vivantes" et se mettent à jour comme prévu, mais lorsqu'il s'agit d'un autre symbole, il s'agit d'une copie statique.
Donc, pour que cela fonctionne dans un indicateur, on doit appeler la fonction "ArrayCopyRates()" à chaque appel à l'événement OnCalculate() si des données fraîches sont nécessaires.
Pour développer vos conclusions, Fernando, même si le symbole est le même que celui du graphique, si l'horizon temporel est différent, le tableau est statique.
Donc pour avoir une copie virtuelle, dans un indicateur, il doit s'agir du même symbole ET de la même période. Tout le reste est statique.
En supposant que nous sommes en milieu de semaine, pour trouver le haut et le bas du jour précédent, j'utilise simplement :
Lo = iLow(NULL, PERIOD_D1, 1);
C'est bien, mais maintenant je dois trouver le jour précédent à quelle heure était le plus haut et le plus bas. J'ai décidé d'approximer l'heure de la bougie d'une heure au plus haut et au plus bas en utilisant iHighest et iLowest. Et c'est là que les problèmes ont commencé.
PrevDayEnd = iBarShift(NULL, PERIOD_H1, iTime(NULL, PERIOD_D1, 0)-1);
PrevDayBegin--;
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1);
ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1);
ArrayCopyRates(mqlrates_array,NULL,0);
OnInit();
:
isHistoryLoading = true;
:
OnCalculate( ... )
:
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
if(isHistoryLoading)
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_D1,0) > 0) && (iTime(NULL,PERIOD_D1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_H1,0) > 0) && (iTime(NULL,PERIOD_H1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array,NULL,0)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,0,0) > 0) && (iTime(NULL,0,1) > 0))
{
isHistoryLoading = false;
if(DebugLog)
Print("Chart up-to-date!");
}
}
}
}
}
}
}
}
}
}
if(isHistoryLoading)
{
if(DebugLog)
Print("Waiting for chart to update!");
return(rates_total);
}
:
:
if(ObjectFind(Trend2Name) != -1) // Check whether mid range line exists
{
if((TimeDay(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeDay(TimeCurrent()))
&& (TimeMonth(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeMonth(TimeCurrent()))
&& (TimeYear(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeYear(TimeCurrent()))) // Indicator has already been ploted today
{
return(rates_total);
}
else // Indicator exists but in a past date, so delete it and plot it on current day
{
if(DebugLog)
Print("Indicator in a past date! Deleting it and creating it today!");
if(ObjectFind(FibName) != -1)
FiboLevelsDelete(0,FibName);
// Indicator will be created by the OnChartEvent() when it detects the fib was deleted.
}
}
else // Indicator doesn't exist, so create it
{
if(DebugLog)
Print("Indicator doesn't exist! Creating it.");
CreateIndicator();
}
:
Après quelques ticks, les données sont partiellement chargées et le morceau de code ci-dessus détectera que les lignes ont été tracées sur un jour précédent, supprimera la fib et déclenchera un recalcul des plages et un redessin des objets (c'est-à-dire fib, lignes de tendance, etc).
CurrDayBegin = iTime(NULL, PERIOD_D1, 0);
while(TimeDayOfWeek(iTime(NULL, PERIOD_H1, iBarShift(NULL, PERIOD_H1, CurrDayBegin))) != TimeDayOfWeek(TimeCurrent()))
// If iBarShift can't find the 0am candle and returns the 11pm candle of prev day.
CurrDayBegin = CurrDayBegin + 3600; // Move 1h until you find the 1st candle of today.Voici des captures d'écran de l'indicateur :
(1) Calculé en utilisant un historique incomplet (remarquez que les lignes horizontales ne commencent pas au début de la journée).
(2) Recalculé en utilisant l'historique complet (les lignes horizontales commencent au début de la journée)