Au lieu de Close[2] mettez la valeur de l'indicateur sur la deuxième barre (par exemple iRSI(.......,2) ) et au lieu de Close[1] mettez la valeur de l'indicateur sur la première barre. Et uroven est la valeur du niveau.
Pouvez-vous me dire si quelqu'un a vu un volume latéral du jour sur le côté droit du graphique pour mt5, pour mt4 je l'ai trouvé ici https://www.mql5.com/ru/code/9777. J'ai deux variantes : soit réécrire les variables dedans, soit en trouver une toute faite. Ou alors je ne vois pas l'intérêt de commander ,,,,,,, , je dois vérifier une théorie d'équilibre ,,,,. J'ai trouvé un travail pour mt5 où le profil de la journée d'hier est dessiné à gauche mais il y a un inconvénient important, il ne montre pas ce qui se passe aujourd'hui. Je veux donc ajouter au graphique des informations sur le côté droit de ce qui se passe au moment de la négociation.
Tral_Start__Upgr est assimilé à une variable externe de type int et égale à 5.
Tral_Size__Upgr est pareillement égal à 4
TV - valeur de coche, =10
SumLotSellDBL = 0.04
Je l'ai lu. J'ai vu comment cela fonctionnerait si Tral_Start__Upgr, Tral_Size__Upgr et leurs variables externes étaient définies comme des doubles. C'est-à-dire lorsque tout est du même type sans aucune conversion ni perte de données. Le résultat est le même. Qu'est-ce que j'ai fait de mal ?
Maria Baburina: Lisez. J'ai vu comment cela fonctionnerait si Tral_Start__Upgr, Tral_Size__Upgr et leurs variables externes étaient définies comme des doubles. C'est-à-dire lorsque tout est du même type sans aucune conversion ni perte de données. Le résultat est le même. Qu'est-ce que j'ai fait de mal ?
Un aveugle qui parle à un sourd. Si vous voulez que quelqu'un le teste, vous avez besoin du code minimum possible qui peut être compilé sur une autre machine et testé. Pas de code - rien à dire.
#property indicator_chart_window#property indicator_buffers1#property indicator_plots1class CLASS
{
public:
double Buffer[];
CLASS( void )
{
SetIndexBuffer(0, this.Buffer);
}
};
CLASS* Class;
voidOnInit( void )
{
Class = new CLASS;
delete Class;
Class = new CLASS;
Class.Buffer[0] = 0; // array out of rangedelete Class;
return;
}
intOnCalculate( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[] )
{
return(rates_total);
}
En quatre, ça a bien marché ! En cinq, c'est une déception. Est-ce une autre limitation architecturale par rapport au quadruple ? Donnez-moi un lien vers une discussion sur ce sujet, je ne l'ai pas trouvé moi-même.
Ai-je bien compris que vous ne pouvez affecter quoi que ce soit aux tampons des indicateurs qu'après le premier appel du terminal lui-même (pas manuellement) à OnCalculate ?
comp: Ai-je bien compris que l'on ne peut affecter quelque chose aux tampons d'indicateurs qu'après le premier appel du terminal (non manuel) OnCalculate ?
Les tampons des indicateurs sont accessibles après l'appel de OnCalculate(). En même temps, le tampon indicateur lui-même doit être déclaré dans la zone des variables globales:
Les tampons des indicateurs sont accessibles après l'appel de OnCalculate().
Il s'avère que vous avez tort. Vous ne pouvez appliquer que lorsque le terminal appelle OnCalculate. Dans ce cas, la condition dans MT4 est plus souple, car il suffit d'appeler OnCalculate une seule fois. Et dans MT5, vous devez attendre l'appel de OnCalculate par le terminal lui-même chaque fois après le SetIndexBuffer. Preuve
#property strict#property indicator_chart_window#property indicator_buffers1#ifdef __MQL5__#property indicator_plots1#endif
#ifdef __MQL5__#define TRUEtrue#define FALSEfalse#endif
class CLASS
{
public:
double Buffer[];
CLASS( void )
{
::SetIndexBuffer(0, this.Buffer);
}
#define TIMESERIES(X) \
::ArraySetAsSeries(X, TRUE); \
Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);
staticint FullOnCalculate( void )
{
int Spread[];
long RealVolume[];
int Size = INT_MAX;
#ifdef __MQL4__constint bars = ::Bars;
#endif
#ifdef __MQL5__constint bars = ::Bars(::Symbol(), ::Period());
#endif
TIMESERIES(Spread)
TIMESERIES(RealVolume)
#ifdef __MQL4__return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
#endif
#ifdef __MQL5__datetimeTime[];
doubleOpen[];
doubleHigh[];
doubleLow[];
doubleClose[];
long TickVolume[];
TIMESERIES(Time)
TIMESERIES(Open)
TIMESERIES(High)
TIMESERIES(Low)
TIMESERIES(Close)
TIMESERIES(TickVolume)
return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
#endif
}
};
CLASS* Class;
bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буферvoidOnChartEvent( constint id, constlong& lparam, constdouble& dparam, conststring& sparam )
{
if (id == CHARTEVENT_CHART_CHANGE)
{
Print(__FUNCTION__);
::OnDeinit();
::Class = new CLASS;
if (!FirstRunOnCalculate)
CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
}
return;
}
voidOnDeinit( constint Reason = 0 )
{
if (::CheckPointer(::Class) == POINTER_DYNAMIC)
delete ::Class;
return;
}
intOnCalculate( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[] )
{
Print(__FUNCTION__);
if (FirstRunOnCalculate)
FirstRunOnCalculate = FALSE;
if (::CheckPointer(::Class) != POINTER_INVALID)
::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!return(rates_total);
}
Dans MT4, cet indicateur fonctionnera sans problème, dans MT5, il se plantera avec une erreur. Il s'est avéré que dans MT4, il suffit d'attendre le premier appel de OnCalculate par le terminal et de faire ce que vous voulez avec les tampons, y compris leur redéfinition à l'aide de SetIndexBuffer. Mais dans MT5, après TOUS les SetIndexBuffer, il faut attendre le premier appel de OnCalculate par le terminal.
Cette particularité n'est documentée nulle part. Et il ne semble pas correspondre à la définition d'un "débutant".
Peut-on s'attendre à ce que ce comportement soit le même dans MT5 que dans MT4 ? C'est-à-dire qu'après le premier appel de OnCalculate par le terminal lui-même, il serait possible d'appeler SetIndexBuffer sans problème ?
Il s'avère que vous avez tort. Vous ne pouvez l'appeler que lorsque OnCalculate est appelé par le terminal lui-même. Dans ce cas, dans MT4, la condition est plus flexible, car vous ne devez appeler OnCalculate qu'une seule fois. Mais dans MT5, vous devez attendre l'appel de OnCalculate par le terminal lui-même à chaque fois après le SetIndexBuffer. Preuve
Dans MT4, cet indicateur fonctionnera sans problème, dans MT5, il se plantera avec une erreur. Il s'est avéré que dans MT4, il suffit d'attendre le premier appel de OnCalculate par le terminal, puis de faire ce que vous voulez avec les tampons, y compris leur redéfinition à l'aide de SetIndexBuffer. Mais dans MT5, après TOUS les SetIndexBuffer, il faut attendre le premier appel de OnCalculate par le terminal.
Cette fonctionnalité n'est documentée nulle part. Et il ne semble pas correspondre à la définition d'un "débutant".
Peut-on s'attendre à ce que ce comportement soit le même dans MT5 que dans MT4 ? C'est-à-dire qu'après le premier appel de OnCalculate par le terminal lui-même, il sera possible d'appeler SetIndexBuffer sans problème ?
Ne vous lancez pas dans le verbiage - naturellement, l'appel de OnCalculate implique un appel par le terminal lui-même, car
Lafonction OnCalculate() est appelée uniquement dans les indicateurs personnalisés lorsqu'il est nécessaire de calculer les valeurs de l'indicateur par l'événementCalculate. Cela se produit généralement lorsqu'un nouveau tick est reçu pour le symbole pour lequel l'indicateur est calculé. L'indicateur n'a pas besoin d'être attaché à un graphique de prix de ce symbole.
Au lieu de Close[2] mettez la valeur de l'indicateur sur la deuxième barre (par exemple iRSI(.......,2) ) et au lieu de Close[1] mettez la valeur de l'indicateur sur la première barre. Et uroven est la valeur du niveau.
Et le reste, on vous l'a déjà dit plus haut.
Prérequis :
ProfitSellDBL est calculé ici
Profit_Upgr = 0.01
Tral_Start__Upgr est assimilé à une variable externe de type int et égale à 5.
Tral_Size__Upgr est pareillement égal à 4
TV - valeur de coche, =10
SumLotSellDBL = 0.04
Lisez. J'ai vu comment cela fonctionnerait si Tral_Start__Upgr, Tral_Size__Upgr et leurs variables externes étaient définies comme des doubles. C'est-à-dire lorsque tout est du même type sans aucune conversion ni perte de données. Le résultat est le même. Qu'est-ce que j'ai fait de mal ?
Un aveugle qui parle à un sourd. Si vous voulez que quelqu'un le teste, vous avez besoin du code minimum possible qui peut être compilé sur une autre machine et testé. Pas de code - rien à dire.
Ajouté : Utiliser le débogage:
-Préconfiguration
-Points d'arrêt
-Démarrer ledébogage
-Expressionsobservables
-Appeler StackView
-Débogageétape par étape
-Arrêter, reprendre et terminer le débogage
-Débogage de l'historique
Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading
Bugs, bugs, questions
comp, 2016.04.03 18:21
Erreur d'exécution
En quatre, ça a bien marché ! En cinq, c'est une déception. Est-ce une autre limitation architecturale par rapport au quadruple ? Donnez-moi un lien vers une discussion sur ce sujet, je ne l'ai pas trouvé moi-même.
Ai-je bien compris que l'on ne peut affecter quelque chose aux tampons d'indicateurs qu'après le premier appel du terminal (non manuel) OnCalculate ?
Les tampons des indicateurs sont accessibles après l'appel de OnCalculate(). En même temps, le tampon indicateur lui-même doit être déclaré dans la zone des variables globales:
Je pense avoir trouvé ce que je cherchais, mais l'ancienneté du code donne une erreur
Aidez-moi à le réparer ...... si ça ne vous dérange pas trop.
et si vous pouvez m'aider à le tourner vers le côté droit de l'écran, ce serait génial.
Les tampons des indicateurs sont accessibles après l'appel de OnCalculate().
Il s'avère que vous avez tort. Vous ne pouvez appliquer que lorsque le terminal appelle OnCalculate. Dans ce cas, la condition dans MT4 est plus souple, car il suffit d'appeler OnCalculate une seule fois. Et dans MT5, vous devez attendre l'appel de OnCalculate par le terminal lui-même chaque fois après le SetIndexBuffer. Preuve
Dans MT4, cet indicateur fonctionnera sans problème, dans MT5, il se plantera avec une erreur. Il s'est avéré que dans MT4, il suffit d'attendre le premier appel de OnCalculate par le terminal et de faire ce que vous voulez avec les tampons, y compris leur redéfinition à l'aide de SetIndexBuffer. Mais dans MT5, après TOUS les SetIndexBuffer, il faut attendre le premier appel de OnCalculate par le terminal.
Cette particularité n'est documentée nulle part. Et il ne semble pas correspondre à la définition d'un "débutant".
Peut-on s'attendre à ce que ce comportement soit le même dans MT5 que dans MT4 ? C'est-à-dire qu'après le premier appel de OnCalculate par le terminal lui-même, il serait possible d'appeler SetIndexBuffer sans problème ?
Il s'avère que vous avez tort. Vous ne pouvez l'appeler que lorsque OnCalculate est appelé par le terminal lui-même. Dans ce cas, dans MT4, la condition est plus flexible, car vous ne devez appeler OnCalculate qu'une seule fois. Mais dans MT5, vous devez attendre l'appel de OnCalculate par le terminal lui-même à chaque fois après le SetIndexBuffer. Preuve
Dans MT4, cet indicateur fonctionnera sans problème, dans MT5, il se plantera avec une erreur. Il s'est avéré que dans MT4, il suffit d'attendre le premier appel de OnCalculate par le terminal, puis de faire ce que vous voulez avec les tampons, y compris leur redéfinition à l'aide de SetIndexBuffer. Mais dans MT5, après TOUS les SetIndexBuffer, il faut attendre le premier appel de OnCalculate par le terminal.
Cette fonctionnalité n'est documentée nulle part. Et il ne semble pas correspondre à la définition d'un "débutant".
Peut-on s'attendre à ce que ce comportement soit le même dans MT5 que dans MT4 ? C'est-à-dire qu'après le premier appel de OnCalculate par le terminal lui-même, il sera possible d'appeler SetIndexBuffer sans problème ?