Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Neuralnetworks for CMS-Tradepanel

Geschrieben

Hallo,

 

Hier nun das Neurale Plugin.

 


function TNN_frm.anns_load(path: string):integer;
var ann: integer;
begin
ann:= -1;

ann:= f2M_create_from_file (path);

if ann > -1 then
 begin
    debug(1,'Nero: ' + path + ' loaded successfully ');
 end;
 	// Create ANN
 if ann = -1 then
  begin
  ann := f2M_create_standard (4, AnnInputs, AnnInputs, AnnInputs div 2 + 1, 1);
  f2M_set_act_function_hidden (ann, FANN_SIGMOID_SYMMETRIC_STEPWISE);
  f2M_set_act_function_output (ann, FANN_SIGMOID_SYMMETRIC_STEPWISE);
  	f2M_randomize_weights (ann, -1.0, 1.0);
   debug(1,'Nero: ' + path + ' created successfully with handler ');
  end;

 if ann = -1 then
  begin
  debug(0,'ERROR INITIALIZING NETWORK!');
  end;

  result:= ann;
end;

//------

procedure TNN_frm.ann_save(ann: TNetInteger; path: string);
var ret: integer;
begin
   ret := -1;
   ret := f2M_save (ann, path);
   debug(1,'f2M_save(' + inttostr(ann) + ', ' + path + ') returned: ' + inttostr(ret));
end;

//------

procedure  TNN_frm.ann_destroy(ann: TNetInteger);
var ret: integer;
begin
   ret := -1;
   ret := f2M_destroy(ann);
   //ret := f2M_destroy_all_anns();
   debug(1,'f2M_destroy(' + inttostr(ann) + ') returned: ' + inttostr(ret));
end;

//------

function  TNN_frm.ann_run(ann: TNetInteger; vector: TArrayofDouble): double;
var ret: integer;
   outp: double;
begin
   ret := f2M_run(ann, vector);
   if (ret < 0) then
    begin
     debug(0,'Network RUN ERROR! ann=' + inttostr(ann));
     result:= FANN_DOUBLE_ERROR;
    end;

   outp := f2M_get_output (ann, 0);
    debug(1,'f2M_get_output(' + inttostr(ann) + ') returned: ' + floattostr(outp));
   result:= outp;
end;

//------

function TNN_frm.anns_run_parallel(anns_count: TNetInteger; anns: TArrayofInteger; input_vector: TArrayofDouble): integer;
var ret: integer;
begin
   ret := f2M_run_parallel (anns_count, anns, input_vector);

   if (ret < 0) then
    begin
     debug(1,'f2M_run_parallel(' + inttostr(anns_count) + ') returned: ' + inttostr(ret));
    end;

   result:= ret;
end;

//------

procedure TNN_frm.ann_prepare_input(slr1, slr2: TStringlist);
var i: integer;
   res: double;
begin
  res:=0;

  for i := 0 to AnnInputs do   //for (i = 0; i <= AnnInputs - 1; i = i + 3)
   begin
    if (slr1[i] > '') and (slr2[i] > '') then
     begin
      InputVector[i]  := StrToFloat(StringReplace(slr1[i],'.',',',[rfReplaceAll]));
     end;
    end;

end;

//------

procedure TNN_frm.run_anns;
var i: integer;
begin

  if Parallel then
   begin
    anns_run_parallel(AnnsNumber, AnnsArray, InputVector);
   end;

  for i := 0 to AnnsNumber do
   begin
     if Parallel then
      begin
        AnnOutputs[i] := f2M_get_output (AnnsArray[i], 0);
      end else begin
        AnnOutputs[i] := ann_run(AnnsArray[i], InputVector);
      end;
   end;

end;

//------

procedure TNN_frm.ann_train(ann: Integer; input_vector, output_vector: TArrayofDouble);
begin
   if f2M_train (ann, input_vector, output_vector) = -1 then
    begin
    	debug(0,'Network TRAIN ERROR! ann=' + inttostr(ann));
    end;
     debug(1,'ann_train(' + inttostr(ann) + ') succeded');
end;

//------

function TNN_frm.ann_wise_long(): double;
var i: integer;
   ret: double;
