iCustomの詳細説明 - ページ 3

 
NewCoder47:

Dabblerさん、ありがとうございます。EAとIndicatorの完全版を添付します。iCustomに関する記述を読み、パラメータの部分を除けばすべて理解できました。

パラメータに 入るのは、Indicatorの外部変数に使用したい値です......この場合、これらは......。

//---- indicator parameters
extern string PairName = "";   // Leave blank for the pair of the chart, enter other pair name to compare correlated pairs

extern int StdDev.MA.Period=12;  // D1=20
extern int StdDev.MA.Shift=0;    //
extern int StdDev.MA.Method = 0; // 0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 Open price, 2 High price, 3 Low price, 4 Median price, (high+low)/2, 5 Typical price, (high+low+close)/3, 6 Weighted close price, (high+low+close+close)/4

extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;
 

もう一度、ヘルプファイルを見てみましょう。

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift) 
 

を見てみると、...の部分の定義があります。

... - パラメータのセット(必要な場合)。渡されたパラメータとその順序は、カスタムインジケータの 宣言順序と外部変数の型に対応していなければなりません。


9つの外部 変数があるので、9つのパラメータが正しい順序と正しいタイプで必要です。

     double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
     double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

簡単ですね。

それから、"また、EAに送られている値を物理的に確認する方法はありますか?"と尋ねます。

もちろんです。

Comment("StdBuffer=" + STDBuffer+"\nstddevma=" + stddevma);
 
dabbler:
 double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
 double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Nullが タイプミスであることを除けば、Yep。

インジケータから始めて、コードを生成します。

インジケータ
EA
インジケータのファイル名は拡張子なしで、空白がある場合はそれも含めて。
#define SFX "SFX"
定数なので#define。一度だけ定義しておけば、タイプミスはありません。
extern string PairName = "";     // Leave blank for ...

extern int StdDev.MA.Period=12;  // D1=20
extern int StdDev.MA.Shift=0;    //
extern int StdDev.MA.Method = 0; // 0=SMA 1=EMA 2=Sm...
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 O...
extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Sm ...
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;
string  PairName            = "";     
int     StdDev.MA.Period    = 12;  
int     StdDev.MA.Shift     =  0;    
int     StdDev.MA.Method    =  MODE_SMA; 
int     StdDev.MA.Price     =  PRICE_CLOSE;  
int     MA.Fast.Period      =  3;
int     MA.Fast.Method      =  MODE_SMMA;
int     MA.Fast.Shift       =  0;
#define CheckOncePerBar        true;
バッファに影響を与えない値であれば、定数にすることができます。
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);
バッファの意味を知るために、コードを読む必要があるかもしれません。例.
STDBuffer[i]= iStdDev(...)
stddevma[i] = iMAOnArray(
#define SFX_STD   0
#define SFX_STDMA 1
この場合、呼び出しは次のようになります。
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
 

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


 ExtMapBuffer1[i+3] = lower_fractal_7b;     could be used as calculated value when reversal fractal is called?

 
ubzen:
そうです。いつもそうです。Extern Valuesについてです。そして、あなたはBufferについて話しているのでしょう。

はいUBZENです。


私もあなたが提案したことを試してみましたが、私のインジケータに記載されているとおりの値を返しました....

このインジケータは、長いパラメータが ない分、簡単に追加したり使ったりできます。

私はパラメータをコンパイルするのに迷いましたが、皆さんはそうではありませんでした。

どうもありがとうございました。私は数日間、この答えを探していました。

 
WHRoeder: その後、呼び出しがあります。
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
となり、カプセル化されるはずです。
double getSFX(int eBuf, int iBar = 0, int eTF=0){ 
   return( iCustom(NULL, eTF ,SFX,
                      PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                      StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                      MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                   eBuf, iBar) ); 
}
:
double     STDBuffer = getSFX(SFX_STD, 0);
double     stddevma  = getSFX(SFX_STDMA, 0);
:
 
RaptorUK:

iCustomはあなたのIndicatorバッファにアクセスすることができます。

例えば、2つのインディケータに基づいた戦略を持つEAを書く場合、EAにインディケータコードを組み込むことは可能ですが、インディケータバッファがEAで動作しないため、少し複雑です。EAは必要なシフト値で必要なバッファにアクセスするだけで、指標に変更は必要ありません。iCustomの呼び出しの中で、インディケータをセットアップするために必要な外部変数も渡すことができます。

RaptorUK様(および他の方)。


引用された投稿では、EAでカスタムインジケータの値を使用する2つの方法について説明されています。1つ目は、iCustomで、これはすでに知っています。というのも、以前、カスタムインジケータのコードをメインインジケータの本体に組み込んでみたことがあるのですが、うまくいかなかったからです。というのも、以前カスタムインジケータのコードをメインインジケータ本体に組み込んでみたのですが、うまくいきませんでした。インジケータを関数にして、最新の値(要素0の値)を返すようにすると、計算値そのものではなく、ダブル変数のEMPTY_VALUEを常に取得します。iCustom関数を使用して、シフトを最新の値である0に設定しようとしました。これを実行すると、ターミナルは0を返し、エキスパートタブにSTACK OVERFLOWというエラーが表示されます。2回目のクリックでは値を返しますが、数回[0]の値を出力するたびに、別のSTACK OVERFLOWエラーが発生し、これが何度も繰り返されます。iCustomは最初の初期化で値0とSTACK OVERFLOWを返すので(そして正しい値を与え始めてから)、私のEAではicustomを使用できません。なぜなら、Start()が起動するたびに異なるシンボルのicustomを呼び出し、そのために複数のカスタムインディケータを呼び出します。これはEAをクラッシュさせる原因となっています。icustomが最新の値[0]を返すようにしたいときに、なぜSTACK OVERFLOWエラーが発生するのか理解できませんが、ぜひ知りたいところです。しかし、私は、呼び出されるすべてのインジケータのコードを、メインインジケータ内の関数に変換することによって内部化することを好みます。あなたは、配列を使用し、それらを「as series fashion」で処理することについて何か言っていました。これを詳しく説明していただけませんか?

私は古典的なADX.mq4インジケータのmq4ファイルを追加しました。内部ではADXの値が2回出力されます。1回目はIcustomによって、2回目はADX内部の関数になったADXコードによってです。Icustom(ADX)は値を返しますが、ADX(symbol,timeframe)は値を返しません。247456457457とかいう同じEMPTY_VALUEを何度も何度も返してきます。なぜこのようなことが起こるのか、またEAテンプレートとmq4カスタムインジケーターファイルの両方でどのようにこれを改善すればよいのか、ご説明ください。


よろしくお願いします。


追記:添付ファイルが機能していないようです。しかし、あなたはADXカスタムインジケータとしてCallicustomvsFunctionサンプルインジケータの両方をhttp://www.forexfactory.com/showthre...37#post8569537(私の名前はそこにCodixです)からダウンロードすることができます。

ファイル:
 
  1. 二重投稿をしない
  2. iCustomの使い方に関する質問ではありません。
 

上記の投稿(https://www.mql5.com/en/forum/138577/page3#627521https://www.mql5.com/en/forum/138577/page3#797401 )では、ドットや単語の区切り文字を使用していました。

2014年 2月3日(Build 600)以降、それは許されません。 アンダースコアまたはキャメルケースを 使用してください。

 
whroeder1:

アンダースコアまたはキャメルケースを使用してください。

キャメルケースというのは初めて知りました。ありがとうございました。