an unnamed file was not found

Haben Sie Fragen zur Bedienung bestimmter Features von MemBrain? Sind Sie nicht sicher, welches Häkchen was bewirkt? Möchten Sie wissen, ob eine bestimmte Funktionalität in MemBrain vorhanden ist oder nicht?

Dann stellen Sie Ihre Fragen hier!
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: an unnamed file was not found

Post by TJetter »

Hallo Harry,

schön, dass es nun geht!
Tuefftler wrote:Kann es sein, dass Neuronen-Namen nur maximal 8 Zeichen haben dürfen? Was passiert, wenn die Namen sich erst ab dem neunten
Zeichen unterscheiden? Wahrscheinlich gar nichts, weil eh alles über den Neuronen-Index geht, oder?
Ja, es geht ohnehin alles über den Index. Aber es gibt keine Beschränkung auf 8 Zeichen, wir kommst Du darauf?
Tuefftler wrote:Wo hättest Du es denn gerne? Im Teil "Hilfe zu konkreten Projekten" oder lieber in "Rund um die Bedienung"?
Hilfe zu konkreten Projekten fände ich besser.
Für die DLL habe ich leider noch kein eigenes Unterforum eingerichtet...
Tuefftler wrote:Ich hätte da noch eine Frage zur Netz-Topologie: wenn man Börsendaten mit Membrain "vernudelt" und man dafür die Daten von 5 aufeinanderfolgenden Tagen verwendet, dann möchte man eventuell z.B. den Daten des aktuellsten Tages mehr "Gewicht" geben als dem davor, und diesem wiederum mehr "Gewicht" als dem davor u.s.w.
Wie bekommt man sowas sinnvoll hin?
Wäre es sinnvoll die Neuronen des aktuellsten Tages zu verfünffachen, die des Tages zuvor zu vervierfachen u.s.w. ?
Das Netz soll (nach wie vor) Zeit-invariant sein.
Dazu muss ich mir erst ein paar Gedanken machen, melde mich dann wieder. Dir auch schöne Feiertage!

Viele Grüße
Thomas Jetter
Tuefftler
Posts: 25
Joined: Mon 9. Dec 2013, 19:40

Re: an unnamed file was not found

Post by Tuefftler »

Hallo Thomas,

ok - mach' ich dann.
Vielen Dank für Deine Überlegungen, die Du anstellen willst. :D

Ich komme auf die 8 Zeichen bei den Neuronen-Namen, weil ich im MetaTrader nur 8 Zeichen angezeigt bekomme,
obwohl ich Deinen Dummy-String in Deiner Original-Länge auch für die Neuronen-Namen-"Vorbelegung" verwende.
Ach, ist nicht so wichtig, aber hier ist der MetaTrader-Script-Code ( siehe Function "start()" ) dazu:

//+------------------------------------------------------------------+

#property copyright ""
#property link ""




#property indicator_separate_window





#import "MemBrainDll.dll"
int __MB_GetVersionInfo@8(string VersionsInfo, int maxLen);

int __MB_LoadNet@4(string fileName);

int __MB_GetInputCount@0() ;
int __MB_GetOutputCount@0() ;

int __MB_GetInputName@12(int index,string name,int maxLen) ;
int __MB_GetOutputName@12(int index,string name,int maxLen) ;

#import







//+------------------------------------------------------------------+
int init()
{

int successfull = 0 ; // = -1 if not successfull ;
int index ;
int success ;



string VersionsInfo = "---------------------------------------PLACEHOLDER_DUMMY-------------------------------------------------- "; // don't try to optimize this if you're unexperienced with C-code
success = __MB_GetVersionInfo@8(VersionsInfo, StringLen(VersionsInfo)) ; // don't try to optimize this if you're unexperienced with C-code
if(success == successfull) Print(VersionsInfo) ;
if(success != successfull) return(0) ;



string FileName = "c:\\aktuell.mbn" ;


success = __MB_LoadNet@4(FileName);
if(success == successfull) Print("Load Net successfull") ;
if(success != successfull)
{
Print("Load Net not successfull") ;
return(0) ;
}




return(0);
}

//+------------------------------------------------------------------+
int deinit()
{
return(0);
}