begin
   if AnnsNumber < 1 then
    begin
     result:= -1;
    end;

   for i := 0 to AnnsNumber do
    begin
      ret:=  ret + AnnOutputs[i];
    end;

    ret:= 2 * ret / AnnsNumber;

   result:= ret;
end;

//------

function TNN_frm.ann_wise_short(): double;
var i: integer;
   ret: double;
begin

   if AnnsNumber < 1 then
    begin
     result:= -1;
    end;

   for i := 1 to AnnsNumber do
    begin
      ret:=  ret + AnnOutputs[i];
    end;

    ret:= 2 * ret / AnnsNumber;

   result:= ret;
end;

//-------

procedure TNN_frm.Start_Neuro(sl1, sl2: TStringlist);
var i : integer;
begin
if nn_Close then
 begin

 train_output[0]:= 0;

 ann_prepare_input(sl1, sl2);
 run_anns();


 if ann_wise_long() > 0 then
  begin
    Label1.Caption:= 'BUY';
  end;

 if ann_wise_long() < 0 then
  begin
    Label1.Caption:= 'SELL';
  end;


 Label7.Caption:= '.....................'+FormatFloat('0.0000', ann_wise_long());
 Label5.Caption:= '.....................'+FormatFloat('0.0000', ann_wise_short());
 end;


if Order_btn > 0 then
 begin
//---- ist Order Buy ? dann
 { if Order_btn = 1 then
   begin
       train_output[0]:= 1;
     end else begin
       train_output[0]:= -1;
   end; }
//---- ist Order Sell? dann
  if Order_btn = 2 then
   begin
      train_output[0]:= 1;
     end else begin
      train_output[0]:= -1;
   end;
//---- Training
 for i := 0 to AnnsNumber -1 do
  begin
   ann_train (AnnsArray[i], InputVector, train_output);
   Order_btn:=0;
  end;
 end;

end;

//--------

procedure TNN_frm.deinit_Neuro;
var i: integer;
begin

for i := AnnsNumber -1 downto 0 do
 begin
   ann_save(AnnsArray[i], AnnPath + 'CMS-Tradepanel.' + inttostr(i) + '.net');
   ann_destroy(AnnsArray[i]);
 end;
  f2M_parallel_deinit ();

end;


procedure TNN_frm.Einstellung1Click(Sender: TObject);
begin
Form2.Show;
end;

procedure TNN_frm.FormDestroy(Sender: TObject);
begin
nn_Close:= false;

//deinit_Neuro;

end;

procedure TNN_frm.FormShow(Sender: TObject);
var 	LReg:TRegistry;
begin
NN_frm.FormStyle:= fsStayOnTop;

 LReg := TRegistry.Create;
 LReg.RootKey:=HKEY_CURRENT_USER;

 if LReg.OpenKey('Software', True) then
 begin
   if not LReg.KeyExists('CMS_Comaso.de') then
     Exit;
   if LReg.OpenKey('CMS_Comaso.de',true) then
   begin
     if LReg.OpenKey('CMS_Tradepanel',true) then
     begin
       if LReg.OpenKey('Master_frm',true) then
       begin
        if LReg.ValueExists('Width') then
         begin
            Left:= LReg.ReadInteger('Width') + 30;
         end;
          if LReg.ValueExists('Pos_Y') then
           begin
             Top:= LReg.ReadInteger('Pos_Y');
         end;
       end;
     end;
   end;
 end;
init_Neuro;
end;

//-------

procedure TNN_frm.init_Neuro;
var i, ann: integer;
begin
   ann:= -1;
   nn_Close:= true;
   AnnPath := 'C:\ANN\';
   AnnsNumber:= strtoint(Form2.Edit2.Text);
   AnnInputs:= strtoint(Form2.Edit3.Text);

   // Initialize anns
   SetLength(AnnsArray, AnnsNumber +1);
   SetLength(AnnOutputs, AnnsNumber +1);
   SetLength(InputVector, AnnInputs +1);
   SetLength(train_output, 0 +1);

   for i := 0 to AnnsNumber -1 do
    begin
      ann:= anns_load(AnnPath  + 'CMS-Tradepanel.' + inttostr(i) + '.net');
       if ann < 0 then
        begin
          AnnsLoaded := false;
        end;
          AnnsArray[i] := ann;
    end;

   f2M_parallel_init ();

end;

 

Änderungen und Verbesserungen Erwünscht :)

 

So weit so gut. Ich denke, so richtig Intelegend wäre es, wenn das Netzwerk auch den Ausstieg erlernen könnte.

 

Oder was meint Ihr.

 

Gruß Bernd

Featured Replies

Geschrieben

Blau ist t und rot ist t+1 ...

 

Zum besseren Verständnis habe ich mal beide Signale übereinander gelegt.

 

Einmal EurUsd und Ger30 ... wobei eine Verfälschung vorliegt, da sich das Signal auf

jetzt 20:10 bezieht und nicht auf 00:00 bzw. 22:00 GMT.

 

Backtest == Vergangenheit == Nachricht

Neural Netzwerk bzw. Forecast == Zukunft

 

@Rainworm: Der eine macht back und der andere macht forward.

Long_07-Mar-2011_EURUSD.png

Flat_07-Mar-2011_GER30.png

Geschrieben

Backtest == Vergangenheit == Nachricht

Neural Netzwerk bzw. Forecast == Zukunft

Der eine macht back und der andere macht forward.

Das ist auch mein Verständnis. Deine Screenshots zeigen genau diesen Forecast. Auf Basis dieser Erkenntnis könnte man dann Einstiege definieren.

 

Bernd jedoch füttert sein neuronales Netz (bitte korrigiere mich, wenn ich dich nicht richtig verstanden habe) mit Einstiegen und Ausstiegen, womit er das Netz trainiert. Also nicht mit Kursen. Das heißt, das Netz lernt: wann muss ich einsteigen, wann muss ich aussteigen. Das könnte ich mit einem Backtest (und den gleichen Inputs) auch hinbekommen, da die Signalbeurteilung nur auf Basis historischer Daten beruht.

Geschrieben
  • Autor

@RAiNWORM,

 

Genau da liegt ja das Problem. Ich will dem Netz, Ein und Ausstieg Beibringen.

Bei der FAnn2Mql kannst du aber nur eins von beiden.

 

Warum ein RCC Netz?

 

Das Gesamttraining des Netzwerkes arbeitet mit Backtracking, d.h. es kann im

schlechten Falle eine bestimmte Anzhal von Schritten zurückgehen, zu einer

besseren Lösung, und von dort ausgehend erneut trainieren.

Um das Training zu beschleunigen benutzt das RCC NN ein Caching der Aktivierungen.

Trotz alledem ist das Netz in der Lage auch inkrementel trainiert zu werden,

d.h. man kann das Netz zu jeder Zeit weitertrainieren oder auf geänderte Muster

trainieren.

 

 

So ich hab mein RCC Netz fertig.

 

 

Gruß Bernd

Geschrieben

Blau ist t und rot ist t+1 ...

 

Ah ok. Also wenn das außerhalb der Trainingszeitraums so läuft, dann wunderts mich jetzt einfach mal warum du noch nicht reich bist (oder schreibst du von deiner eigenen Insel aus? ;)

 

Das könnte ich mit einem Backtest (und den gleichen Inputs) auch hinbekommen, da die Signalbeurteilung nur auf Basis historischer Daten beruht.

 

Jein, an sich gehts bei NNs darum komplexe Funktionen über die man nichts weiß zu "erlernen". Also wenn ich eine Funktionstabelle hab, wo ich zu gewissen Parametern den Output kenne, und davon ausgehe das ich alle Parameter kenne, aber ich keine Ahnung hab wie die Funktion aussieht/aussehen könnte, dann hilft ein NN (manno das is ein schachtelsatz).

 

Es stellt sich natürlich immer die Frage ob das Sinn macht. Im Fall hier hat Bernd ja schon gesagt das es ihn einfach interessiert ob das NN es lernen kann.

Anders is es zB bei Bilderkennung etc. wo die Inputparameter alle Pixel des Bildes sind und man dem Netz beibringt zu erkennen obs Apfel oder Birne is.

Geschrieben
  • Autor

@Mythos

 

Jepp, Schrift-/Spracherkennungen ist viel einfacher für ein NN zu lösen.

 

 

Gruß Bernd

Geschrieben

Nicht mehr ganz neu, aber ein guter Einstieg um "Einstiege" zu finden.

 

