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
@Roman Konopelko
Deuxième problème, ou peut-être pouvez-vous me donner un indice.
J'essaie de créer une ligne avec des prix de clôture. Sur X en conséquence, je passe un tableau de temps. Mais le problème est que lors de la création d'une courbe, il ajoute les intervalles tout seul. C'est-à-dire qu'il uniformise le temps et ajoute un endroit où il n'y a pas de données.
Donc, je comprends que vous devez créer un type de courbe distinct - CURVE_TIMESERIES - il ne devrait pas trouver automatiquement une étape et ne pas ajouter d'écarts entre les points X.
C'est analogue à la façon dont vous avez créé une courbe sans passer par X - et alors toutes les valeurs sont égales, tout est purement lié à la taille du tableau X (m_xmax = m_size-1 ; m_xmin = 0.0 ; ).
@Roman Konopelko
Deuxième problème, ou peut-être pouvez-vous me donner un indice.
J'essaie de créer une ligne avec des prix de clôture. Sur X en conséquence, je passe un tableau de temps. Mais le problème est que lors de la création d'une courbe, il ajoute des intervalles. C'est-à-dire qu'il uniformise le temps et ajoute un endroit où il n'y a pas de données.
Donc, je comprends que vous devez créer un type de courbe séparé - CURVE_TIMESERIES - il ne devrait pas trouver automatiquement une étape et ne pas ajouter d'écarts entre les points X.
C'est analogue à la façon dont vous avez créé une courbe sans passer par X - et alors toutes les valeurs sont égales, tout est purement lié à la taille du tableau X (m_xmax = m_size-1 ; m_xmin = 0.0 ; ).
Le pas sur les deux axes est calculé automatiquement par l'algorithme intégré. D'après ce que j'ai compris, vous voulez définir vous-même le maximum, le minimum et le pas. Pour ce faire, vous pouvez passer en mode manuel pour la mise à l'échelle des axes :
xAxis.AutoScale(false); // отключаем автомасштабирование
xAxis.Min(0); // указываем минимальное значение по X
xAxis.Max(10); // указываем максимальное значение по X
xAxis.DefaultStep(1); // указываем шаг по X
Une autre chose à prendre en compte est le nombre maximum de valeurs autorisées sur l'axe MaxLabels, il doit être supérieur à (Max-Min)/DefaultStep, sinon le pas sera modifié.
Le pas pour les deux axes est calculé automatiquement par l'algorithme intégré. D'après ce que j'ai compris, vous voulez définir vous-même le maximum, le minimum et le pas. Pour ce faire, vous pouvez passer en mode manuel pour la mise à l'échelle des axes
Vous devez également tenir compte de l'axe maxLabels, il doit être supérieur à (Max-Min)/DefaultStep, sinon l'étape sera modifiée.
Oui, c'est quelque chose.
Mais comme je vous l'ai expliqué - votre échelle est uniforme.
Quelle que soit la façon dont vous le présentez - vous faites une échelle X, et vous visez la coordonnée en pixels.
Eh bien, vous ne pouvez pas faire ça avec une série chronologique.
Voyez ce que vous obtenez
//+------------------------------------------------------------------+
void OnStart()
{
MqlRates rates[];
CopyRates(Symbol(), Period(), 0, 100, rates);
ArraySetAsSeries(rates, true);
int size=ArraySize(rates);
double arrY[], arrX[];
ArrayResize(arrX, size); ArrayResize(arrY, size);
for(int i=0; i<size; ++i) { arrX[i]=(double)rates[i].time; arrY[i]=rates[i].close; }
CGraphic graphic;
graphic.Create(0, "Rates", 0, 30, 30, 1600, 300);
CCurve* curve=NULL;
//curve=graphic.CurveAdd(arrY, CURVE_LINES, "Close");
curve=graphic.CurveAdd(arrX, arrY, CURVE_LINES, "Close");
CAxis *xAxis = graphic.XAxis(); // получаем ось X
xAxis.AutoScale(false); // отключаем автомасштабирование
xAxis.Min(arrX[size-1]); // указываем минимальное значение по X
xAxis.Max(arrX[0]); // указываем максимальное значение по X
xAxis.DefaultStep(10*(arrX[0]-arrX[size-1])/size); // указываем шаг по X
xAxis.MaxLabels((arrX[0]-arrX[size-1])/xAxis.DefaultStep()+1); // число значений по оси MaxLabels должно быть больше чем (Max-Min)/DefaultStep
curve.Visible(true);
graphic.Redraw();
graphic.Update();
}
et voici ce qu'il fait si vous ne lui passez pas le temps en X
la construction est graphiquement correcte
//+------------------------------------------------------------------+
void OnStart()
{
MqlRates rates[];
CopyRates(Symbol(), Period(), 0, 100, rates);
ArraySetAsSeries(rates, true);
int size=ArraySize(rates);
double arrY[];
ArrayResize(arrY, size); ArraySetAsSeries(arrY, size);
for(int i=0; i<size; ++i) arrY[i]=rates[i].close;
CGraphic graphic;
graphic.Create(0, "Rates", 0, 30, 30, 1600, 300);
CCurve* curve=NULL;
curve=graphic.CurveAdd(arrY, CURVE_LINES, "Close");
curve.Visible(true);
graphic.Redraw();
graphic.Update();
}
Oui, j'ai quelque chose.
Mais comme je vous l'ai expliqué - votre échelle est plate.
Peu importe comment vous le tournez - vous mettez à l'échelle par X, et visez la coordonnée en pixels.
Eh bien - vous ne pouvez pas faire cela lorsque vous tracez des séries chronologiques.
Voyez ce que vous obtenez
Il est fort probable que la possibilité de changer le format de sortie des axes sera implémentée, mais je ne peux pas dire exactement sous quelle forme.
En ce qui concerne "samedi et dimanche" dans votre exemple, qui forment une ligne droite. Pour vérifier votre exemple, je l'ai modifié et ajouté l'écriture des tableaux dans le fichier :
//+------------------------------------------------------------------+
void OnStart()
{
MqlRates rates[];
CopyRates(Symbol(),Period(),0,100,rates);
ArraySetAsSeries(rates,true);
int size=ArraySize(rates);
double arrY[],arrX[];
datetime arrTime[];
ArrayResize(arrX,size);
ArrayResize(arrY,size);
ArrayResize(arrTime,size);
int handle=FileOpen("result.txt",FILE_WRITE|FILE_TXT);
for(int i=0; i<size;++i)
{
arrTime[i]=rates[i].time;
arrX[i]=(double)rates[i].time;
arrY[i]=rates[i].close;
string str=TimeToString(arrTime[i])+"\t"+DoubleToString(arrY[i],3)+"\n";
FileWriteString(handle,str);
}
FileClose(handle);
CGraphic graphic;
graphic.Create(0,"Rates",0,30,30,1080,380);
CCurve *curve=graphic.CurveAdd(arrX,arrY,CURVE_LINES,"Close");
double min = arrX[ArrayMinimum(arrX)];
double max = arrX[ArrayMaximum(arrX)];
double step=(max-min)/10;
CAxis *xAxis = graphic.XAxis(); // получаем ось X
xAxis.AutoScale(false); // отключаем автомасштабирование
xAxis.Min(min); // указываем минимальное значение по X
xAxis.Max(max); // указываем максимальное значение по X
xAxis.DefaultStep(step); // указываем шаг по X
curve.Visible(true);
graphic.Redraw();
graphic.Update();
}
Et je l'ai tracé dans OpenOffice :
Ce graphique contient également une ligne droite, elle est donc intégrée dans les données (tableaux X et Y). Pour réaliser le graphique décrit dans le commentaire n° 24, vous devrez modifier manuellement vos données d'entrée (par exemple, supprimer les week-ends).
Il est probable que la possibilité de modifier le format de sortie des axes sera implémentée, mais je ne peux pas dire avec certitude sous quelle forme exactement.
Bonne nouvelle, merci.
Comme je l'ai déjà dit, vous n'avez pas besoin d'attendre la version officielle, mais postez des classes pour les tester ici.Bonne nouvelle, merci.
Comme je l'ai déjà dit, vous ne pouvez pas attendre le bureau de construction et mettre des classes pour les tests ici.{
AXIS_TYPE_DOUBLE,
AXIS_TYPE_DATETIME,
AXIS_TYPE_CUSTOM,
};
En annexe, juste au cas où, j'ai mis tous les fichiers de la bibliothèque.
En ce qui concerne votre message à servicedesk, oui, en effet, il n'y a pas de dates de samedi et de dimanche dans le tableau X. Je n'ai donc pas dit correctement que vous deviez réparer les données.
Mais nous pouvons quand même résoudre votre problème, en utilisant simplement AXIS_TYPE_CUSTOM.
double arrX[];
double arrY[];
//---
string TimeFirmat(double x)
{
return(TimeToString((datetime)arrX[ArraySize(arrX)-(int)x-1]));
}
//+------------------------------------------------------------------+
void OnStart()
{
MqlRates rates[];
CopyRates(Symbol(),Period(),0,100,rates);
ArraySetAsSeries(rates,true);
int size=ArraySize(rates);
ArrayResize(arrX,size);
ArrayResize(arrY,size);
for(int i=0; i<size;++i)
{
arrX[i]=(double)rates[i].time;
arrY[i]=rates[i].close;
}
CGraphic graphic;
graphic.Create(0,"Rates",0,30,30,780,380);
CCurve *curve=graphic.CurveAdd(arrY,CURVE_LINES,"Close");
CAxis *xAxis=graphic.XAxis(); // получаем ось X
xAxis.AutoScale(false);
xAxis.Type(AXIS_TYPE_CUSTOM);
xAxis.ValuesFunctionFormat(TimeFirmat);
xAxis.DefaultStep(20.0);
curve.Visible(true);
graphic.Redraw();
graphic.Update();
}
//+------------------------------------------------------------------+
Résultat :
Mais vous pouvez toujours résoudre votre problème en utilisant simplement AXIS_TYPE_CUSTOM.
J'ai jeté un coup d'oeil rapide au fichier Graphic.mqh.
Avez-vous décidé de laisser toutes les fonctions non virtuelles?
OK,
Peut-on au moins ***Les fonctions de tracé (HistogramPlot, LinesPlot, etc.) sont virtuelles ?
Car leurs capacités de "design" ne sont pas suffisantes pour la tâche (gradients lors du remplissage ou couleurs multiples dans le rendu).
J'ai jeté un coup d'oeil rapide au fichier Graphic.mqh.
Avez-vous décidé de laisser toutes les fonctions non virtuelles?
OK,
Peut-on au moins ***Les fonctions de tracé (HistogramPlot, LinesPlot, etc.) sont virtuelles ?
Car leurs capacités de "design" ne sont pas suffisantes pour la tâche (gradients lors du remplissage ou couleurs multiples dans le rendu).