Strateji Sınayıcıda Model Doğrulama

Finansal piyasalarda ticaret işlemleri gerçekleştirmek için oluşturulan modeller, MetaTrader 5 terminalinde Strateji Sınayıcıda doğrulanabilir. Bu, piyasa ortamını ve ticaret koşullarını ek olarak taklit etme ihtiyacını ortadan kaldıran en hızlı ve en uygun seçenektir.

Modeli test etmek için, herkese açık ONNX.Price.Prediction projesindeki kodu temel alan bir Uzman Danışman oluşturalım. Bu, bazı düzenlemeler gerektirecektir.

Modelin oluşturulmasını OnInit fonksiyonuna, onnx oturumunun kapatılmasını da OnDeinit fonksiyonuna taşıyacağız. Modelle çalışma ana bloğu, OnTick işleyicisine yerleştirilecektir.

Ayrıca, mevcut Kapanış fiyatı ile öngörüyü karşılaştırmak için gerekli olan önceki iki çubuğun Kapanış fiyatlarının elde edilmesini de ekleyelim.

Uzman Danışman kodu kısadır ve okunması kolaydır.

 
const long   ExtInputShape [] = {1,10,4}; // modelin girdi şekli
const long   ExtOutputShape[] = {1,1};    // modelin çıktı şekli
#resource "Python/model.onnx" as uchar ExtModel[];// kaynak olarak model
 
long handle;         // model tanıtıcısı
ulong predictions=0// öngörü sayacı
ulong confirmed=0;   // başarılı öngörü sayacı
//+------------------------------------------------------------------+
//| Uzman danışman başlatma fonksiyonu                               |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- temel kontroller
   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);
     }
//--- modeli oluştur
   handle=OnnxCreateFromBuffer(ExtModel,ONNX_DEBUG_LOGS);
//--- girdi verilerinin şeklini belirt
   if(!OnnxSetInputShape(handle,0,ExtInputShape))
     {
      Print("OnnxSetInputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//--- çıktı verilerinin şeklini belirt
   if(!OnnxSetOutputShape(handle,0,ExtOutputShape))
     {
      Print("OnnxSetOutputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Uzman danışman sonlandırma fonksiyonu                            |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- model çalışmasını tamamla
   OnnxRelease(handle);
//--- öngörü istatistiklerini hesapla ve yazdır
   PrintFormat("Successfull predictions = %.2f %%",confirmed*100./double(predictions));
  }
//+------------------------------------------------------------------+
//| Uzman Danışman tik fonksiyonu                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   static datetime open_time=0;
   static double predict;
//--- mevcut çubuğun açılış zamanını kontrol et
   datetime time=iTime(_Symbol,_Period,0);
   if(time==0)
     {
      PrintFormat("Failed to get Time(0), error %d"GetLastError());
      return;
     }
//--- açılış zamanı değişmediyse, bir sonraki OnTick çağrısına kadar çıkış yap
   if(time==open_time)
      return;
//--- tamamlanan son iki çubuğun Kapanış fiyatlarını al
   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]; // öngörülen fiyat değişimi
   double delta_actual=close[1]-close[0]; // mevcut fiyat değişimi
   if((delta_predict>0 && delta_actual>0) || (delta_predict<0 && delta_actual<0))
      confirmed++;
 
//--- sonraki çubuktaki fiyatı doğrulamak için yeni çubuktaki Kapanış fiyatını hesapla
   matrix rates;
//--- 10 çubuk al
   if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,1,10))
      return;
//--- girdi olarak OHLC vektörü kümesi kullan
   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);
//--- normalleştirme matrislerini doldur
   for(int i=0i<10i++)
     {
      mm.Row(m,i);
      ms.Row(s,i);
     }
//--- girdi verilerini normalleştir
   x_norm-=mm;
   x_norm/=ms;
//--- normalleştirilmiş girdi verilerini float türüne dönüştür
   matrixf x_normf;
   x_normf.Assign(x_norm);
//--- modelin çıktı verilerini (yani fiyat öngörüsünü) buradan al
   vectorf y_norm(1);
//--- modeli çalıştır
   if(!OnnxRun(handle,ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION,x_normf,y_norm))
     {
      Print("OnnxRun failed, error ",GetLastError());
     }
//--- öngörülen fiyatı elde etmek ve yeni çubukta doğrulamak için ters dönüşüm yap
   predict=y_norm[0]*s[3]+m[3];
   predictions++;  // öngörü sayacını artır
   Print(predictions,". close prediction = ",predict);
//--- sonraki tiki kontrol etmek için çubuğun açılış zamanını kaydet
   open_time=time;
  }

Uzman Danışmanı derliyoruz ve modelin üzerinde eğitildiği EURUSD sembolünü ve H1 zaman dilimini belirterek 2022 yılı döneminde test ediyoruz. Kod yeni bir çubuğun ortaya çıkışını kontrol ettiğinden tik modelleme modu göz ardı edilebilir.  

Geriye dönük test ayarları

 

Başlatıyoruz ve sonucu test günlüğünden görebiliriz. 2022'de öngörülerin %50'den biraz fazlasının doğru olduğunu göstermektedir.

Test günlüğü

 

Ön model testi tatmin edici sonuçlar verdiyse, bu modeli temel alan tam teşekküllü bir ticaret stratejisi yazmaya başlayabilirsiniz.