1. If ru > 0 and rd > 0, a long position in the market is established or maintained.

2. If ru

3. Otherwise, the normalized difference diff is computed as

...

ChOL96.pdf

Geschrieben
  • Autor

Hallo,

 

Mit einem Neuralem Netz hat man sicher keinen Gold Esel. Aber man könnte seine eigene Performance Verbessern.

 

Falls es jemanden Interessiert, warum es einfacher ist, Bild, Sprache und Schrift, für ein Neurales Netz dieses Problem zu Lösen. Es liegt daran das es bei den 3 Varianten feste Grenzen gibt.

 

@Mythos

 

Ich schreib mein RCC Netz in eine Dll, dann kanst du es ja mal Testen.

 

Gruß Bernd

  • 4 Wochen später...
Geschrieben

Hallo Bernd,

 

wollte nur mal nachfragen, wie es Dir und dem Projekt CMS geht :wub:. Fand die Entwicklung richtig spannend und würde mich freuen, wenn wir ab und an etwas Neues begutachten dürfen.

 

Nachdem das wieder etwas ruhiger geworden war habe ich mir die in dem Zusammenhang auch erörterte Synchronisation der Metatrader zwischenzeitlich selbst programmiert.

 

Ein 'Master' aktualisiert nach jeder Änderung an einer Tradingposition über FTP auf einem Webserver einen Timestamp und eine kleine Textdatei mit den Tradeinformationen, die Clients pollen über HTTP alle 20 Sekunden ob sich der Timestamp geändert hat laden dann die Textdatei herunter. Dann werden die Infos von den Clients umgesetzt, also Positionen geöffnet, geschlossen, ggf. auch SL und TP angepasst.

 

Für jede Position wird auch das empfohlene Risiko mitgeteilt, das gibt es IMHO bei anderen Programmen zur Synchronisation so nicht. Ich halte das aber für ganz wichtig.

 

Lutz

Geschrieben

Ein 'Master' aktualisiert nach jeder Änderung an einer Tradingposition über FTP auf einem Webserver einen Timestamp und eine kleine Textdatei mit den Tradeinformationen, die Clients pollen über HTTP alle 20 Sekunden ob sich der Timestamp geändert hat laden dann die Textdatei herunter. Dann werden die Infos von den Clients umgesetzt, also Positionen geöffnet, geschlossen, ggf. auch SL und TP angepasst.

 

Für jede Position wird auch das empfohlene Risiko mitgeteilt, das gibt es IMHO bei anderen Programmen zur Synchronisation so nicht. Ich halte das aber für ganz wichtig.

 

Falls es jemanden interessiert das Format der Textdatei:

 

22140822;EURUSD;1;0.04000000;1302082890;1.43001000;1.43204000;1.42350000;18;0.50000000; ;

22140828;EURUSD;1;0.04000000;1302082928;1.43006000;1.43205000;1.42550000;18;0.50000000; ;

22140830;EURUSD;1;0.04000000;1302082938;1.43011000;1.43206000;1.42750000;18;0.50000000; ;

 

TradeID; Instrument; Tradetyp; Lots; Timestamp Entry; Price Entry; Stop Loss; Take Profit;Setup Nr.;Risiko in %; frei;

 

Simpel und funktioniert bis auf kleine Problemchen.

 

Lutz

Geschrieben

Simpel und funktioniert bis auf kleine Problemchen.

Reichen 20sec Poll-Zeit aus? Für Marketeinstiege dürfte das ziemlich lange sein. Die Idee finde ich interessant. So lässt sich mit dem MT4 über mehrere Broker gleichzeitig handeln.

Geschrieben

Reichen 20sec Poll-Zeit aus? Für Marketeinstiege dürfte das ziemlich lange sein.

 

Das kommt natürlich auf den angepeilten Zeitrahmen an, in der Praxis mittelt sich das auch etwas aus. Ich will den Client aber noch erweitern dass Positionen nur geöffnet werden wenn der Kurs noch x Pips in der Nähe ist. GGf. wird dann eben etwas gewartet, selten gehen die Kurse ja geradlinig nur in eine Richtung.

 

Prinzipiell könnte man die 20 Sekunden aber auch verringern, ein Webserver ist ja gut dafür geeignet mit vielen Anfragen umzugehen.

 