//+------------------------------------------------------------------+
int start()
{
int index ;

//Anzahl Input Neuronen holen
int Anzahl_Input_Neurons ;
Anzahl_Input_Neurons = __MB_GetInputCount@0() ;
Print (Anzahl_Input_Neurons) ;


//Anzahl Output Neuronen holen
int Anzahl_Output_Neurons ;
Anzahl_Output_Neurons = __MB_GetOutputCount@0() ;
Print (Anzahl_Output_Neurons) ;



index = 0 ;
string Name_Input_Neuron = "---------------------------------------PLACEHOLDER_DUMMY-------------------------------------------------- ";
success = __MB_GetInputName@12(index,Name_Input_Neuron, StringLen(Name_Input_Neuron)) ;
Print(Name_Input_Neuron) ;



index = 0 ;
string Name_Output_Neuron = "---------------------------------------PLACEHOLDER_DUMMY-------------------------------------------------- ";
success = __MB_GetOutputName@12(index,Name_Output_Neuron,StringLen(Name_Output_Neuron)) ;
Print(Name_Output_Neuron) ;


return(0);
}
//+------------------------------------------------------------------+




Viele Grüße
Harry
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: an unnamed file was not found

Post by TJetter »

Bedeutet das, Du bekommst für zwei Input-Neuronen oder auch zwei Output-Neuronen die selben Namen und die Namen sind alle auf 8 Zeichen Länge abgeschnitten?
Ich habe momentan keine Idee, was die Ursache sein könnte.
Einzige Möglichkeit, die mir einfällt, ist, dass Du den String evtl. nicht jedes Mal vor Aufruf der Funktionen mit einem ausreichend langen 'Dummy' belegst.
Wenn Du also z.B. den Namen eines Neurons abfragst, und der nur 8 Zeichen lang ist und Du dann die Funktion für das nächste Neuron mit diesem 8-Zeichen String aufrufst, dann kann die Funktion natürlich auch wieder nur maximal 8 Zeichen zurückliefern.
In Deinem geposteten Code sehe ich einen solchen Fehler zwar nicht. In dem Beispiel-Code fragst Du ja aber auch nur jeweils genau ein Input- und ein Output-Neuron (nämlich mit Index 0) ab. ..

Grüße
Thomas Jetter
Tuefftler
Posts: 25
Joined: Mon 9. Dec 2013, 19:40

Re: an unnamed file was not found

Post by Tuefftler »

Hallo Thomas,

ja, der Neuronen-Name wird einfach nach dem 8-ten Zeichen abgeschnitten.
Das Abschneiden scheint eine Besonderheit vom
MetaTrader zu sein.

Die Function start() wird jedesmal automatisch aufgerufen (diese Automatik ist eine fest verdrahtete Funktionalität vom MetaTrader) , wenn ein Umsatz
für diese Aktie oder dieses Währungspaar erfolgt ist (was zu "normalen" Handelszeiten mehrmals pro Minute der Fall ist) und dabei wird ja jedesmal Dein
Dummystring in den String geschrieben. Daran kann es nach meinem Verständnis also eigentlich nicht liegen. Davon abgesehen wird der Neuronenname
auch schon beim allerersten Aufruf der Function start() abgeschnitten. Die Versionsinfo kommt witzigerweise in voller Länge.

Aber egal - macht nix, denn das ist eigentlich nicht tragisch, da ich ja nur mit jeweils einem Input- und einem Output-Neuron
testen wollte, ob ich überhaupt an die Namen dran komme. Zur Not könnte ich die auch auf 8 Zeichen kürzen.

Viele Grüße
Harry


P.S.: hier für Dich ein Stück Hintergrundwissen zum MetaTrader, weil ja offenbar doch immer 'mal wieder jemand hier im Forum damit daher kommt.

WICHTIG: Die MembrainDLL.dll muss im MetaTrader-Unterverzeichnis ......\experts\libraries liegen.

Der Metatrader unterscheidet zwischen 3 Arten von Script-Konstrukten:
1. so called "Expert Advisors" (kurz: EAs)- das sind Script-Konstrukte, die "kontinuierlich" laufen und automatisch traden.
2. so called "Custom Indicators" (bei deutscher Sprachauswahl sog. "Angepasste Indikatoren" ) , die "kontinuierlich" laufen und entweder im Chart-Hauptfenster, oder in einem Fenster darunter z.B. Moving Averages, RSI oder sonstige bekannte oder selbst erfundene Indikatoren grafisch darstellen - und auch im Script programmierte Alarme auslösen können.
3. so called "Scripts" , die nur einmalig ausgeführt werden, z.B. um nicht ausgeführte Orders zu löschen, oder z.B. um manuell eingezeichnete Trendlinien, oder sonstwas zu löschen.

"Kontinuierlich" habe ich bei Expert Advisors und bei Custom Indicators deshalb in Anführungszeichen gesetzt, weil diese Kontinuität von mir so gemeint ist, dass das Script-Konstrukt in einer (fest verdrahteten) Warteschleife immer (also sozusagen kontinuierlich) auf der Lauer nach einem erfolgten Umsatz liegt und aber der Aufruf der Function start() jedesmal erst durch einen erfolgten Umsatz ausgelöst wird. Falls Umsätze so schnell hintereinander erfolgen, dass die aufgerufene Function start() auf Grund ihres Zeitbedarfs noch nicht zu Ende gekommen ist, dann wird die function start() solange nicht neu aufgerufen, bis sie zu Ende gekommen ist.

Das was ich mit dem MetaTrader "veranstalte", sind bisher immer nur Custom Indicators gewesen, die bei mir hauptsächlich Alarme auslösen sollen.
Kombiniert mit der MembrainDLL.dll sagt Dir dann ein solcher Alarm, ob du jetzt long oder short gehen sollst - sprich: ob du kaufen oder verkaufen sollst.
Ohne Membrain ist mir diese Entscheidung bis jetzt noch nie vernünftig geglückt - deshalb versuche ich das jetzt eben 'mal mit Membrain zusammen.
Last edited by Tuefftler on Sat 21. Dec 2013, 12:02, edited 1 time in total.
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: an unnamed file was not found

Post by TJetter »

Könntest Du mal den vollen und den durch MT gekürzten Namen posten? Wollte nur mal schauen, ob mir da was auffällt. Möchte nur sicher stellen, dass da nicht doch noch ein anderes Problem bei der MT Integration schlummert.

Grüße
Thomas Jetter
Tuefftler
Posts: 25
Joined: Mon 9. Dec 2013, 19:40

Re: an unnamed file was not found

Post by Tuefftler »

Hallo Thomas,

25.12.2014:
das mit den nicht vollständig geprinteten Neuronen-Namen habe ich mittlerweile gelöst.
Die Namen werden komplett gedruckt, wenn man immer als Maxlen die Länge von pName plus die Differenz der Länge vom zuvor ausgelesenen Neuronen-Namen zum längsten Neuronen-Namen an __MB_GetInputName@12 bzw. an __MB_GetOutputName@12 übergibt. Noch einfacher ist es, wenn man als MaxLen gleich von vornherein die StringLen vom längsten Neuronen-Namen nimmt und vorsichtshalber noch 1 für die in C angehängte ASCII-Null draufaddiert. Im angehängten MetaTrader-Script funktioniert das jetzt wunderbar - auch mit dem Netz mit den vielen (48 Stück) Input-Neuronen.


Aber ich habe jetzt ein anderes, absolut niederschmetterndes Problem: ich kann keine Input-Activations anlegen bzw. bekomme nach einem ThinkStep keinen vernünftigen Output.
Zur Veranschaulichung habe ein ganz einfaches Membrain-Netz mit einem Input-Neuron und einem Output-Neuron gemacht, das 0 bzw. 1 als Inputs haben kann und diese dann negieren soll - also als Outputs 1 bzw. 0 hat.

Ich lege erst mal 1 als Input an, mache einen Thinkstep und bekomme als Output 0.
Dann lege ich 0 als Input an, mache einen Thinkstep und bekomme 0 als Output.
Dann lege ich nochmal 1 als Input an und versuche diese Input-Activation auszulesen und bekomme 0 als angelegten Input.

Die Inputs scheinen also am Netz gar nicht anzuliegen. Was mache ich falsch?

Habe Dir das Netz, den Sourcecode vom MetaTrader-Script und die im MetaTrader geprinteten Reaktionen des MetaTrader-Scriptes angehängt.


