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

 

iMAインジケータのデータを「ゼロバー」で取得する、つまり現在のバーでのインジケータ値を取得するにはどうすればよいですか?

そうすれば

int OnInit()
{handle.MA_CHART=iMA(_Symbol,_Period,period_MA_CHART,0,Signal_MA_Method,Signal_MA_Applied);}

void OnTick()
{CopyBuffer(handle.MA_CHART, 0, 0, 3, ind_date.MA_CHART);}


呼び出すとき

ind_date.MA_CHART[0]

現在のバーではなく、前のバーのデータが表示されるのですが。

 
Yury Smagin:

iMAインジケータのデータを「ゼロバー」で取得する、つまり現在のバーでのインジケータ値を取得するにはどうすればよいですか?

そうすれば


呼び出すとき

現在のバーではなく、前のバーのデータが表示されるのですが。

アレイが必要

ArraySetAsSeries(ind_date.MA_CHART,true);

で、配列のインデックス "0 "の要素が、チャートのRIGHTバーに対応することになります。

 
Vladimir Karputov:

配列は必ず

で、インデックス "0 "の配列の要素が、グラフの一番右の棒に対応します。

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

iMAインジケータのデータを「ゼロバー」で取得する、つまり現在のバーでのインジケータ値を取得するにはどうすればよいですか?

そうすれば


呼び出すとき

現在のバーではなく、前のバーのデータが表示されるのですが。

あの映画のように、「ちょっと疑問があるんだけど...」と。私のExpert Advisorを勉強に使っていないのですか?

配列を反転させる必要はありません。配列の2番目のインデックスの値をとればよいのです。

ind_date.MA_CHART[2]
 

OBJPROP_BACK

両方の方法を試した。うまくいかないんです。その仕組みがまったく理解できない。

値に関係なく、オブジェクトは単純に形成された順に表示され、最後に形成されたものが上位となる。

また、オブジェクトが2つ以上ある場合、どのようにレベル(レイヤー)を調整すればよいのでしょうか。もしかしたら、他の設定があるのかもしれませんね。知っている人は教えてください。

 
Alexey Viktorov:

あの映画のように、"I have doubts... "と。勉強に使っているのは、私の顧問の先生ではないですか。

配列を反転させる必要はありません。配列の2番目のインデックスの値を取るだけです。

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

 

ごきげんよう))


なぜ結果に差が出るのか、教えていただけませんか?

//+------------------------------------------------------------------+
//|  exponential moving average multytimeframes   ДЛЯ БУФЕРА         |
//+------------------------------------------------------------------+
void CalculateExponentialMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int    i,limit;
   double SmoothFactor=2.0/(1.0+period_ma);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=period_ma+begin;
      ExtLineBuffer[begin]=price[begin];
   for(i=begin+1;i<limit;i++)
         ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
     }
   else limit=prev_calculated-1;
//--- main loop
   for(i=limit;i<rates_total && !IsStopped();i++)
      ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
//---
  }
//+------------------------------------------------------------------+
//|  exponential moving average       ДЛЯ ТОЧКИ                      |
//+------------------------------------------------------------------+
void CalculateEMA(int periodMA,int bgn)
  {
 int i,lmt=periodMA+bgn+1;
 double SmoothFactor=2.0/(1.0+periodMA);
   for(i=0;i<lmt;i++)
              BufferPrice[i]=0.0;
   switch(AppliedPrice)
     {
      case 1: BufferPrice[lmt]=iClose(NULL,Timeframes,lmt); break;
      case 2: BufferPrice[lmt]=iOpen(NULL,Timeframes,lmt);  break;
      case 3: BufferPrice[lmt]=iHigh(NULL,Timeframes,lmt);  break;
      case 4: BufferPrice[lmt]=iLow(NULL,Timeframes,lmt);   break;
   default :  BufferPrice[lmt]=iClose(NULL,Timeframes,lmt); break;
     }
   for(i=lmt-1;i>=0;i--)
   switch(AppliedPrice)
     {
      case 1: BufferPrice[i]=iClose(NULL,Timeframes,i)*SmoothFactor+BufferPrice[i+1]*(1.0-SmoothFactor); break;
      case 2: BufferPrice[i]=iOpen(NULL,Timeframes,i)*SmoothFactor+BufferPrice[i+1]*(1.0-SmoothFactor);  break;
      case 3: BufferPrice[i]=iHigh(NULL,Timeframes,i)*SmoothFactor+BufferPrice[i+1]*(1.0-SmoothFactor);  break;
      case 4: BufferPrice[i]=iLow(NULL,Timeframes,i)*SmoothFactor+BufferPrice[i+1]*(1.0-SmoothFactor);   break;
   default :  BufferPrice[i]=iClose(NULL,Timeframes,i)*SmoothFactor+BufferPrice[i+1]*(1.0-SmoothFactor); break;
     }
      MA=NormalizeDouble(BufferPrice[bgn],_Digits);
  }
//+------------------------------------------------------------------+

QUESTION: MA計算の第2版では、何を書き間違えたのでしょうか?

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

 
最適化の際、グラフから読み取れるようなグラフオブジェクトを構築しているか?
 
Aleksey Vyazmikin:
最適化の際、グラフから読み取れるようなグラフオブジェクトを構築しているか?

いいえ

 
Artyom Trishkin:

いいえ

悪いことに...

理由: