Anstelle von Close[2] setzen Sie den Indikatorwert auf den zweiten Balken (z.B. iRSI(.......,2) ) und anstelle von Close[1] setzen Sie den Indikatorwert auf den ersten Balken. Und uroven ist der Wert des Levels.
Können Sie mir sagen, ob jemand eine Seite Volumen des Tages auf der rechten Seite des Charts für mt5 gesehen hat, für mt4 fand ich es hier https://www.mql5.com/ru/code/9777. Ich habe zwei Varianten: entweder die Variablen umschreiben oder eine fertige finden. Oder ich sehe keinen Sinn in der Bestellung,,,,,,, , ich muss eine Gleichgewichtstheorie ,,,, überprüfen. Ich fand eine Arbeit für mt5, wo das Profil des gestrigen Tages auf der linken Seite gezeichnet wird, aber es gibt einen wichtigen Nachteil, es zeichnet nicht, was heute passiert. Ich möchte also dem Chartmuster Informationen von der rechten Seite hinzufügen, was im Moment des Handels geschieht
Tral_Start__Upgr wird mit einer externen Variablen vom Typ int gleichgesetzt und ist gleich 5.
Tral_Size__Upgr ist ebenfalls gleich 4
TV - Tick-Wert, =10
SummeLotSellDBL = 0,04
Ich habe es gelesen. Ich sah, wie es funktionieren würde, wenn Tral_Start__Upgr, Tral_Size__Upgr und ihre externen Variablen als double definiert wären. D.h. wenn alles vom gleichen Typ ist, ohne Konvertierung und Datenverlust. Das Ergebnis ist das gleiche. Was habe ich falsch gemacht?
Maria Baburina: Lesen. Ich sah, wie es funktionieren würde, wenn Tral_Start__Upgr, Tral_Size__Upgr und ihre externen Variablen als double definiert wären. D.h. wenn alles vom gleichen Typ ist, ohne Konvertierung und Datenverlust. Das Ergebnis ist das gleiche. Was habe ich falsch gemacht?
Ein Blinder spricht mit einem Gehörlosen. Wenn Sie wollen, dass jemand es testet, brauchen Sie so wenig Code wie möglich, der auf einem anderen Rechner kompiliert und getestet werden kann. Kein Code - nichts, worüber man reden könnte.
#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);
}
In vier Fällen hat es gut funktioniert! In fünf Fällen ist es eine Katastrophe. Ist dies eine weitere architektonische Einschränkung im Vergleich zu Quad? Geben Sie mir einen Link zu einer Diskussion über dieses Thema, ich konnte ihn selbst nicht finden.
Verstehe ich das richtig, dass Sie den Indikatorpuffern erst nach dem ersten Aufruf von OnCalculate durch das Terminal selbst (nicht manuell) etwas zuweisen können?
comp: Verstehe ich das richtig, dass den Indikatorpuffern erst nach dem ersten Aufruf des Terminals (nicht manuell) OnCalculate etwas zugewiesen werden kann?
Auf Indikatorpuffer kann zugegriffen werden, nachdem OnCalculate() aufgerufen wurde. Gleichzeitig sollte der Indikatorpuffer selbst im Bereich der globalen Variablen deklariert werden:
Auf die Indikatorpuffer kann zugegriffen werden, nachdem OnCalculate() aufgerufen wurde.
Wie sich herausstellt, liegen Sie falsch. Sie können sich nur bewerben, wenn das Terminal OnCalculate aufruft. In diesem Fall ist die Bedingung in MT4 flexibler, da es genügt, OnCalculate nur einmal aufzurufen. Aber in MT5, müssen Sie für den Aufruf von OnCalculate durch das Terminal selbst jedes Mal nach dem SetIndexBuffer warten. Proof
#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);
}
In MT4 funktioniert dieser Indikator ohne Probleme, in MT5 stürzt er mit einem Fehler ab. Wie sich herausstellte, müssen Sie in MT4 nur auf den ersten Aufruf von OnCalculate durch das Terminal warten und mit den Puffern tun, was Sie wollen, einschließlich ihrer Neudefinition mit SetIndexBuffer. Aber in MT5 muss man nach JEDEM SetIndexBuffer auf den ersten Aufruf von OnCalculate durch das Terminal warten.
Diese Funktion ist nirgends dokumentiert. Und es scheint nicht der Definition eines "Anfängers" zu entsprechen.
Können wir davon ausgehen, dass dieses Verhalten in MT5 genauso sein wird wie in MT4? D.h. nach dem ersten Aufruf von OnCalculate durch das Terminal selbst wäre es möglich, SetIndexBuffer ohne Probleme aufzurufen?
Wie sich herausstellt, liegen Sie falsch. Sie können ihn nur aufrufen, wenn OnCalculate vom Terminal selbst aufgerufen wird. In diesem Fall ist die Bedingung in MT4 flexibler, da Sie OnCalculate nur einmal aufrufen müssen. Aber in MT5, müssen Sie für den Aufruf von OnCalculate durch das Terminal selbst jedes Mal nach dem SetIndexBuffer warten. Proof
In MT4 funktioniert dieser Indikator ohne Probleme, in MT5 stürzt er mit einem Fehler ab. Wie sich herausstellte, müssen Sie in MT4 nur auf den ersten Aufruf von OnCalculate durch das Terminal warten und dann mit den Puffern tun, was Sie wollen, einschließlich ihrer Neudefinition mit SetIndexBuffer. Aber in MT5 muss man nach JEDEM SetIndexBuffer auf den ersten Aufruf von OnCalculate durch das Terminal warten.
Diese Besonderheit ist nirgends dokumentiert. Und es scheint nicht der Definition eines "Anfängers" zu entsprechen.
Können wir davon ausgehen, dass dieses Verhalten im MT5 genauso sein wird wie im MT4? D.h. nach dem ersten Aufruf von OnCalculate durch das Terminal selbst wird es möglich sein, SetIndexBuffer ohne Probleme aufzurufen?
Lassen Sie sich nicht auf Geschwätz ein - der Aufruf von OnCalculate impliziert natürlich einen Aufruf durch das Terminal selbst, denn
Die Funktion OnCalculate() wird nur in benutzerdefinierten Indikatoren aufgerufen, wenn es notwendig ist, die Indikatorwerte durch das EreignisCalculate zuberechnen. Dies geschieht in der Regel, wenn ein neuer Tick für das Symbol, für das der Indikator berechnet wird, empfangen wird. Der Indikator muss nicht mit einem Preisdiagramm dieses Symbols verbunden sein.
Anstelle von Close[2] setzen Sie den Indikatorwert auf den zweiten Balken (z.B. iRSI(.......,2) ) und anstelle von Close[1] setzen Sie den Indikatorwert auf den ersten Balken. Und uroven ist der Wert des Levels.
Und den Rest haben Sie bereits oben erfahren.
Voraussetzung:
ProfitSellDBL wird hier berechnet
Gewinn_Upgr = 0,01
Tral_Start__Upgr wird mit einer externen Variablen vom Typ int gleichgesetzt und ist gleich 5.
Tral_Size__Upgr ist ebenfalls gleich 4
TV - Tick-Wert, =10
SummeLotSellDBL = 0,04
Lesen. Ich sah, wie es funktionieren würde, wenn Tral_Start__Upgr, Tral_Size__Upgr und ihre externen Variablen als double definiert wären. D.h. wenn alles vom gleichen Typ ist, ohne Konvertierung und Datenverlust. Das Ergebnis ist das gleiche. Was habe ich falsch gemacht?
Ein Blinder spricht mit einem Gehörlosen. Wenn Sie wollen, dass jemand es testet, brauchen Sie so wenig Code wie möglich, der auf einem anderen Rechner kompiliert und getestet werden kann. Kein Code - nichts, worüber man reden könnte.
Hinzugefügt: Debugging verwenden(Debugging):
-Vorkonfiguration
-Haltestellen
-Start derFehlersuche
-ObservierbareAusdrücke
-Stapelansicht aufrufen
-SchrittweiseFehlersuche
-Anhalten, Fortsetzen und Beenden der Fehlersuche
-HistorischeFehlersuche
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Wanzen, Wanzen, Fragen
comp, 2016.04.03 18:21
Laufzeitfehler
In vier Fällen hat es gut funktioniert! In fünf Fällen ist es eine Katastrophe. Ist dies eine weitere architektonische Einschränkung im Vergleich zu Quad? Geben Sie mir einen Link zu einer Diskussion über dieses Thema, ich konnte ihn selbst nicht finden.
Verstehe ich das richtig, dass den Indikatorpuffern erst nach dem ersten Aufruf des Terminals (nicht manuell) OnCalculate etwas zugewiesen werden kann?
Auf Indikatorpuffer kann zugegriffen werden, nachdem OnCalculate() aufgerufen wurde. Gleichzeitig sollte der Indikatorpuffer selbst im Bereich der globalen Variablen deklariert werden:
Ich glaube, ich habe gefunden, wonach ich gesucht habe, aber die Altertümlichkeit des Codes gibt einen Fehler
Helfen Sie mir, es zu reparieren ......, wenn es nicht zu viel Mühe macht.
und wenn Sie mir helfen können, es auf die rechte Seite des Bildschirms zu drehen, wäre das großartig.
Auf die Indikatorpuffer kann zugegriffen werden, nachdem OnCalculate() aufgerufen wurde.
Wie sich herausstellt, liegen Sie falsch. Sie können sich nur bewerben, wenn das Terminal OnCalculate aufruft. In diesem Fall ist die Bedingung in MT4 flexibler, da es genügt, OnCalculate nur einmal aufzurufen. Aber in MT5, müssen Sie für den Aufruf von OnCalculate durch das Terminal selbst jedes Mal nach dem SetIndexBuffer warten. Proof
In MT4 funktioniert dieser Indikator ohne Probleme, in MT5 stürzt er mit einem Fehler ab. Wie sich herausstellte, müssen Sie in MT4 nur auf den ersten Aufruf von OnCalculate durch das Terminal warten und mit den Puffern tun, was Sie wollen, einschließlich ihrer Neudefinition mit SetIndexBuffer. Aber in MT5 muss man nach JEDEM SetIndexBuffer auf den ersten Aufruf von OnCalculate durch das Terminal warten.
Diese Funktion ist nirgends dokumentiert. Und es scheint nicht der Definition eines "Anfängers" zu entsprechen.
Können wir davon ausgehen, dass dieses Verhalten in MT5 genauso sein wird wie in MT4? D.h. nach dem ersten Aufruf von OnCalculate durch das Terminal selbst wäre es möglich, SetIndexBuffer ohne Probleme aufzurufen?
Wie sich herausstellt, liegen Sie falsch. Sie können ihn nur aufrufen, wenn OnCalculate vom Terminal selbst aufgerufen wird. In diesem Fall ist die Bedingung in MT4 flexibler, da Sie OnCalculate nur einmal aufrufen müssen. Aber in MT5, müssen Sie für den Aufruf von OnCalculate durch das Terminal selbst jedes Mal nach dem SetIndexBuffer warten. Proof
In MT4 funktioniert dieser Indikator ohne Probleme, in MT5 stürzt er mit einem Fehler ab. Wie sich herausstellte, müssen Sie in MT4 nur auf den ersten Aufruf von OnCalculate durch das Terminal warten und dann mit den Puffern tun, was Sie wollen, einschließlich ihrer Neudefinition mit SetIndexBuffer. Aber in MT5 muss man nach JEDEM SetIndexBuffer auf den ersten Aufruf von OnCalculate durch das Terminal warten.
Diese Besonderheit ist nirgends dokumentiert. Und es scheint nicht der Definition eines "Anfängers" zu entsprechen.
Können wir davon ausgehen, dass dieses Verhalten im MT5 genauso sein wird wie im MT4? D.h. nach dem ersten Aufruf von OnCalculate durch das Terminal selbst wird es möglich sein, SetIndexBuffer ohne Probleme aufzurufen?