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

 

もともとこの記事を頼りにしていたのですがhttps://www.mql5.com/ru/articles/43

しかし、そこに書かれているコードは、インジケータ・データをチェックしてバッファ・アレイに取り込むところまでで、さらに、受け取ったインジケータ・データをどのように扱うかの例はないのです。リファレンスブックに目を通すと、主にインジケータのコード例があり、そこからsetindexbufferを拾ってみました。どっちに "掘る "か知りたい。昨日は半日で飽きたよ。

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • www.mql5.com
В MQL5 существует несколько вариантов вызова индикаторов, и осуществляются они в основном при помощи функций IndicatorCreate() и iCustom(). Причем эти функции лишь возвращают хендл индикатора, и дальнейшая работа с индикаторами ведется именно через него. Так что же такое хендл? Как работать с функциями IndicatorCreate() и iCustom()? И как...
 
Sayberix:

もう試した。しかし、ウィザードでは、クラスとともにそこに生成されます。せめて、少しは理解できるコードをわかりやすく理解したいものです。EAでインジケータの値を取得するために、どのようにコードを修正すればよいかアドバイスをお願いします。

例:EAからiEnvelopesのインジケータ値を取得する方法

//+------------------------------------------------------------------+
//|                         Example iEnvelopes values on a chart.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      Input1=9;
//---
int      handle_iEnvelopes;                     // variable for storing the handle of the iEnvelopes indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iEnvelopes
   handle_iEnvelopes=iEnvelopes(Symbol(),Period(),3,0,MODE_LWMA,PRICE_OPEN,0.03);
//--- if the handle is not created
   if(handle_iEnvelopes==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iEnvelopes indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   string text="";
   double upper[],lower[];
   ArraySetAsSeries(upper,true);
   ArraySetAsSeries(lower,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iEnvelopes,UPPER_LINE,start_pos,count,upper) ||
      !iGetArray(handle_iEnvelopes,LOWER_LINE,start_pos,count,lower))
     {
      return;
     }
   string text_upper="",text_lower="";
   for(int i=count-1; i>=0; i--)
     {
      text_upper  = text_upper   + "Upper"+"["+IntegerToString(i)+"]"+" "+DoubleToString(upper[i],Digits()+1)  +" | ";
      text_lower  = text_lower   + "Lower"+"["+IntegerToString(i)+"]"+" "+DoubleToString(lower[i],Digits()+1)  +" | ";
     }
   Comment(text_upper+"\n"+text_lower);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+


結果


 
Vladimir Karputov:

例:EAからiEnvelopesのインジケータ値を取得する方法

ありがとうございました。調べてみます!

 
Vladimir Karputov:


Vladimir, please tell me: Where does it get UPPER_LINE and LOWER_LINE from?インジケーターのハンドルだけなら、そのままもらえたかな?

 
Sayberix:

Vladimir, please tell me: Where does it get UPPER_LINE and LOWER_LINE from?インジケーターのハンドルだけなら、ハンドルも一度に手に入ったのでしょうか?

ご質問の意味がわかりません。意味のない文字の集合体です。質問を言い換えてください。急いで入力せず、質問をよく考えて、落ち着いて入力してください。

 
Vladimir Karputov:

質問の意味がわかりません。意味のない文字の集合体。質問を言い換えてください。急いで入力せず、質問を考えて冷静に入力してください。

関数の引数に

iGetArray(handle_iEnvelopes,UPPER_LINE,start_pos,count,upper)

UPPER_LINEを使用しました。

このパラメータ値はどこから来ているかというと、先ほど受け取ったハンドルからです。

handle_iEnvelopes=iEnvelopes(Symbol(),Period(),3,0,MODE_LWMA,PRICE_OPEN,0.03);

?

 
Sayberix:

関数の引数に

UPPER_LINEを使用しました。

このパラメータ値はどこから来るかというと、以前に受信したハンドシェイクからです。

?

いいえ、この値はiEnvelopesの ヘルプから引用しています。

Документация по MQL5: Технические индикаторы / iEnvelopes
Документация по MQL5: Технические индикаторы / iEnvelopes
  • www.mql5.com
//|                                              Demo_iEnvelopes.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |                   ma_period=14;              ...
 

午後GBPUSD通貨でEAを動作させる際、EURUSD用のコードでインジケータを設定すると、EAが起動時にクラッシュしてしまいます。しかし、EURUSDでExpert Advisorを実行し、GBPUSDを指標として指定すると、すべてが動作します。何に関連することができるのか?

   CSignalAC *filter0=new CSignalAC;

   if(filter0==NULL)

     {

      //--- failed

      printf(__FUNCTION__+": error creating filter0");

      ExtExpert.Deinit();

      return(INIT_FAILED);

     }

   signal.AddFilter(filter0);

//--- Set filter parameters

   filter0.Symbol("EURUSD");

   filter0.Weight(Signal_AC_Weight);
 
Nikita Bushuev:

午後GBPUSD通貨でEAを動作させる際、EURUSD用のインジケータをコードに設定すると、EAが起動時にクラッシュしてしまいます。しかし、EURUSDでEAを実行し、GBPUSDをインディケータに指定すると、すべてが動作します。これは何によるものなのでしょうか?

1.Wizard MQL5を使ってEAを生成します。例えば、EAに'GBPUSD'、シグナルのモジュールに'EURUSD'を指定します。RIGHTのサンプルコードが表示されます。コードを勉強する。今後は、手動での編集を避け、MQL5 Wizardでコードを生成すればよいのです。

2.Expert Advisor に 'GBPUSD' を指定した場合、この EA 'GBPUSD' のみで実行する必要があります。

ファイル:
1.mq5  13 kb
 
Vladimir Karputov:

1.Wizard MQL5を使用してEAを生成します。EAには'GBPUSD'、シグナルモジュールには'EURUSD'などと指定します。RIGHTのサンプルコードが表示されます。コードを勉強する。今後は、手動での編集を避け、MQL5 Wizardでコードを生成すればよいのです。

2.エキスパートアドバイザーに「GBPUSD」を指定した場合、このEAは「GBPUSD」のみで 動作させる必要があります。

Vladimir、MQL5 Wizardを使ってコードを生成しました。私はあなたのExpert Advisorを試しましたが、GBPUSD通貨で実行したとき、それはまた私のために動作しません。

ログには次のように書かれています。

2020.08.16 13:01:20.793 Core 1  EURUSD: symbol to be synchronized
2020.08.16 13:01:20.793 Core 1  EURUSD: symbol synchronized already, 18 bytes received
2020.08.16 13:01:20.793 Core 1  2018.01.01 00:00:00   cannot load indicator 'Accelerator Oscillator' [4804]
2020.08.16 13:01:20.793 Core 1  2018.01.01 00:00:00   CSignalAC::InitAC: error initializing object
2020.08.16 13:01:20.793 Core 1  2018.01.01 00:00:00   CExpert::InitIndicators: error initialization indicators of signal object
2020.08.16 13:01:20.793 Core 1  2018.01.01 00:00:00   OnInit: error initializing indicators
2020.08.16 13:01:20.793 Core 1  tester stopped because OnInit returns non-zero code 1
理由: