const long ExtInputShape [] = {1,10,4}; // Eingangsform des Modells
const long ExtOutputShape[] = {1,1}; // die Ausgangsform des Modells
#resource "Python/model.onnx" as uchar ExtModel[];// Modell als Resource
long handle; // Handle des Modells
ulong predictions=0; // Prognosezähler
ulong confirmed=0; // Prognosezähler der Erfolge
//+------------------------------------------------------------------+
//| Expert Initialisierungsfunktion |
//+------------------------------------------------------------------+
int OnInit()
{
//--- basic checks
if(_Symbol!="EURUSD")
{
Print("Symbol must be EURUSD, testing aborted");
return(-1);
}
if(_Period!=PERIOD_H1)
{
Print("Timeframe must be H1, testing aborted");
return(-1);
}
//--- Modell erstellen
handle=OnnxCreateFromBuffer(ExtModel,ONNX_DEBUG_LOGS);
//--- Die Form der Eingangsdaten spezifizieren
if(!OnnxSetInputShape(handle,0,ExtInputShape))
{
Print("OnnxSetInputShape failed, error ",GetLastError());
OnnxRelease(handle);
return(-1);
}
//--- Spezifikation der Form der Ausgangsdaten
if(!OnnxSetOutputShape(handle,0,ExtOutputShape))
{
Print("OnnxSetOutputShape failed, error ",GetLastError());
OnnxRelease(handle);
return(-1);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinitialisierungsfunktion des Experten |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- Operation des Modells beenden
OnnxRelease(handle);
//--- Berechnung und Ausgangs von Prognosestatistiken
PrintFormat("Successfull predictions = %.2f %%",confirmed*100./double(predictions));
}
//+------------------------------------------------------------------+
//| Tick-Funktion des Experten |
//+------------------------------------------------------------------+
void OnTick()
{
static datetime open_time=0;
static double predict;
//--- die aktuelle Öffnungszeit des Balkens überprüfen
datetime time=iTime(_Symbol,_Period,0);
if(time==0)
{
PrintFormat("Failed to get Time(0), error %d", GetLastError());
return;
}
//--- wenn sich der Eröffnungszeitpunkt nicht geändert hat, OnTick verlassen
if(time==open_time)
return;
//--- die Schlusskurse der letzten beiden geschlossenen Balken ermitteln
double close[];
int recieved=CopyClose(_Symbol,_Period,1,2,close);
if(recieved!=2)
{
PrintFormat("CopyClose(2 bars) failed, error %d",GetLastError());
return;
}
double delta_predict=predict-close[0]; // prognostizierte Preisbewegung
double delta_actual=close[1]-close[0]; // aktuelle Preisänderung
if((delta_predict>0 && delta_actual>0) || (delta_predict<0 && delta_actual<0))
confirmed++;
//--- den Schlusskurs des neuen Balkens berechnen, um den Kurs des nächsten Balkens zu validieren
matrix rates;
//--- Abrufen von 10 Balken
if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,1,10))
return;
//--- Eingang einer Reihe von OHLC-Vektoren
matrix x_norm=rates.Transpose();
vector m=x_norm.Mean(0);
vector s=x_norm.Std(0);
matrix mm(10,4);
matrix ms(10,4);
//--- die Normalisierungsmatrizen ausfüllen
for(int i=0; i<10; i++)
{
mm.Row(m,i);
ms.Row(s,i);
}
//--- Normalisieren der Eingangsdaten
x_norm-=mm;
x_norm/=ms;
//--- konvertieren der normalisierten Eingänge in den Type float
matrixf x_normf;
x_normf.Assign(x_norm);
//--- hier die Ausgangsdaten des Modells abrufen, d. h. die Preisvorhersage
vectorf y_norm(1);
//--- Ausführen des Modells
if(!OnnxRun(handle,ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION,x_normf,y_norm))
{
Print("OnnxRun failed, error ",GetLastError());
}
//--- eine Rücktransformation durchführen, um den vorhergesagten Preis zu erhalten und ihn bei einem neuen Balken zu validieren
predict=y_norm[0]*s[3]+m[3];
predictions++; // Prognosezähler erhöhen
Print(predictions,". close prediction = ",predict);
//--- die Öffnungszeit des Balkens speichern, um sie beim nächsten Tick zu überprüfen
open_time=time;
}
|