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

 
Pineapple88:

こんにちは。

配列を理解しようとしているのですが、次のような疑問があります。

CopyRatesでは 現在から過去へのカウントが行われるのに、なぜこの例ではArraySetAsSeriesを 使用し、フラグをtrueに設定するのでしょうか?

ArraySetAsSeries 関数は、現在から過去までの配列を検索するために必要な機能であると理解しています。

この例では、この機能の目的を理解したいのです。

ArraySetAsSeries(rates,true); 

rates[0]はチャートのRIGHT BARに対応します。これは、「現在」「未来」という紛らわしい言葉を使わない、最もシンプルな説明です。

 
Vladimir Karputov:

rates[0]は、グラフのRIGHT BARに対応します。これは、「現在」「未来」という紛らわしい言葉を使わない、最もシンプルな説明です。

回答ありがとうございました

しかし、ArraySetAsSeries を 使用しない場合、CopyRates は rates[0] をチャートの一番右のバーにも割り 当てることになります。

ただArraySetAsSeries関数がなくても同じように 動作するのに、何のためにあるのか理解しようとして いるのです。

それとも、コードの書き方として受け入れられて いるのでしょうか?

 
Pineapple88:

回答ありがとうございました

しかし、ArraySetAsSeries を 使用しない場合、CopyRates は rates[0] をチャートの一番右のバーにも割り 当てることになります。

ただArraySetAsSeries関数がなくても同じように 動作するのに、なぜ必要なのかを理解しようとして いるのです。

それとも、コードの書き方として受け入れられて いるのでしょうか?

CopyRatesは、rate[]配列のサイズ により、rate[0]を最も古い値に割り当てます。
 
Anatolii Zainchkovskii:
は間違っています。CopyRates は rate[] 配列のサイズの関係で rate[0] を最も古い値に割り当てます。 。

ありがとうございました。

今ならわかる、私が間違っていた)

 

こんにちは。

もう一度、お願いします

MA(20)がMA(50)を下から上に横切ったときに「買い」という条件のコードを書きました。

input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(BigMovingAverageArray[1] < SmallMovingAverageArray[1])
   if(BigMovingAverageArray[2] > SmallMovingAverageArray[2])
        {
         Print("buy");
        }
  }

しかし、実際にはこのように実行されます。

ファイル:
n2b3h1.png  140 kb
 
Pineapple88:

こんにちは。

もう一度、お願いします

MA(20)がMA(50)を下から上に横切ったときに「買い」という条件のコードを書きました。

しかし、実際にはこのように行われます。

グロスエラー:ティック ごとに2つのインジケータハンドルを作成しています。正しいやり方は

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

OnInitに移動し、ハンドルが正しいかどうかのチェックを追加。


また、IMAから値を取得する配列は、必ず作成する必要があります。

ArraySetAsSeries(SmallMovingAverageArray,true);  
ArraySetAsSeries(BigMovingAverage,true)
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 

早速のご返信、誠にありがとうございました

ArraySetAsSeriesについては 理解しています。

OnInitにインジケータを移動させる方法を考えて、ハンドルを確認してみます。

***

 
Pineapple88:

早速のご返信、誠にありがとうございました

ArraySetAsSeriesについては 理解しています。

OnInitにインジケータを移動させる方法を考えて、ハンドルを確認してみます。

***

すべては最初からそこにある

  • in documentation:iMA
  • MetaEditor - Expert Advisor [data folder]MQL5ExpertsExamples**Moving Average.mq5
Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov:

最初から全部あるんです。

  • in the documentation:iMA
  • in MetaEditor - EA [data folder]MQL5Experts***Examples**Moving Average.mq5

ありがとうございます、勉強します

 

修正しました!すべてうまくいっているようです!)

OnInit関数に 2つのMAインジケータを転送しました。

OnInit関数でインジケータハンドルだけを作成し、その他の配列の操作はOnTick関数で行い、1tickごとにチェックするという理解でよろしいでしょうか。

int SmallMovingAverageDefinition = 0;
int BigMovingAverageDefinition   = 0;
input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


int OnInit()
  {
//---
   SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   if(SmallMovingAverageDefinition==INVALID_HANDLE  || BigMovingAverageDefinition==INVALID_HANDLE)
     {
      Print("Ошибка создания хендла");
     }
//---
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {
//---

  }


void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   ArraySetAsSeries(SmallMovingAverageArray,true);
   ArraySetAsSeries(BigMovingAverageArray, true);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(SmallMovingAverageArray[1] > BigMovingAverageArray[1])
      if(SmallMovingAverageArray[2] < BigMovingAverageArray[2])
        {
         Print("buy");
        }
  }
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...