どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 545

 
GSB:

どのようなテイクですか?同じインジケータを全く異なるパラメータで呼び出すことができる



インジケーター自体の場合
extern int       periodAMA=10;
EAで
extern int periodAMA_1= 8; 
extern int periodAMA_2=13; 

送信されたパラメータとその名前が異なる場合、インジケータコードはどのように認識するのでしょうか?

しかし、すべてはおっしゃるとおりです。再度スクリプトで確認しました)

 
Forexman77:
Expert Advisorのインジケーター自体にある場合

送信されたパラメータと名前が異なる場合、インジケータコードはどのように認識するのでしょうか?

しかし、すべてはおっしゃるとおりです。スクリプトで再確認)


呼び出し側のプログラムの変数(複数可)には好きな名前を付けることができ、その名前はインジケータ内の変数名とは関係なく、異なる変数であり、異なる端末スレッドから呼び出されます。

インジケータはその名前に基づいて呼び出され、パラメータは4番目の位置から各コール中にそのために渡され、次にiCustom()パラメータを渡します。

変数 per1=9;を宣言 し、iCustom()が4の位置にある場合、インジケータは9の周期で計算され、他の変数を設定すると、その値が計算中に使用されます。インジケーターの最初のパラメーターとして渡される変数(その参照) - 2番目のiCustom()の4番目の場所に、など。



 
GSB:

呼び出し側のプログラムの変数名は自由ですが、その名前はインジケータの変数名とは関係なく、異なる変数であり、異なる端末スレッドから呼び出されています。

インジケータはその名前で呼ばれ、パラメータは4位からの各コール時に渡され、その後iCustom()のパラメータが渡されます。

変数per1=9を宣言し、iCustom()を4に配置すると、インジケータは9の周期で計算されます。別の変数を設定すると、その値が計算中に使用され、これはインジケータのすべてのパラメータに適用され、主なものは、インジケータ自体のように正しい順番に設定することです。インジケーターの最初のパラメーターとして渡される(その参照)変数 - 2番目のiCustom()の4番目、といった具合になります。



了解しました。教科書では、引用値の転送ということになっているようです。
 

私はフォーラムを散乱させず、別のトピックを持っているべきだと思ったが、私は本当に私の問題に対する建設的なフィードバックを期待して、私はそれなしで前進していないです :(.
いろいろなインジケーターを書いてみましたが、すべて問題ないようです。現在、iCustom()関数を使って、すべてをEAにインポートしています。Expert Advisorのコードです。

double ma=iCustom(NULL,0,"TestMA",0,1);

インジケーター本体(テスト用に書きました)

//+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,clrRed);
   SetIndexBuffer(0,ExtMapBuffer1);
//---
   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[])
  {
//---
    int counted_bars=IndicatorCounted(),
       limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
     
   for(int i=0;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i,20,close);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
  double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=0 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+

次に、テスト時のEMPTY_VALUEの 件です。

すなわち、テストを開始するとき、EAの開始日があって、その日以前のものはすべてiCustomが正しいインジケータ値を与え、それ以降のものはすべて直接テストされる - EMPTY_VALUEです。:(
グーグルやフォーラムでは、「未来に目を向けないでください」と書かれていますが、コードにはそのようなことは書かれていません。私はどこのバカなんでしょうか(笑)

 
Semionn:

私はフォーラムを散乱させず、別のトピックを持っているべきだと思ったが、私は本当に私の問題に対する建設的なフィードバックを期待して、私はそれなしで前進していないです :(.
いろいろなインジケーターを書いてみましたが、すべてOKのようです。現在、iCustom()関数を使って、すべてをEAにインポートしています。Expert Advisorのコードです。

インジケーター本体(テスト用に書きました)

次に、テスト時のEMPTY_VALUEの件です。

例えば、テストを開始するとき、EAの開始日があり、その日以前のものはiCustomが正しいインジケータ値を与え、それ以降のものはEMPTY_VALUEでテストされます。:(
グーグルやフォーラムでは、「未来に目を向けないでください」と書かれていますが、コードにはそのようなことは書かれていません。私はどこのバカなんでしょうか(笑)

Expert Advisorのコードにエラーがあるようですが、デバッガを使用してみてはいかがでしょうか?チェックポイントを設定し、変数の値を確認し、インジケータが呼び出された場合、日付の前後に何があるか確認することができます
 
GSB:
Expert Advisorのコードにエラーがあるようですが、デバッガを使用してみてはいかがでしょうか?チェックポイントを設定し、変数の値を確認し、インジケータが呼び出された場合、日付の前後に何があるか確認することができます

デバッガは、私が書いた以外にも、テストではなく、デモ口座モードで使用することができます - インジケータが呼び出され、動作し、値を返し、さらに正しい、しかし、唯一の指定した日付(テストの開始日)前に。EAで変数の値を出力しているので、最初は全て良好と言いながら、EMPTY_VALUE
 
Semionn:

デバッガは、私が書いた以外にも、テストではなく、デモ口座モードでのみ使用することができます - インジケータが呼び出され、動作し、値を返し、さらに正しいが、指定した日付(テスト開始日)までだけです。EAで変数の値を出力しているので、最初は全て良好と言いながら、EMPTY_VALUE


カスタムインジケータで 新しいバーを追跡する方法をよく読みましたか?

[QUOTE]最初のrates_totalパラメータは、計算のためにインジケータが利用できるバーの数を含み、チャートで利用可能なバーの数に対応しています。

OnCalculate()が返す値と2番目の入力パラメータprev_calculatedの関係に注目してください。関数呼び出しの prev_calculated パラメータには、前の呼び出しで OnCalculate()が返した値が含まれる。これにより、この関数の前回の呼び出し以降に変更されていないバーについて、計算を繰り返すことを避けるために、カスタム・インジケータを計算するための経済的なアルゴリズムが可能になります。

そのためには、通常、現在の関数呼び出しのバーの数を含む rates_total パラメータの値を返せば十分である。OnCalculate()の最後の呼び出し以降に価格データが変更された場合(より深いヒストリがポンピングされたか、ヒストリの空白が埋められた)、入力パラメータprev_calculatedの値はターミナルによってゼロに設定されます。[/QUOTE]

 

1日の瞬間の平均を20日分求め、20日の瞬間の平均を5日分求める必要があります。

20日平均を見つけるのは問題なかった。しかし、この平均 値から5日分の平均 値を求める方法がわかりません。

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--- input parameters
extern int       Period_MA_1=1;
extern int       p          =20;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double momentum20;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
    
   for(int i=0;i<limit;i++)
   {
      momentum20=0;
      ArrayInitialize(val20,0);      
      for(int k=p;k>=0;k--)
      {
      ArrayResize(val20,p);
      val20[k]=Close[i+k]-Close[i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return(0);
  }
 
Forexman77:

1日の瞬間の平均を20日分求め、20日の瞬間の平均を5日分求める必要があります。

20日平均を見つけるのは問題なかった。しかし、この平均 値から5日分の平均 値を求める方法がわかりません。



//+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 Lime
#property  indicator_color2 Yellow
#property  indicator_color3 Red

//--- input parameters
extern int       Period_MA_1=1;
extern int       p2          =20;
extern int       p3          =5;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),
   i,limit1,limit2,limit3;
   limit1=Bars-counted_bars-1;
   limit2=limit1;
   limit3=limit2;
   if(limit1>0) 
     {
      limit1=Bars-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for(i=limit1;i>=0;i--) ExtMapBuffer1[i]=iMomentum(NULL, 0, Period_MA_1, PRICE_CLOSE, i);
   for(i=limit2;i>=0;i--) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1, 0, p2, 0, MODE_SMA,i);
   for(i=limit3;i>=0;i--) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2, 0, p3, 0, MODE_SMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
 

ヘルプ

int OnInit()
{
   EventSetTimer(60);
   Print(GetLastError());

   return(INIT_SUCCEEDED);
}

タイマーが作動せず、ファウルやエラー4051を返す

それともテスターでは動作しないはずですか?