エキスパート: 書籍「MQL5を使用したアルゴリズム取引のためのニューラルネットワーク」からの例 - ページ 4

 
" our_model.net "が ない 、どうする?
 
اللعبه :

MQL5

المؤلف :メタクォーツ

اخرزميات انا عالم التكنولوجيا الجديدة ومطور برامج ومنشء تطبيقات
 
著者に感謝します!唯一のマイナス)))- 私のアリス・プロは、私にとって "意識 "の魔法を失った。
 
//+------------------------------------------------------------------+
//|アドバンスドFVG EA.mq5||の
//+------------------------------------------------------------------+
#property strict

input double Lots = 0.1;
input int TakeProfit = 200;
input int StopLoss = 200;
input int MaxLookback = 50;
input int Slippage = 5;
input int MagicNumber = 123456;
input double MaxSpreadPoints = 20.0; // マクシマム・イジン・ベリレン・スプレッド
input int MA_Period = 50; // トレンドフィルター
input int StartHour = 8;  // イシュレム・サート・アラレル・バシュランジュ
input int EndHour = 20;   (//)このようなことがありました。

//+------------------------------------------------------------------+
int OnInit()
  {
   Print("アドバンスドFVG EA "を発表。);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   // 円バー・コントロール
   static datetime lastBarTime = 0;
   MqlRates candles[3];
   if(CopyRates(_Symbol, PERIOD_M5, 0, 3, candles) < 3) return;
   if(candles[0].time == lastBarTime) return;
   lastBarTime = candles[0].time;

   // ザマンフィルター
   int currentHour = TimeHour(TimeCurrent());
   if(currentHour < StartHour || currentHour >= EndHour) return;

   // スプレッドコントロール
   double spread = (SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID)) / _Point;
   if(spread > MaxSpreadPoints) return;

   // コントロール
   if(PositionSelect(_Symbol)) return;

   // トレンドフィルター(MA)
   double ma = iMA(_Symbol, PERIOD_M5, MA_Period, 0, MODE_SMA, PRICE_CLOSE, 0);
   double price = SymbolInfoDouble(_Symbol, SYMBOL_BID);

   // FVGテスピティ
   double fvgHigh = 0;
   double fvgLow = 0;
   bool isBullishFVG = false;
   bool isBearishFVG = false;

   MqlRates rates[];
   if(CopyRates(_Symbol, PERIOD_M5, 2, MaxLookback, rates) < 3) return;

   for(int i = 0; i < ArraySize(rates)-2; i++)
     {
      double high0 = rates[i].high;
      double low2 = rates[i+2].low;
      double low0 = rates[i].low;
      double high2 = rates[i+2].high;

      // 強気FVG (上昇トレンド)
      if(high0 < low2 && price > ma)
        {
         isBullishFVG = true;
         fvgHigh = low2;
         fvgLow = high0;
         break;
        }
      // 弱気FVG (トレンドは弱気)
      else if(low0 > high2 && price < ma)
        {
         isBearishFVG = true;
         fvgHigh = low0;
         fvgLow = high2;
         break;
        }
     }

   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

   // İşlem açma
   if(isBullishFVG && bid <= fvgHigh && bid >= fvgLow)
     {
      trade_buy(ask);
     }
   else if(isBearishFVG && ask >= fvgLow && ask <= fvgHigh)
     {
      trade_sell(bid);
     }
  }
//+------------------------------------------------------------------+
void trade_buy(double price)
  {
   double sl = price - StopLoss * _Point;
   double tp = price + TakeProfit * _Point;

   MqlTradeRequest req = {};
   MqlTradeResult res  = {};

   req.action = TRADE_ACTION_DEAL;
   req.symbol = _Symbol;
   req.volume = Lots;
   req.type = ORDER_TYPE_BUY;
   req.price = price;
   req.sl = NormalizeDouble(sl, _Digits);
   req.tp = NormalizeDouble(tp, _Digits);
   req.deviation = Slippage;
   req.magic = MagicNumber;
   req.comment = "FVG Buy";

   if(OrderSend(req, res))
      Print("買い注文を出す:", res.retcode);
   else
      Print("買い注文ハタス:", res.retcode);
  }
//+------------------------------------------------------------------+
void trade_sell(double price)
  {
   double sl = price + StopLoss * _Point;
   double tp = price - TakeProfit * _Point;

   MqlTradeRequest req = {};
   MqlTradeResult res  = {};

   req.action = TRADE_ACTION_DEAL;
   req.symbol = _Symbol;
   req.volume = Lots;
   req.type = ORDER_TYPE_SELL;
   req.price = price;
   req.sl = NormalizeDouble(sl, _Digits);
   req.tp = NormalizeDouble(tp, _Digits);
   req.deviation = Slippage;
   req.magic = MagicNumber;
   req.comment = "FVG Sell";

   if(OrderSend(req, res))
      Print("売り注文の発注:", res.retcode);
   else
      Print("売り注文を出す:", res.retcode);
  }
//+------------------------------------------------------------------+
 
"gpt_test_not_norm "スクリプトを実行した後にgpt_not_norm.netを使用すると、次のようなエラーが発生します。

"ストラテジー・テスターで"Error of Feed Forward: 0 "と表示されました。

入力変数 "BarsToLine "を40に設定しました。

attention "スクリプトを使用した場合は、問題なく動作します。


 
とても便利で素晴らしいのですが、問題があります(ロードモードgpt_not_norm.netのエラー:5008)。
 

皆さん、こんにちは。多くの人がエラーにぶつかり、とてもイライラしていると思います。正直に言うと、私もエキスパート・アドバイザーを 使えるようにするために、最初のうちはとてもわくわくしていたのですが、案の定エラーの山になってしまいました。

もしあなたが忍耐強く、一歩一歩コードを見ながらこの本を読み進めていけば、きっとあなた自身が正しいことをし、望む結果を得られることを保証します。一番必要なのは、mql5という言語をできる限り理解することだ。


私は幸運にもコード全体を動かすことができ、エキスパート・アドバイザーも動いているが、ストラテジーが必要だ。


もう一つ。コードを実行中に停止すると、2つのバッファ・オブジェクトがメモリから漏れてしまいます。このバグを見つける手助けが必要です。

 
607967 #:

もうひとつ。コードを実行中に停止させると、2つのバッファ・オブジェクトがメモリーから漏れてしまうのです。このバグを見つけるのを手伝ってほしい。

この現象は通常、インジケーター・ハンドルがEA削除時にターミナルのメモリーから解放されない場合に起こります。

変更してみてください:

//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(!!net)
      delete net;
   if(!!trade)
      delete trade;
   IndicatorRelease(h_RSI);
   IndicatorRelease(h_MACD);
  }

を変更してみてください:

//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(!!net)
      delete net;
   if(!!trade)
     delete trade;
   if(h_RSI != INVALID_HANDLE || h_MACD != INVALID_HANDLE)
    {
     IndicatorRelease(h_RSI);
     IndicatorRelease(h_MACD);
    }
  } // このコードはテストされていない。