7. 予測処理の実装

オリジナルのアルゴリズムでは価格が移動平均線を超えて来た時にエントリーしますが、これに学習結果を反映させます。利益が出るか、損失が出るかを予測する学習結果が得られているので、利益が出る予測の時のみにエントリーをするように書き換えましょう。

void CheckForOpen()
  {
   double ma;
   int    res;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//--- sell conditions

/* 
   if(Open[1]>ma && Close[1]<ma)
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
*/
      
   
//--- buy conditions
   if(Open[1]<ma && Close[1]>ma )
     {
      double prediction_array[2];
      
      make_predict_data(); 
     
      int ret = IZEL_predict(handle, prediction_array);
      int prediction = IZEL_max_index(handle, prediction_array);
      
      
      if(  prediction == 1  ) {      
         res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      }
              
      return;
     }

make_predict_data()の中で予測のためのデータをセットしますが、この中の実装はこの後で説明します。

予測データのセット後にIZEL_predic()にて学習の結果を取得します。結果は配列で返されます。教師ラベルのそれぞれの値について正解の度合いが数値で入っています。IZEL_max_index()にその配列を渡すと、一番大きいラベルを返してくれます。学習時に、利益を1、損失を2で定義したので1の時のみエントリーを行います。

それでは続いてmake_predict_data()の中に実装する予測データの生成方法について説明します。make_predict_data()の中は以下のように実装します。

void make_predict_data()
{      
      IZEL_open_x_predict(handle);
      double ma1 = iMA(NULL, 0, 5, 0, MODE_SMMA, PRICE_CLOSE, 0);
      double ma2 = iMA(NULL, 0, 10, 0, MODE_SMMA, PRICE_CLOSE, 0);
      double ma3 = iMA(NULL, 0, 20, 0, MODE_SMMA, PRICE_CLOSE, 0);
      double ma4 = iMA(NULL, 0, 40, 0, MODE_SMMA, PRICE_CLOSE, 0);
      double ma5 = iMA(NULL, 0, 80, 0, MODE_SMMA, PRICE_CLOSE, 0);

      double rsi1 = iRSI(NULL, 0, 5, PRICE_CLOSE, 1)/100;  
      double rsi2 = iRSI(NULL, 0, 10, PRICE_CLOSE, 1)/100;  
      double rsi3 = iRSI(NULL, 0, 20, PRICE_CLOSE, 1)/100; 
      double rsi4 = iRSI(NULL, 0, 40, PRICE_CLOSE, 1)/100;  
      double rsi5 = iRSI(NULL, 0, 80, PRICE_CLOSE, 1)/100; 
            
      double ac1 = iAC(NULL, 0, 1);
      double ac2 = iAC(NULL, 0, 5);
      double ac3 = iAC(NULL, 0, 10);  
      double ac4 = iAC(NULL, 0, 15);     
      double ac5 = iAC(NULL, 0, 20);
      
      double ad1 = iAO(NULL, 0, 1);
      double ad2 = iAO(NULL, 0, 5);
      double ad3 = iAO(NULL, 0, 10); 
      double ad4 = iAO(NULL, 0, 15);
      double ad5 = iAO(NULL, 0, 20); 
            
      double atr1 = iATR(NULL, 0, 5, 1);
      double atr2 = iATR(NULL, 0, 10, 1);
      double atr3 = iATR(NULL, 0, 20, 1);
      double atr4 = iATR(NULL, 0, 40, 1);
      double atr5 = iATR(NULL, 0, 80, 1);
            
      double momentum1 = iMomentum(NULL, 0, 5, PRICE_CLOSE, 1)/100; 
      double momentum2 = iMomentum(NULL, 0, 10, PRICE_CLOSE, 1)/100; 
      double momentum3 = iMomentum(NULL, 0, 20, PRICE_CLOSE, 1)/100;  
      double momentum4 = iMomentum(NULL, 0, 40, PRICE_CLOSE, 1)/100; 
      double momentum5 = iMomentum(NULL, 0, 80, PRICE_CLOSE, 1)/100;  
            
      double wpr1 = iWPR(NULL, 0, 5, 1)/100;
      double wpr2 = iWPR(NULL, 0, 10, 1)/100;     
      double wpr3 = iWPR(NULL, 0, 20, 1)/100;                         
      double wpr4 = iWPR(NULL, 0, 40, 1)/100;     
      double wpr5 = iWPR(NULL, 0, 80, 1)/100;  
      double wpr6 = 0; 
                                       
      IZEL_append_x_predict(handle, Open[1]-ma1);
      IZEL_append_x_predict(handle, Open[1]-ma2);
      IZEL_append_x_predict(handle, Open[1]-ma3);
      IZEL_append_x_predict(handle, Open[1]-ma4);
      IZEL_append_x_predict(handle, Open[1]-ma5);

      IZEL_append_x_predict(handle, rsi1);
      IZEL_append_x_predict(handle, rsi2);
      IZEL_append_x_predict(handle, rsi3); 
      IZEL_append_x_predict(handle, rsi4);
      IZEL_append_x_predict(handle, rsi5);
                  
      IZEL_append_x_predict(handle, ac1);
      IZEL_append_x_predict(handle, ac2);
      IZEL_append_x_predict(handle, ac3);
      IZEL_append_x_predict(handle, ac4);
      IZEL_append_x_predict(handle, ac5);
            
      IZEL_append_x_predict(handle, ad1);
      IZEL_append_x_predict(handle, ad2);
      IZEL_append_x_predict(handle, ad3);            
      IZEL_append_x_predict(handle, ad4);
      IZEL_append_x_predict(handle, ad5);            
  
      IZEL_append_x_predict(handle, atr1);
      IZEL_append_x_predict(handle, atr2);
      IZEL_append_x_predict(handle, atr3);  
      IZEL_append_x_predict(handle, atr4);
      IZEL_append_x_predict(handle, atr5);  
            
      IZEL_append_x_predict(handle, momentum1);
      IZEL_append_x_predict(handle, momentum2);
      IZEL_append_x_predict(handle, momentum3); 
      IZEL_append_x_predict(handle, momentum4);
      IZEL_append_x_predict(handle, momentum5); 

      IZEL_append_x_predict(handle, wpr1);
      IZEL_append_x_predict(handle, wpr2);
      IZEL_append_x_predict(handle, wpr3); 
      IZEL_append_x_predict(handle, wpr4);
      IZEL_append_x_predict(handle, wpr5);       
}

 IZEL_open_x_predict()を最初に呼び出して、その後、IZEL_append_x_predict()を順次呼び出してデータをセットしていきます。セットするデータは学習の時の入力データと同じとしてください。

以上でトレードの実装が完了しました。ソースコードをコンパイルしたら、このEAでバックテストを実行してみましょう。学習の時と同じ条件での実行結果は以下のようになります。

スクリーンショット 2024-11-13 18.22.18
スクリーンショット 2024-11-13 18.23.02

右肩下りだったパフォーマンスが右肩上がりを示しています。学習前の状態との比較をしてみましょう。以下が学習前のアルゴリズムでのパフォーマンスです。

スクリーンショット 2024-11-13 18.24.42
スクリーンショット 2024-11-13 18.25.53

22.62%であった勝率は80%を超えており、0.88であったプロフィットファクタは16を超えています!素晴らしい学習の結果です。

以上がIzelを使った学習の実装方法の説明になります。あなただけのAIトレードアルゴリズムを作成してください。

   

Copyright (C) izel.cloud-line.com All Rights Reserved.