26.12.2013
Was ist denn eigentlich der Unterschied beim Deklarieren der Parameter einer Funktion zwischen ByVal und ByRef?
Deklariert ByRef einen Pointer (z.B. bei: __MB_GetOutputAct@8(ByVal idx As Long, ByRef act As Double) ?
MetaTrader4 kennt aber leider keine Pointer - hier endet die Ähnlichkeit bezüglich C.
Aber irgendein Wert müsste ja trotzdem als Output an den MetaTrader übergeben werden,
das wäre dann eben eine Adresse anstatt des eigentlichen Wertes, oder?
Aber der MetaTrader printet nur 0.00000000.


Viele Grüße
Harry
Attachments
Screenshot aus dem MetaTrader.jpg
Screenshot aus MetaTrader mit den Reaktionen des MetaTrader-Scriptes
(178.63 KiB) Not downloaded yet
zzzz 01 Connection of Membrain to MetaTrader4.txt
Sourcecode vom MetaTrader-Script
(7.48 KiB) Downloaded 645 times
Negation.mbn
das Membrain-Netz
(350 Bytes) Downloaded 597 times
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: an unnamed file was not found

Post by TJetter »

Oh je, diesen Post habe ich leider jetzt erst gesehen! - Manchmal funktioniert die E-Mail Benachrichtigung durch das Forum nicht, das ist sehr unschön!
Ist das Problem noch aktuell? Hier jedenfalls meine Antworten:
Tuefftler wrote:26.12.2013
Was ist denn eigentlich der Unterschied beim Deklarieren der Parameter einer Funktion zwischen ByVal und ByRef?
Deklariert ByRef einen Pointer (z.B. bei: __MB_GetOutputAct@8(ByVal idx As Long, ByRef act As Double) ?
Genau so ist es, ja. Der Code kann so nicht funktionieren. Vielmehr kann er ganz heftige Crashs zur Folge haben, da anstatt einer validen Adresse eines 'doubles' der Wert eines doubles übergeben wird (und von der dll als Adresse interpretiert wird, an die die dll dann schreibt)
Tuefftler wrote:MetaTrader4 kennt aber leider keine Pointer - hier endet die Ähnlichkeit bezüglich C.
Ganz sicher? Was sagt denn Metatrader, wenn Du den folgenden Funktionsaufruf hinschreibst:

Code: Select all

__MB_GetOutputAct@8(output_idx, &output_activation);
(also mit &-Operator vor der Variablen)?
Wenn das nicht geht, dann kann ich mir nur vorstellen, dass Metatrader eine alternative Syntax verwendet, man könnte ja ansonsten gar keine 'ByRef' übergaben an eine dll machen...

Viele Grüße und nochmal sorry vielmals für die späte Antwort!
Thomas
Thomas Jetter
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: an unnamed file was not found

Post by TJetter »

Das habe ich gerade gefunden:
References: Modifier & and Keyword this Passing Parameters by Reference In MQL5 parameters of simple types can be passed both by value and by reference, while parameters of compound types are always passed by reference. To inform the compiler that a parameter must be passed by reference, the ampersand character & is added before the parameter name.
über:
http://www.mql5.com/en/search#!keyword= ... 0reference
Spricht eigentlich dafür, dass es so wie oben beschrieben müsste, funktionieren sollte...

Viele Grüße,
Thomas
Thomas Jetter
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: an unnamed file was not found

Post by TJetter »

Noch einen Hinweis gefunden:
All parameters of simple types are passed by values unless it is explicitly indicated that they are passed by reference. When a string is passed, the address of the buffer of the copied string is passed; if a string is passed by reference, the address of the buffer of this string without copying it is passed to the function imported from DLL.

Structures that contain dynamic arrays, strings, classes, other complex structures, as well as static or dynamic arrays of the enumerated objects, can't be passed as a parameter to an imported function.

When passing an array to DLL, the address of the beginning of the data buffer is always passed (irrespective of the AS_SERIES flag). A function inside a DLL knows nothing about the AS_SERIES flag, the passed array is a static array of an undefined length; an additional parameter should be used for specifying the array size.
unter:
http://docs.mql4.com/runtime/imports
Daraus könnte man schließen, dass Call-By-Reference, zumindest unter MQL4, mindestens für Strings und Arrays unterstützt wird. Wenn also der &-Operator nicht funktioniert, dann sollte es als Workaround funktionieren, einen Array aus doubles (Länge 1 genügt) anzulegen und diesen an die DLL zu übergeben. Laut dem Hinweis oben wird dabei die Adresse übergeben, so dass nach der Rückkehr der DLL-Funktion der zurückgegebene double-Wert im ersten double-Element des Arrays stehen müsste.

Also:

Code: Select all

double output_activation[1]; // Deklaration als Array, um Call-By-Value zu ermöglichen
__MB_GetOutputAct@8(output_idx, output_activation);
Print("applied input_activation: " + input_activation + "    Output: " + output_activation[0]) ;
Viele Grüße,
Thomas
Thomas Jetter
Tuefftler
Posts: 25
Joined: Mon 9. Dec 2013, 19:40

Re: an unnamed file was not found

Post by Tuefftler »

Hallo Thomas,

nun ja, ich hatte mir damals gesagt, dass Du offenbar von meiner Fragerei genug hattest und wollte Dich dann nicht weiter belästigen.
Da ich damit aber offenbar falsch lag, bedanke ich mich für Deine weiteren Antworten vielmals.
Um solche Missverständnisse zeitnah auszuräumen - kann man Dich eigentlich auch 'mal anrufen?

Mittlerweile habe ich das Thema "Backpropagation-Netze" mit den Netzen von FaNN2MQL in den Griff bekommen - zumindest was das Netzwerk-Training und
das Zusammenspiel mit dem MetaTrader 4 angeht.

Nächstens werde ich ins Thema SOMs einsteigen. Kannst Du mir hier irgendeine Literatur empfehlen, die ganz pragmatisch ans Thema heranführt,
ohne allzu viel theoretisches Drumrum? Um die Anwendung von SOMs für den Einstieg zu verstehen, wäre dazu die Erkennung von Zahlen gut geeignet?


Viele Grüße
Harald
Post Reply