Die Idee finde ich interessant. So lässt sich mit dem MT4 über mehrere Broker gleichzeitig handeln.

 

Ja, auch dafür eignet es sich.

 

Lutz

Geschrieben

Prinzipiell könnte man die 20 Sekunden aber auch verringern, ein Webserver ist ja gut dafür geeignet mit vielen Anfragen umzugehen.

 

würd ich ehrlich gesagt aufpassen. Webserver ist schon gut für viele Anfragen, aber nicht unbedingt wenn sie vollautomatisch in kurzem Intervall erfolgen. Vor allem musst die Übertragungszeit mit einkalkulieren.

Für die Ortsunabhängige Verwendung is ein Webserver natürlich optimal. Aber wenns nur darum geht lokale MTs zu synchronisieren (mehrere Broker exakt gleich handeln lassen), wieso nicht über ein synch-file? Geht in MT genauso flockig und is wesentlich schneller...

Geschrieben

würd ich ehrlich gesagt aufpassen. Webserver ist schon gut für viele Anfragen, aber nicht unbedingt wenn sie vollautomatisch in kurzem Intervall erfolgen. Vor allem musst die Übertragungszeit mit einkalkulieren.

Für die Ortsunabhängige Verwendung is ein Webserver natürlich optimal. Aber wenns nur darum geht lokale MTs zu synchronisieren (mehrere Broker exakt gleich handeln lassen), wieso nicht über ein synch-file? Geht in MT genauso flockig und is wesentlich schneller...

 

Es soll ortsunabhängig sein, irgendwo den Metatrader starten, den Webclient laden, Terminal-ID wird zur Identifizierung in den Script auf dem Server eingetragen und es läuft.

 

Geschwindigkeit ist bei dem gegebenen Tradingstil nicht die grosse Herausforderung, falls es das mal ist wird dort im Rahmen der Anforderungen optimiert.

 

Lutz

  • 7 Monate später...
Geschrieben
  • Autor

Hallo whipsaw,

 

wollte nur mal nachfragen, wie es Dir und dem Projekt CMS geht . Fand die Entwicklung richtig spannend und würde mich freuen, wenn wir ab und an etwas Neues begutachten dürfen.

 

Das Projekt CMS Tradepanel geht weiter. Die Plugin SDK ist so gut wie fertig.

 

@lutzs

Ich habe dich nicht vergessen. Ein Plugin das mehrere Clienten verbindet und Daten Verschlüsselt weiter gibt, habe ich in meiner Abwesenheit fertig gestellt. Das Plugin läuft sehr gut, ich bin aber noch nicht zufrieden mit dem Handling.

 

 

Gruß Bernd

Geschrieben

@lutzs

Ich habe dich nicht vergessen. Ein Plugin das mehrere Clienten verbindet und Daten Verschlüsselt weiter gibt, habe ich in meiner Abwesenheit fertig gestellt. Das Plugin läuft sehr gut, ich bin aber noch nicht zufrieden mit dem Handling.

 

Hallo Bernd,

 

habe mir mittlerweile eine Lösung gestrickt die mehrere MT4-Clients über den FTP-Bereich eines Webservers an einen Master hängt.

Auf jedem Client ist das Risiko in % des Accounts getrennt einstellbar, synchronisiert wird alle 20 Sekunden.

 

Für meine Belange funktioniert das, wenn es mit dem Traden noch stabiler klappt könnte ich damit 'in Produktion' gehen.

 

Ich arbeite an mir.

 

Lutz

  • 1 Monat später...
Geschrieben
  • Autor

Hallo,

 

 

Das erste Plug-in ist Fertig. Der Neural Netzwerk Berater läuft, er befindet sich im Test.

Ich werde die Neue Version vom Tradepanel mit dem Neuralem Plug-in Hier ins Forum stellen.

 

tradepanel.jpg

 

Ich habe das Tradepanel Überarbeitet und kleinere Fehler beseitigt. Dank eurer Hilfe :correct: .

 

Gruß Bernd

Geschrieben
  • Autor

Hi,

 

Am Look kann ich ja noch nach deinem Test rum mach : :biggrin: .

Vieleicht hat ja auch jemand eine Idee, wie es aussehen könnte.

 

Gruß Bernd

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.