Bibliotheken: mt-R - Seite 3

 
cgarbelli:

Hallo,


Ich versuche, die Funktion RAssignStringVector zu verwenden, aber es scheint, dass nur das erste Zeichen jedes Terms in die R-Sitzung kopiert wird.

Zum Beispiel der MQL5-Vektor

{"abcd","2000","2000}

nach R kopiert als

{"a", "2", "2"}

Ist das ein Problem oder liege ich falsch?

Beachten Sie, dass ich RAssignVector mit Doppel-Vektor ohne Probleme verwende.


Danke!

Claudio.

Ich benutze keinen MT5, sorry

 

Achtung!
In der Datei R.mqh haben die Namen der Variablen vector und matrix beim Kompilieren einen Fehler erzeugt. Benennen Sie sie in andere um und alles wird funktionieren. Ich habe vectr und matr verwendet.

Der Editor hebt diese Wörter in blau als Datentyp wie int, double hervor. Offenbar sind diese Wörter für neue Typen reserviert.

 

Beschreibung aller Funktionen (kopiert von der vorherigen Version https://www.mql5.com/en/code/11112)

/**
* Rückgabe der DLL-Version. Die oberen 16 Bits des Rückgabewertes
* sind die Hauptversion und die unteren 16 Bits die Nebenversion. Diese
* wird in RInit() verwendet, um sicherzustellen, dass diese Header-Datei und
* zztdie Dll zusammenpassen.
*/
int RGetDllVersion();

/**
* Dies ist nicht dafür gedacht, direkt aufgerufen zu werden, es wird
* von RInit() nach der erfolgreichen Versionsprüfung aufgerufen.
* Sie sollten RInit() aufrufen, um eine neue R-Sitzung zu starten.
*/
long RInit_(string commandline,int debuglevel);

/**
* Beenden Sie die R-Sitzung. Rufen Sie dies in Ihrer deinit()-Funktion auf.
* Danach ist das Handle nicht mehr gültig.
*/
void RDeinit(long rhandle);

/**
* return true if the R session belonging to this handle is
* still running. R wird bei jedem fatalen Fehler im
* Code, den Sie ihm schicken, beendet. Sie sollten dies am Anfang
* Ihrer Startfunktion überprüfen und alle Aktionen beenden. Der letzte
* Befehl vor dem Absturz wird im Protokoll gefunden.
* Wenn R nicht mehr läuft, wird diese Bibliothek keine
* Protokollmeldungen mehr ausgeben und alle Befehle stillschweigend ignorieren.
*/
bool RIsRunning(long rhandle);

/**
* return true if R is still executing a command (resulting
* aus einem Aufruf von RExecuteAsync())
*/
bool RIsBusy(long rhandle);

/**
* Code ausführen und nicht warten. Jeder nachfolgende Aufruf
* wird jedoch warten, da nur ein Thread zu einem bestimmten Zeitpunkt
* ausgeführt werden kann. Verwenden Sie RIsBusy(), um zu prüfen, ob er fertig ist
*/
void RExecuteAsync(long rhandle,string code);

/**
* Code ausführen und warten, bis er fertig ist. Dies wird nichts
* zurückgeben. Im Grunde kann man dasselbe mit
* den RGet*()-Funktionen erreichen, das Auswerten des Ausdrucks ist auch
* nur das Ausführen von Code, der einzige Unterschied ist, dass diese
* RGet*()-Funktionen zusätzlich versuchen,
* die Ausgabe zu parsen und zurückzugeben, während RExecute() nur ausführt, wartet und
* alle Ausgaben ignoriert.
*/
void RExecute(long rhandle,string code);

/**
* weisen dem Variablennamen ein bool zu. In R wird dieser Typ "logisch" genannt
*/
void RAssignBool(long rhandle,string variable,bool value);

/**
* Weisen Sie dem Variablennamen eine ganze Zahl zu.
*/
void RAssignInteger(long rhandle,string variable,int value);

/**
* Weisen Sie dem Variablennamen einen Double zu.
*/
void RAssignDouble(long rhandle,string variable,double value);

/**
* Weisen Sie der Variablen namd einen String zu. In R wird dieser Typ "character" genannt
*/
void RAssignString(long rhandle,string variable,string value);

/**
* Weisen Sie der Variablen name einen Vektor zu. Wenn die Größe nicht mit
* Ihrer tatsächlichen Array-Größe übereinstimmt, können schlimme Dinge passieren.
*/
void RAssignVector(long rhandle,string variable,double &vectr[],int size);

/**
* Weisen Sie der Variablen einen Vektor von Zeichen (ein Array von Strings) zu. Wenn Sie
* einen Faktor benötigen, sollten Sie nach diesem Befehl einen Code ausführen, um ihn umzuwandeln. In
* neueren Versionen von R benötigt ein Vektor von Zeichenketten nicht mehr Speicher als
* ein Faktor und es ist einfacher, neue Elemente an ihn anzuhängen.
*/
void RAssignStringVector(long rhandle,string variable,string &vectr[],int size);

/**
* weisen dem Variablennamen eine Matrix zu. Die Matrix muss die Zeilennummer als
* erste Dimension haben (byrow=TRUE wird für die Rohdaten verwendet). Diese Funktion ist viel
* schneller als das Erstellen einer riesigen Matrix (Hunderte von Zeilen) von Grund auf, indem
* neue Zeilen am Ende mit RRowBindVector() für jede Zeile angehängt werden. Diese Funktion ist
* für einen hohen Durchsatz mit einem einzigen Funktionsaufruf durch die Verwendung von file-IO mit den
* rohen Binärdaten optimiert. Für sehr kleine Matrizen und Vektoren mit nur einer Handvoll Elementen
* könnte dies zu viel Overhead bedeuten und die anderen Funktionen werden schneller sein. Sobald Sie
* die Matrix mit möglicherweise Tausenden von Zeilen nach R übertragen haben, sollten Sie
* nur noch RRowBindVector() verwenden, um sie bei der Ankunft einzelner neuer
* Datenvektoren langsam weiter zu vergrößern, anstatt immer eine neue Kopie der gesamten Matrix zu senden.
*/
void RAssignMatrix(long rhandle,string variable,double &matr[],int rows,int cols);

/**
* eine Zeile an eine Matrix oder einen Datenrahmen anhängen. Dies wird ausgeführt
* variable <- rbind(variable, vector)
* wenn die Größe nicht mit der tatsächlichen Array-Größe übereinstimmt, können schlechte Dinge passieren.
*/
void RAppendMatrixRow(long rhandle,string variable,double &vectr[],int size);

/**
* return true if the variable exists, false otherwise.
*/
bool RExists(long rhandle,string variable);

/**
* Ausdruck auswerten und ein bool zurückgeben. Der Ausdruck kann ein beliebiger R-Code
* sein, der als logisch ausgewertet werden kann. Wenn es ein Vektor von logisch ist, wird nur
* das erste Element zurueckgegeben.
*/
bool RGetBool(long rhandle,string expression);

/**
* evaluate expression and return an integer. Ausdruck kann ein beliebiger R-Code
* sein, der zu einer Ganzzahl ausgewertet wird. Wenn es sich um eine Fließkommazahl handelt, wird
* gerundet, wenn es sich um einen Vektor handelt, wird nur das erste Element zurückgegeben.
*/
int RGetInteger(long rhandle,string expression);

/**
* evaluate expression and return a double. Der Ausdruck kann ein beliebiger R-Code
* sein, der zu einer Fließkommazahl ausgewertet wird, wenn es sich um einen Vektor handelt, wird
* nur das erste Element zurückgegeben.
*/
double RGetDouble(long rhandle,string expression);

/**
* evaluate expression and return a vector of doubles. Der Ausdruck kann
* alles sein, was zu einem Vektor von Fließkommazahlen ausgewertet werden kann.
* Der Rückgabewert ist die Anzahl der Elemente, die in das
* Array kopiert werden können. Sie wird nie größer als size sein, kann aber kleiner sein.
* Warnungen werden auf Debuglevel 1 ausgegeben, wenn die Größen nicht übereinstimmen.
* >>> Begrenzt auf 100000 Elemente
*/
int RGetVector(long rhandle,string expression,double &vectr[],int size);

/**
* Für Debugging-Zwecke wird ein print(expression) ausgeführt. Das Ergebnis wird
* an den Debug-Monitor auf Debuglevel 0 gesendet.
*/
void RPrint(long rhandle,string expression);

mt4R for new MQL4
mt4R for new MQL4
  • www.mql5.com
mt4R, modified for supporting new MQL4
 
Gute Arbeit!

Könnten Sie helfen, das Problem zu lösen, das in einer bestimmten Situation auftritt.

1) zwei mt5 Terminals von zwei verschiedenen Brokern laufen lassen
2) Kopieren Sie alles zwischen den beiden Terminals
3) Führen Sie Experten aus, die Ihre dll verwenden und Arrays von mt5 an Rterm senden
4) Warten Sie ein paar Minuten
Eines der beiden mt5-Terminals wird geschlossen.
Warum und wie kann man das beheben?

Danke!