Fehler, Irrtümer, Fragen - Seite 1175

 
A100:

......................Funktionen (Suchen, Berechnen usw.) geben im Allgemeinen Länge/Größe oder -1 zurück, wenn sie nicht erfolgreich waren, was die Fehlerbehandlung sehr erleichtert.

nicht so sehr, dass die Hälfte des Wertebereichs geopfert wird.
 

Grüße. Gibt es Tipps für Neulinge, welche Funktionen zu verwenden sind, um im Falle eines umgekehrten Signals einen gemeinsamen Takeout für ein Auftragsnetz festzulegen?

 
Ich lerne Dateioperationen. Weiß jemand, ob MQL4/5 schneller mit csv- oder txt-Dateien arbeitet?
 
paladin800:
Ich lerne Dateioperationen. Weiß jemand, ob MQL4/5 mit csv- oder txt-Dateien schneller ist?
bin
 
papaklass:
Welche Probleme versuchen Sie durch die Arbeit mit Dateien zu lösen?
Sie müssen den Stand der Positionen in eine Datei schreiben und MT4 verwenden, um diese Daten zu lesen. Sie benötigen eine Korrelation der Positionen eines Symbols mit einem oder mehreren anderen Symbolen. Wenn zum Beispiel bereits eine bestimmte Anzahl von Positionen für EURUSD besteht, sollten keine weiteren Positionen für GBPUSD eröffnet werden. Ich weiß, wie man es ohne Datei-Operationen machen kann, ich möchte nur lernen, wie man mit Datei-Operationen arbeitet, um meinen Horizont zu erweitern.
 

Bitte geben Sie ein Code-Beispiel dafür, wie man einen verknüpften Ressourcenindikator von einem EA aus aufruft, der wiederum einen anderen verknüpften Ressourcenindikator in sich selbst verwendet. Zum Beispiel gibt es einen Indikator A, und B wird von diesem aufgerufen. Es gibt auch einen Experten C, der A verwendet. Was sollte in #resource und beim Aufruf von iCustom auf jeden Fall geschrieben werden?

Die Hilfe ist in dieser Hinsicht nicht eindeutig formuliert. Die übliche Konstruktion in Indikator A:#resource "\\Indicators\B.ex4" und danniCustom(::Indicators\B.ex4) funktioniert einwandfrei, wenn A von selbstgestartet wird. Aber wenn A in Expert Advisor#Ressource "\\Indicators\A.ex4"eingefügt wird, erscheint ein Fehlerkann nicht laden Ressource für den angehängten Indikator zeigt einige absolute falsche synthetisierte Pfad, die irgendwie erwähnt Libraries Verzeichnis, während Indikator B in sich selbst (MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4)gesucht wird.

 
meat:

Was ArraySize betrifft, habe ich neulich ein ähnliches Problem auf MQL4 angesprochen: https://www.mql5.com/ru/forum/152471. Soweit ich das verstanden habe, sollte in MQL5 alles gleich sein.

Vielleicht wurde meine Nachricht dort berücksichtigt :) Was dieses Problem betrifft, so hat der Service Desk geantwortet, dass der Grund ein fehlerhafter Betrieb des Optimierers war und dass sie den Typ in neuen Builds auf uint ändern werden. In der Tat ist es jetzt uint, aber es ist undokumentiert :) Und nebenbei bemerkt, sie werden es auch für ArrayResize auf uint ändern. Ich habe ihnen geraten, es auf ulong zu ändern, da sie sonst in naher Zukunft wieder auf dieses Problem zurückkommen müssen, weil es an 32-Bit-Werten fehlt, wenn sie große Volumen speichern.

Was den Wert -1 im Fehlerfall betrifft, so sollte es damit keine Probleme geben, denn: (int)-1 = (uint)-1 = 0xFFFFFFFFFF = UINT_MAX, d.h. die Bit-Darstellung ist die gleiche, aber die Vergleichsoperation ergibt ein anderes Ergebnis, z.B. wenn es im Code so war

wird sie falsch.

Nochmals vielen Dank für die Anfrage, der Rückgabetyp der Funktionen ArraySize und ArrayRange wird nicht geändert, wir belassen den Typ int. Wir haben den Code-Optimierer korrigiert, nun wird der von Ihnen beschriebene Fehler nicht mehr auftreten.

Die Gesamtzahl der Elemente im MQL-Array darf INT_MAX nicht überschreiten, und dies wird sich auch nicht ändern.
Wenn Sie in einem MQL-Programm Arrays von größerer Größe benötigen, müssen Sie eine separate Klasse erstellen (z. B. CBigArray).
 

Ich versuche, iCustom in mql5 zu beherrschen. Ich habe es in mql4 gemeistert :)

Das Problem besteht darin, etwas Ähnliches wie den MACD zu zeichnen, aber anstelle eines schnellen gleitenden Durchschnitts sollte der VIDYA-Indikator verwendet werden, der sich im Ordner Examples befindet.

Ich habe einen Standard-MACD-Code genommen und Parameter für VIDYA anstelle des MA gesetzt. Das Problem ist, dass alles kompiliert, aber nichts gezeichnet wird.

Ich habe im Code unten zwei Stellen markiert, an denen ich den Standard-MACD-Code geändert habe. Ansonsten bleibt alles beim Alten. Bitte sagen Sie mir, was ich noch übersehen habe. Ich nehme an, es ist irgendwo im Code nachgeschaltet...

//+------------------------------------------------------------------+
//|                                                         MACD.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Moving Average Convergence/Divergence"
#include <MovingAverages.mqh>
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_type2   DRAW_LINE
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
#property  indicator_width2  1
#property  indicator_label1  "MACD"
#property  indicator_label2  "Signal"
//--- input parameters
Первый вставленный кусок:
input int                Per=7;               // Per
input int                Per1=21;             // Per1
input int                Shift=0            // Shift
Конец

input int                InpSlowEMA=84;               // Slow EMA period
input int                InpSignalSMA=9;              // Signal SMA period
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price
//--- indicator buffers
double                   ExtMacdBuffer[];
double                   ExtSignalBuffer[];
double                   ExtFastMaBuffer[];
double                   ExtSlowMaBuffer[];
//--- MA handles
int                      ExtFastMaHandle;
int                      ExtSlowMaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
Второй вставленный кусок
   ExtFastMaHandle=iCustom(NULL,0,"Examples\\VIDYA",
                     Per,
                     Per1,
                     Shift
                     );
Конец
   ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_SMA,InpAppliedPrice);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
//--- check for data
   if(rates_total<InpSignalSMA)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtFastMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtSlowMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
     {
      Print("Getting fast EMA is failed! Error",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
     {
      Print("Getting slow SMA is failed! Error",GetLastError());
      return(0);
     }
//---
   int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
//--- calculate MACD
   for(int i=limit;i<rates_total && !IsStopped();i++)
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Nilog:

Ich versuche, iCustom in mql5 zu beherrschen. In mql4 konnte ich es virtuos meistern :)


Was wird in das Protokoll geschrieben? Keine Prüfung auf Fehler (z. B. beim Empfang eines Handles). Stimmt die Puffernummer des neuen Indikators mit der des alten überein?
 

Ich weiß nicht, ob dies bereits geschehen ist, aber die Frage ist, neue Bar, PLOT_EMPTY_VALUE Wert für den Puffer ist auf 0,0 gesetzt, aber in der Tat gibt es manchmal ganz andere Werte

Grund der Beschwerde: