Fehler, Irrtümer, Fragen - Seite 2016

 
fxsaber:

Der gesamte CopyBuffer ist dort INF.

Bei einem gleitenden Zählalgorithmus reichen bereits zwei DBL_MAX-Preise am Anfang aus , um den gesamten Puffer zu INF

DBL_MAX + DBL_MAX = INF

und dann wird INF die Berechnung nicht verlassen

Sie sollten den Code aller Indikatoren so ändern, dass EMPTY_VALUE ignoriert wird.
 
A100:

Bei einem gleitenden Zählalgorithmus sind zu Beginn nur zwei DBL_MAX-Preise erforderlich , damit der gesamte Puffer zu INF

DBL_MAX + DBL_MAX = INF

und dann wird die INF den Berechnungen nicht mehr entgehen

Diese Variante ist recht wahrscheinlich, da die DBL_MAX mit Werten unterhalb des MAA-Zeitraums gefüllt ist. Dann gibt es einen Fehler im rekurrenten Algorithmus Durchschnitt - MODE_SMA.

Es ist so! Ich habe einige Änderungen vorgenommen und es funktioniert!

// Вычисляем Машку от Машки через хэндл самого себя
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 

#property  indicator_type1   DRAW_LINE 
#property  indicator_color1  clrRed 
#property  indicator_style1  STYLE_SOLID 
#property  indicator_width1  1 

input bool CustomData = false; // true - кастомный режим для iCustom
input int MAPeriod = 1 e1;      // Период МАшки

string GetMyName( void )
{
  const int Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
  const string Path = MQLInfoString(MQL_PROGRAM_PATH);
  
  return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}

double Buffer[];
const bool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);

const int handleMA = CustomData ? iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_OPEN) // от этой МАшки будет брать другую Машку, но не напрямую, а кастомно
                                : iMA(NULL, PERIOD_CURRENT, MAPeriod, 0, MODE_SMA, iCustom(_Symbol, PERIOD_CURRENT, GetMyName(), true));

int Replace( double &Array[], const double NewValue = 1 e3, const double PrevValue = EMPTY_VALUE )
{
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    if (Array[i] == PrevValue)
      Array[i] = NewValue;
      
  return(0);
}

int OnCalculate( const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[] )       // Spread 
{
  return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));
}

Man kann mit Sicherheit sagen, dass der rekurrente Algorithmus iMA den Fall nicht berücksichtigt, dass DBL_MAX an den Eingang gegeben wird. Fehler.


@A100, Danke!

 

MetaEditor bleibt beim Versuch, eine angehängte Datei zu kompilieren, hängen

Wenn er sich nicht sofort aufhängt, warten Sie eine Weile oder gehen Sie in die Zusammenfassungszeile und sehen Sie sich die Kompilierungszeit an

Dateien:
Test0.mq5  1 kb
 

Warum wird die Auftrags-/Vorgangsnummer nicht in einem Pop-up-Fenster angezeigt, wenn man mit der Maus darüberfährt? Ich habe schon vor tausend Jahren danach gefragt, es fehlt so sehr!

 
fxsaber:


return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));

Solche Konstruktionen sollten vermieden werden. Die Reihenfolge, in der die Operanden ausgeführt werden, ist in C++ nicht geregelt, so dass die Entscheidung darüber dem jeweiligen Compiler überlassen bleibt. Eine Ausnahme bilden die Operatoren && und ||, bei denen die Operanden immer von links nach rechts ausgeführt werden.

 
Alexey Navoykov:

Solche Konstruktionen sollten vermieden werden. Die Reihenfolge, in der die Operanden ausgeführt werden, ist in C++ nicht geregelt, so dass die Entscheidung darüber dem jeweiligen Compiler überlassen bleibt. Die Ausnahmen sind && und ||, wo die Operanden immer von links nach rechts ausgeführt werden.

Nun, wir sind in MQL!

 
fxsaber:

Nun, wir sind in MQL!

Nirgendwo in der Dokumentation steht etwas über eine bestimmte Reihenfolge. Sie können sie also jederzeit nach eigenem Ermessen ändern.

Ich habe mich bereits einmal mit dem Kundendienst in Verbindung gesetzt, um dieses Problem zu klären.

 

Hallo. Können Sie mir bitte sagen, welche Funktionen verwendet werden können, um die Liste der im Diagramm angezeigten Indikatoren und deren Parameter zu erhalten? Ich habe nur eine Funktion gefunden, die die Anzahl der Indikatoren im Diagramm zurückgibt

Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
 
Aleksandr Teleguz:

Hallo. Können Sie mir bitte sagen, welche Funktionen verwendet werden können, um die Liste der im Diagramm angezeigten Indikatoren und deren Parameter zu erhalten? Ich habe nur die Funktion gefunden, die die Anzahl der Indikatoren im Diagramm zurückgibt

IndikatorParameter (+ IndicatorRelease)

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
//| Script program start function                                    |                          +                                    p,                                                                        parameters[p].integer_value,                                    parameters[p].double_value...
 
Alexey Navoykov:

Nirgendwo in der Dokumentation steht etwas über eine bestimmte Reihenfolge. Sie können sie also jederzeit nach eigenem Ermessen ändern.

Ich kümmere mich nicht darum. Es gibt eine Menge Dinge, die dort nicht beschrieben sind.

Ohne lange nachzudenken

  • Sortieren von Handelsaufzeichnungen nach Zeit in MT4/5.
  • Die Möglichkeit , globale/statische Variablen per Funktion zu initialisieren, wurde erst kürzlich eingeführt.
  • Einstellung der Präprozessor-Direktiven in einer Zeile - wird aber bald abgeschaltet.
  • Ausführung der Operanden von links nach rechts.
  • OrderSend ist zu 99% mit der Handelsumgebung synchronisiert.
  • ChartApplyTemplate ist asynchron.
  • Und es gibt noch eine Menge anderer undokumentierter Feinheiten. Und dann gibt es Fälle, in denen die Dokumentation nicht mit der Realität übereinstimmt. Und das ist kein Fehler, sondern ein seltener Fehler, der einfach nicht erwähnt wird.

Der Präzedenzfall war eine Casting-Absage, aber es gab einen Grund dafür.

Etwas nicht zu verwenden, nur weil es nicht beschrieben ist, ist also eine fragwürdige Entscheidung.


Ich denke, dass ein solcher Code keine Zweifel bei den Programmierern hervorrufen würde.

int Replace( double &Array[], int );

return(prev_calculated + Replace(Buffer, CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer)));

Aber es ist nicht sehr schön. Es ist sinnvoll, MyCopyBuffer zu schreiben, aber es ist hässlich, in einem kurzen Code zu zeigen, dass man es braucht, um einen Fehler zu vermeiden. Die Verwendung einer undokumentierten Ausführungspriorität für Operanden ist also genau das Richtige, um zu zeigen, dass dies eine vorübergehende Lösung ist.