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.
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