iCustomの詳細説明

 

こんにちは。

私はコーディングの初心者で、多くのことを学んでいますが、今ひとつ理解できないことがあります。私は、ある指標のテスト結果をあるEAに呼び出し、取引を行う前にそのEAが自身のテストにそれを追加できるようにしようとしています。電子計算機は単純な移動平均のクロスです。インジケータはトレンド系またはレンジ系のインジケータです。インジケーターのコードを添付しました。

可能であれば、eaがそれを認識するために、インジケータ内でどのようにセットアップされるべきか、私の頭を理解できるように、簡単な説明と ヘルプをお願いします。インジケータが解決したら、EAに移ろうと思っています。

このインジケータには2つのテストがあり、その中でiCustom関数を 追加したいと思います。この段階では、私はそれを理解しようとしているので、どちらか一方のテストにそれを追加したいだけです。私はそれを理解しようとしているので、誰でも喜んで助け、それを簡単に説明する ことは、非常に有益であろう - 私はそれを理解するように説明するオンライン何かを見つけることができないようです。 テストの結果は、単に "true "である可能性もあります。

お時間をいただき、ありがとうございました。
マイク

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Yellow
#property  indicator_color2  Red
#property  indicator_width1  1

//---- 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;

int i, limit, counted_bars;
static string Pair1;

datetime CurrentTimeStamp;

//---- indicator buffers
double     STDBuffer[];
double     stddevma[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
   IndicatorDigits(Digits+1);
     
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE); // 
   SetIndexStyle(1,DRAW_LINE);

      
//---- indicator buffers mapping
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);

   
   if (PairName == "") Pair1 = Symbol();
   else Pair1 = PairName;

//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("SFX TOR: "+Pair1+"("+StdDev.MA.Period+")");
   SetIndexLabel(0,"StdDev");
   SetIndexLabel(1,"StdDev MA");

//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {

   counted_bars=IndicatorCounted();
   
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
//---- macd counted in the 1-st buffer
  for(int i=limit-1; i>=0; i--){
     STDBuffer[i]=iStdDev(Pair1,0,StdDev.MA.Period, StdDev.MA.Shift, StdDev.MA.Method, StdDev.MA.Price, i);
     }
  for(i=limit-1; i>=0; i--){
     stddevma[i] = iMAOnArray(STDBuffer, 0, MA.Fast.Period, MA.Fast.Shift, MA.Fast.Method, i);
     } 
    
//Execute on bar Open
    if( CheckOncePerBar == true ){
      if( CurrentTimeStamp == Time[0] )
         return( 0 );
   }
   
   CurrentTimeStamp = Time [0];
   
//Tests
        
      if( STDBuffer[1] > stddevma[1] ){
      if( STDBuffer[2] <= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");
      }   
   }
   else{ // if it's not greater then it is either lesser than or equal
      if( STDBuffer[2] >= stddevma[2]){
         PlaySound("alert.wav");
         Alert(Symbol()," M",Period()," 30MCrossing");
         SendMail("30MCrossing","30MCrossing");  
      }
   }
          
//---- done
   return(0);
  }
 

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

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

 
RaptorUK:

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

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


RaptorUKに感謝します。しかし、私が困っているのは実際のコード化です。私はMQL4の初心者で、数ヶ月しかやっておらず、まだ勉強中です。ですから、コーディングとインジケータでのセットアップ方法について簡単な説明が必要なのです。

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

マイク

 

RaptorUK:

iCustom 呼び出しでは、Indicatorのセットアップに必要な外部 変数も渡すことができます。

補正 ...

iCustom 呼び出しの中で

必須

は、Indicator を設定するために必要な外部 変数も渡さなければならない。
 
NewCoder47:


RaptorUKに感謝しますが、私が困っているのは実際のコーディングです。私はMQL4の初心者で、まだ数ヶ月しかやっておらず、勉強中なのです。

感謝

マイク

あなたがここで明らかに見落としているのは、インジケータでiCustomを 使用していないことです。インジケータは独立したコードの一部です。iCustom コマンドを使用することで、EAは インジケータで何が起こっているかをこっそり見ることができます。

https://docs.mql4.com/indicators/iCustom

https://forum.mql4.com/42002

 
dabbler:

訂正 ...

iCustomの 呼び出しでは

MUST

また、Indicatorを設定するために必要な外部 変数も必要に応じて渡してください。
外部変数の値を空白にすることもできます。iCustom() インジケータはそのデフォルト値を使用します。
 
dabbler:

訂正 ...

iCustomの 呼び出しでは

MUST

また、Indicatorのセットアップに必要な外部 変数も、必要に応じて渡してください。

この件に関して、様々な記述を読みました。 私はiCustomを使用した ことがないので、個人的な経験から話すことはできませんが、デフォルトの 外部変数が必要である場合でも、あなたの声明は正しいのでしょうか?
 
RaptorUK:
これに関して、私はさまざまな記述を読みました.私はiCustomを使ったことがないので、個人的な経験からは言えませんが、デフォルトの extern変数が必要な場合でも、あなたの発言は正しいのでしょうか?
そうです。問題は、iCustomの 最後の2つのパラメータが 重要なので、何も省略できないのです。
 
dabbler:
はい。問題は、iCustomの 最後の2つのパラメータが重要なので、何も省略できないことです。
もちろんです......ありがとうございました。
 
ubzen:
externの値を空白にすることができます。iCustom()インジケータはそのデフォルト値を使用します。
いいえ、それはできません。今試してみました。カンマの間を空けるだけで、パラメータの 1つを省くとコンパイルされません。
 
NewCoder47:


....私はMQL4の初心者で、まだ数ヶ月しか経っておらず、勉強中です。ですから、コーディングとインジケータへのセットアップ方法について簡単な説明が必要です。

BarrowBoyのTrend_Or_Rangeインジケータと認識しています。インディケータを理解する鍵は、Arraysを理解することです。私は、mql4を使うときに、初日からArraysを使っていることに気づくまで、Arraysに対して健全な恐怖心を抱いていました。OrderSelect()とMa_CrossOverのロジックはEAを作る上で最初に理解しなければならないことです。

RaptorやDabberが指摘しているように、これらは単なる数字の羅列です。指標は単なる数字の羅列であり、それを逆算、順算したものです。インジケータは、エキスパートよりも多くのビジュアルツールを利用できるという付加価値があります。このカスタム・インディケータは、標準偏差や 移動平均などの標準的なインディケータを多く使用しているので、EAの中でこれらの計算をすることをお勧めします。

理由: