初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1362

 
そして、2つのファイルを別々にMarketに入れることはできません。それがポリシーです。
 
Aleksei Stepanenko #:

これがその指標です。

ここに専門家がいます。

ここでは、すべてを1つのファイルにまとめています。

4もそうだが、5もそうだ。

Expertファイルのみコンパイルしています。

Expert Advisorから呼び出されるように、少なくとも簡単なグラフィックオブジェクトでインジケータを埋めてみてください。そして、コンパイル後、Expert Advisor ファイルのみをマーケットに送信したかのように Res_Ind.ex4 をリネームまたは削除してください。クライアントは、非機能的なプログラムを受け取ることになります。

 
Aleksei Stepanenko #:
そして、2つのファイルを別々にMarketに入れることはできません。それがポリシーです。
そういうことなんだ...。
 
Dmitriy VC #:

Expertファイルだけコンパイルされていますね。

Expert Advisorから呼び出されるように、少なくとも簡単なグラフィカルオブジェクトでインジケータを埋めてみてください。その後、コンパイル後に Res_Ind.ex4 をリネームまたは削除し、あたかも Expert ファイルのみを Market へ送信したかのようにします。クライアントは、動作しないプログラムを取得することになります。

そんな頑固なことはできません・・・リソースで接続されたインジケータはExpert Advisorの実行ファイルに含まれていると書いてありますから、そうなのでしょう。

しかし、あなたのインジケータがグラフィカルなオブジェクトを描き、EAがそれを読まなければならないという事実は大きな問題です。グラフィックオブジェクトはビジュアライゼーションを使ったテスト時のみで、オートバリデーターはビジュアライゼーションを使わないテストなので、オブジェクトのプロパティが見えないんです...。

 
Alexey Viktorov #:

リソースで接続されたインジケータはEAの実行ファイルに含まれるそうなので、そうなんですね。

インジケータを別ウィンドウ で表示

//+------------------------------------------------------------------+
//|                                                          win.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

   IndicatorSetString(INDICATOR_SHORTNAME,"win");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

コンパイルインジケータ→win.ex5.

リソースにインジケータを持つ専門家

//+------------------------------------------------------------------+
//|                                                          exp.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#resource "\\Indicators\\win.ex5"
char      number    = -1;
int       handle    = INVALID_HANDLE;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   if(number<0)
     {
      handle=iCustom(_Symbol,_Period,"win.ex5");
      number=char(ChartGetInteger(0,CHART_WINDOWS_TOTAL));

      if(handle!=INVALID_HANDLE)
        {
         ChartIndicatorAdd(0,number,handle);
        }
     }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(reason==REASON_REMOVE)
     {
      ChartIndicatorDelete(0,int(ChartWindowFind(0,"win")),"win");
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

Expert Advisor をコンパイルする--> exp.ex5.

Expert Advisorを実行すると、チャート上にインジケータウィンドウが表示されます。

Expert Advisor exp.ex5の1ファイルをMarketに公開する(実際にはインジケータファイルwin.ex5を削除)。

Expert Advisorを起動すると、チャート上にインジケータウィンドウがありません。

削除したファイルwin.ex5を復元する。

Expert Advisorを復元すると、チャートにインジケータウィンドウが 表示されます。


結論:Expertコードにインジケーターコードは含まれない。リソースIndicatorを使用したExpert Advisorを正常に動作させるためには、リソースで指定されたIndicatorの実行ファイルが必要です。


質問を繰り返す。

カスタムインジケータ、ライブラリを持つエキスパートがある場合、マーケットに公開する方法は?

ファイル:
win.mq5  2 kb
exp.mq5  4 kb
 
Dmitriy VC #:

インジケータを別ウィンドウ で表示

コンパイルインジケータ→win.ex5.

リソースにこのインディケータを持つ専門家

Expertを コンパイルする--> exp.ex5.

Expert Advisorを実行すると、チャート上にインジケータウィンドウが表示されます。

Expert Advisor exp.ex5の1ファイルをMarketに公開する(実際にはインジケータファイルwin.ex5を削除)。

Expert Advisorを起動すると、チャートにインジケータウィンドウがありません。

削除したファイルwin.ex5を復元する。

Expert Advisorを復元すると、チャートにインジケータウィンドウが 表示されます。


結論:Expert コードにインジケータのコードは含まれない。リソースIndicatorを使用したExpert Advisorを正常に動作させるためには、リソースで指定されたIndicatorの実行ファイルが必要です。


質問を繰り返す。

Expert AdvisorにカスタムIndicator、ライブラリ、つまりExpert Advisorの正常な動作に必要なファイルが複数ある場合、どのようにマーケットに公開しますか?

ドキュメンテーションへのリンクは何度目でしょうか?お母さんは読ませてくれないの?

      handle=iCustom(_Symbol,_Period,"win.ex5"); // Это делается не так!!!!

やっと読めた...。

 
Alexey Viktorov #:

ドキュメンテーションへのリンクは何度目でしょうか?お母さんが読ませてくれないの?

やっと読めた...。

Alexeyさん、直接ミスを指摘していただきありがとうございます。

ドキュメントを読んでも、「目の届かないところにある」状態でした。

皆さんには申し訳ないのですが、私が間違っていました。

今、手に入れました。

 

ヒントを教えてください。

クラスに小節数の 計算(:RatesTotal(void))を追加、構造に正しくフィットする方法がわからない。こんな感じです。もっとカラフルにする方法を教えてください。

#include <Arrays\ArrayObj.mqh>
/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
class CNewBar : public CObject
  {
private:
   string            m_symbol;
   ENUM_TIMEFRAMES   m_timeframe;
   datetime          m_time;
   long              m_rt;
   datetime          Time(void);  
   long              RatesTotal(void);   
   string            Symbol(void)         { return this.m_symbol;    }
public:
   ENUM_TIMEFRAMES   Timeframe(void)      { return this.m_timeframe; }
   datetime          GetTime(void)        { return this.m_time;      } //  Возвращает время последнего обращения
   long              GetRatesTotal(void)     { return this.m_rt; }
   bool              IsNewBar(void);                                   //  Основная функция класса
                     CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe);
                    ~CNewBar(void) {;}
  };
//+------------------------------------------------------------------+
//|    Конструктор                                                   |
//+------------------------------------------------------------------+
CNewBar::CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe) : m_time(0)
  {
   this.m_symbol = symbol;
   this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe);
  }

//+------------------------------------------------------------------+
//|  Возвращает количество баров в истории                           |
//+------------------------------------------------------------------+
long CNewBar::RatesTotal(void)
  {
//---- получим количество баров
  long rt=SeriesInfoInteger(this.m_symbol, this.m_timeframe,SERIES_BARS_COUNT);
//---- Проверка количества
   if(rt<1)
      Print("Error "+__FUNCTION__+" Не определенно кол-во баров ",this.m_symbol," ",this.m_timeframe);
//----
   return(rt);
  };
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   m_rt=this.RatesTotal();
   datetime tm=this.Time();
   if(tm==0 || m_rt<1)
      return false;
   if(tm!=this.m_time)
     {
      this.m_time = tm;
      return true;
     }
   return false;
  }
 
Dmitriy VC #:

今はもう解決しています。

知らなかったんだ、知らなかったんだ。全く問題ありません :)

 

prev_calculatedの計算のアナログを整理する方法を教えてください、解りません。


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CNewBar::PrevCalculated(void)
  {
   int pc=this.m_rt
   return(pc)
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm=this.Time();

   if(tm==0 || m_rt<1)
      return false;
   if(tm!=this.m_time)
     {
      //--- определяем время
      this.m_time = tm;
      //--- определяем кол-во
      this.m_rt=this.RatesTotal();
      return true;
     }
   return false;
  }
理由: