MetaTrader 5をダウンロードする

グラフィカルインターフェイスを使用したユニバーサルトレンド

3 5月 2017, 08:32
Dmitry Fedoseev
0
730

コンテンツ

イントロダクション

前の2つの記事では、グラフィカルインターフェイスを使用してユニバーサルオシレーターを作成する方法、およびユニバーサルチャネルをベースに開発するメソッドについて説明しました。  

ユニバーサルオシレーターに基づいてユニバーサルトレンドインジケーターを作成することもできます。 繰り返しを避けるために、少し違うアプローチから入ります。 もしかしたら新しいアプローチの方が扱いやすいかもしれません。

ユニバーサルオシレータとユニバーサルチャネルでは、自動ポインタを使用してコントロールのすべてのオブジェクトが form クラスに作成され、その表示と位置は追加のクラスを使用して管理されていました。 ここでは、「カスタムグラフィカルコントロール」シリーズに記載されている原則を使用して、ユニバーサル複合コントロールを作成します (記事1記事2記事3)。 ただし、この記事に必要なメソッドのみ作成されます。 

インジケーターの種類

従来のトレンドインジケーターで考えられているインジケーターに限定されません。 価格の方向 (移動平均、 RSIインジケーターなど) に依存するインジケーターは、エントリを決定し、トレンドを判断するために適用できます。 たとえば、価格が移動平均を上回っている場合、上昇トレンドがあると仮定することがあります。逆もまたしかりです。 (図1)。


図1. 移動平均と価格を使用して、トレンドを決定します。 青色の上向き矢印は、
間隔を示します。 (値段が MA の上)赤い下向きの矢を示す間隔で買うことができます。

MAスロープも、同様に使用することができます: 上向き-上昇トレンド、下向き-下降 (図2)。

 
図2. 移動平均の勾配を使用してトレンドを決定します。 青い上向き矢印 は、間隔を示します。
赤い下向きの矢
売りが可能であることを示す (MAは下方)

MAをクロスさせた足が決定された場合、移動平均を定めるために使用される。 この場合、1つの足の間にトレーディングシグナルが存在します (図3)。 

 
図3. 移動平均と価格を使用して、エントリポイントを決定します。 青い上向き矢印 は、
買いのシグナルで、赤い下向き矢印
は、
売りシグナルです。

MAの勾配は同様に使用することができます。MAの方向が変わった足は、エントリポイントです (図4)。 

 
図4. 移動平均の勾配を使用してエントリポイントを決定します。 青い上向きの矢
買いのタイミングです。赤い下向きの矢印売り です。

この記事では、トレンドを決定するオプション (図1と図2のような) を考察します。 エントリバーを決定するオプションの比較をします。   

通常、オシレーターは、例えば RSI (図5) のようなレベルを越えることによって、エントリポイントを決定するために使用されます。 ストキャスティクスオシレーターを使用してエントリポイントを決定するには、少なくとも2つの方法があります。  

 
図5. RSIインジケーターに基づいてエントリを決定します。 青色の矢印は、
買いエントリーするバーを示しています。 70上向き), 赤い矢印は、売りエントリーするバーを示しています。

オシレーターを使用してトレンドを特定する方法を考えてみましょう。 答えは明白で、メインラインとシグナルラインの位置に基づいて決定することができます。つまり、メインラインがシグナルの上にあるとき買い、メインラインがシグナルの下にあるときに売ります。(図6)


図6. トレンドを決定するためのストキャスティクスオシレーターのメインとシグナル線のポジション。 青い矢印は
上昇トレンドを示しています。 (シグナル上のメインライン)、赤い矢印は下降を意味しています。 (シグナルの下のメインライン)

同様に、レベルを使用することができます。オシレーターは、特定のレベル以上の場合、買いで入ることができます。 (図 7)

 
図7. RSIオシレーターとトレンドを決定するため、レベルを使用します。青色の矢印は、上昇トレンドを示します。
(RSI が60以上)、 赤い矢印は下降トレンドを示します。 (RSI は40以下)

トレンドの表示

トレンドを表示するための最も便利な方法を見つけましょう。 最初のアイデアは、線をプロットすることです。トレンドに応じて色を変更します。 RSI60と40のレベルを使用してトレンドの検出をしてみましょう。 RSIが60を超える場合は買い、40を下回る場合は売ります (図7)。 このケースで、RSIが40と60のレベルの間にあるとき、買いも売りもすることができます。 レベルを交換してみましょう。買いレベルは 40で、売りレベルは60です。 この場合、売りと買いの両方が40と60のレベルの間で可能です (図8)。

 
図8. RSIオシレーターを使用してトレンドを判断します。 買いレベルが40に設定され、売りレベルが 60です。
買いも売りもできるゾーンがあります。 (青と赤の矢印の両方が存在する)。

したがって、トレンドは2つの独立したデータセットとして表示される必要があります。 2つのインジケータバッファを使用します。1 つのバッファがわずかに上部にシフトされます。 (この場合は2つのバッファを同時に表示することができます)。 バッファは連続的に表示されないため、ヒストグラムまたはアイコンを使用することをお勧めします。 では、アイコンを選択してみましょう。 この場合、バッファの色に加えて、異なるアイコンを使用することができます。 図9は、インジケータがどのように見えるかを示しています。

 
図9. トレンドを表示する有効な方法

このようなトレンド表示方式は、使用するインジケーターの数を拡大することができます。 たとえば、方向に依存しないインジケーターを追加できますが、それはさまざまな間隔でのトレードを許可/禁止するだけです。 たとえば、 ATRまたはSTDを使用してみます。 その値が一定の閾値を超えると、両方の矢印 (上下) が表示されます。 したがって、普遍的なインジケーターは、さらに普遍的になります。   

使用されるインジケーター

ユニバーサルトレンドインジケーターの作成を開始する前に、トレンドの決定に使用されるインジケーターを定義します。 必要な外部パラメータのセット (変数の数と型) を見つけることができます。 もちろん、可能なすべてのオプションを1つのインジケーターにシンプルに収めることはできません。 移動平均でも、2つの異なる方法で使用することができます。 また、2つの移動平均を使用することができます。 したがって、最初にインジケーターを変更する簡単な可能性を提供する必要があります。

インジケーターの使用オプションは、明らかではないかもしれませんが、同じようにすることができます。 たとえば、トレンドを判断するための2つの mas (高速および低速) を使用すると、ma と価格に基づくトレンド検出のオプションが不要になります。 短期MA の期間を設定した場合、この MA は、価格に対応します。 したがって、各区分は個別に考慮する必要があります。 また、各インジケーターの各使用バリアントを考慮する必要があります。

iAC (アクセラレータオシレーター)

このインジケーターにはパラメータがありませんが、特定のパラメータを持つOsMAインジケーターと同じであるため、使用されません。  

iAD (アキュムレーション/ディストリビューション)

特定のインジケーター。 インジケーターの値の範囲が定義されておらず、そのラインが大きく壊れ、トレンドの決定に適していません。 これは使いません。 

iADX (Average Directional Index)

バリアント 1。 PDIとMDIのポジション。 MDI上のPDI-上昇トレンド、MDI の下の PDI-下降トレンド。

パラメーター

  1. int adx_period。 

バリアント 2。 方向に依存しません。 特定のレベルを基準とする ADXの位置。 レベルの上にADXがある場合、売買が許可されます。 インジケーターパラメータに加えて、レベルの追加パラメータが必要になります。 

 パラメーター:

  1. int adx_period — period;
  2. double level -レベル。 

iADXWilder (ウェルズワイルダーによる平均方向性指数)

これはADX に似ています。

iAlligator (アリゲーター)

インジケーターは、異なる期間と異なるシフト値を持つ3つの移動平均で構成されます。 このインジケーターを使用するには、さまざまな方法があります。 ここでのみ使用されます。

バリアント 1。 速いライン (lips) は中間ライン (teeth) の上にあり、中間ラインは遅い 1 (jaw) の上にある-上昇トレンド、ラインが逆のオーダーで置かれれば-下降トレンド。   

パラメーター

    1. int jaw_period —顎の期間; 
    2. int jaw_shift-顎のラインのシフト; 
    3. int teeth_period —歯の期間;
    4. int teeth_shift —歯のシフト; 
    5. int lips_period —唇の期間; 
    6. int lips_shift-リップラインのシフト;
    7. ENUM_MA_METHOD ma_method — 平滑化タイプ; 
    8. ENUM_APPLIED_PRICE APPLIED_PRICE-価格タイプ。

iAMA (適応移動平均)

インジケーターは移動平均です。 すべての MAs の2つのアプリケーションバリアントを使用します。

バリアント 1。 ラインスロープ。 標準のインディケータパラメータに加えて、勾配がチェックされる2番目のインジケーターポイントのシフトを決定するパラメータが必要です。 

パラメーター

    1. int ama_period — AMA 期間; 
    2. int fast_ma_period — 短期移動平均の期間;
    3. int slow_ma_period — 長期移動平均の期間; 
    4. nt ama_shift —インジケーターの水平方向のシフト。 
    5. ENUM_APPLIED_PRICE  applied_price — 価格タイプ;
    6. int shift2 —勾配がチェックされている点の相対ポジションシフト。

バリアント 2。 2ライン: 短期と長期 最初のラインは長期の上にある場合—上昇トレンド 2つの同一セットの標準パラメータが必要です。 

パラメーター

    1. int ama_period1 — AMA 期間; 
    2. int fast_ma_period1 — 短期移動平均期間;
    3. int slow_ma_period1 — 長期移動平均期間; 
    4. int ama_shift1 —インジケーターの水平方向のシフト。 
    5. ENUM_APPLIED_PRICE  適用価格1 — 価格タイプ;
    6. int ama_period2 — AMA期間; 
    7. int fast_ma_period2 — 短期移動平均の期間;
    8. int slow_ma_period2 — 長期移動平均期間; 
    9. int ama_shift2 —インジケーターの水平方向のシフト。 
    10. ENUM_APPLIED_PRICE applied_price2-価格タイプ。
注: 最後の番号1を持つ変数は、短期に使用され、2は長期に使用されます。


このインジケーターにはパラメータがありませんが、特定のパラメータを持つMACDインジケーターと同じであるため、使用されません。   

iATR(Average True Range)

このインジケーターは方向に依存しませんが、1つのバリアントが使用されます。

バリアント 1: 方向に依存しません。 レベルを基準とした ATRの位置。 レベル以上のATR-売買が許可されています。 インジケーターパラメータに加えて、レベルの追加パラメータが必要になります。 

パラメータ:

  1. int ma_period — 期間;
  2. double level -レベル。  

iBearsPower (ベアパワー)iBullsPower (ブルズパワー)

BearsPower と BullsPower インジケーターは対称ではありません。 すなわち、一緒に使用する必要があります。 上昇トレンドを決定するために BullsPower を使用し、下降トレンドを決定するために BearsPowerを使います。 2つのバリアントを使用します: レベルに相対的なインジケータのポジション,およびトレンド.

バリアント 1。 BullsPower が設定レベルを上回っている場合買い、BearsPower が同じレベルを下回る場合は売りです。 標準パラメータに加えて、レベルの追加パラメータが必要になります。

パラメーター:

    1. int ma_period — 期間;
    2. double level -レベル。   

バリアント 2。 インジケーターの方向。 このバリアントでは、勾配が定義されている2番目の点のシフトを決定する追加パラメータが必要です。

パラメーター:

    1. int ma_period — 期間;
    2. int shift2-2 番目の点のシフト。   

iBands (ボリンジャーバンド)

このインジケーターはチャネルです。

バリアント 1。 価格が上のボーダーを上向きに越える場合、上昇トレンドです。価格が中央線を下向きに越えると、トレンドは取り消されます。 このインジケータは、他の方向でも同様に動作します。  

パラメーター:

    1. int bands_period — 中央線の計算期間;
    2. int bands_shift —インジケーターの水平方向のシフト。 
    3. double —標準偏差の数。 
    4. ENUM_APPLIED_PRICE APPLIED_PRICE-価格タイプ。

iCCI (商品チャネルインデックス)

このインジケータは、サブウィンドウ内のオシレーターです。 インジケーターラインは、大スケールな期間でも強く壊れているため、勾配のあるバージョンは使用されません。

バリアント 1。 レベルに対する相対的なポジション。 インジケータがレベルの上にある場合—上昇トレンドで、 下回る場合—下降トレンドです。 

パラメーター:

    1. int ma_period — 平均化期間; 
    2. ENUM_APPLIED_PRICE  applied_price — 価格タイプ;  
    3. double level -レベル。   

iChaikin (チャイキンオシレーター)

このインジケータは CCI に似ています。

バリアント 1。 レベルに対する相対的なポジション。 インジケータがレベルの上にある場合—上昇トレンドで、 下回る場合—下降トレンドです。 

パラメータ:

    1. int fast_ma_period — 高速期間;  
    2. int ow_ma_period — 低速期間; 
    3. ENUM_MA_METHOD ma_method — 平滑化タイプ; 
    4. ENUM_APPLIED_VOLUME  applied_volume — ボリューム; 
    5. double level -レベル。 

iDEMA (Double Exponential Moving Average)

インジケーターは移動平均で、以前に説明した AMA と同様に適用されます。

バリアント 1。 ラインスロープ。 

パラメーター

    1. int ma_period — 平均化期間;
    2. ENUM_APPLIED_PRICE  applied_price — 価格タイプ;
    3. int ma_shift —インジケーターの水平方向のシフト。 
    4. int shift2 —勾配がチェックされている点の相対ポジションシフト。

バリアント 2。 2ライン: 短期と長期

パラメーター

    1. int ma_period1 — 平滑化期間;
    2. ENUM_APPLIED_PRICE  適用価格1 — 価格タイプ;
    3. int ma_shift1 —インジケーターの水平方向のシフト。 
    4. int ma_period2 — 平均化期間;
    5. ENUM_APPLIED_PRICE  applied_price2 — 価格タイプ;
    6. int ma_shift2 —インジケーターの水平方向のシフト。
注: 最後の番号1を持つ変数は、短期に使用され、2は長期に使用されます。 

iDeMarker (DeMarker)

このインジケーターは、0 ~ 1 の範囲のサブウィンドウのオシレーターです。 インジケーターのニュートラルレベルは0.5 です。 インジケータラインは非常に不均一なので、勾配バリアントには適合しません。

バリアント 1。 レベルに対する相対的なポジション。 売りレベルはパラメータを使用して設定され、買いレベルは0.5 のレベルに対して対称的に計算されます。 

パラメータ:

  1. int ma_period — 平均化期間;
  2. double level — 売りのレベル.

iEnvelopes (Envelopes)

このインジケーターは、ボリンジャーバンドバンドに似たチャネルですが、より簡単です。

バリアント 1。 価格がチャネルの上のボーダーの上にあれば、買い。 下のチャンネルの下にある場合は、売り。  

パラメーター:

  1. int ma_period — 中心線の計算期間;
  2. int ma_shift —インジケーターの水平方向のシフト。 
  3. ENUM_MA_METHOD ma_method — 平滑化タイプ;
  4. ENUM_APPLIED_PRICE applied_price — 価格タイプ; 
  5. 2重偏差—中央線からのチャンネル境界線の偏差。  

iForce (Force Index)

このインジケーターは、サブウィンドウ内のオシレーターで、0レベル周辺を示します。 このインジケータは CCI に似ています。

バリアント 1。 レベルに対する相対的なポジション。 

パラメータ: 

  1. int ma_period — 平均化期間; 
  2. ENUM_MA_METHOD ma_method — 平滑化タイプ; 
  3. ENUM_APPLIED_VOLUME APPLIED_VOLUME —計算に使用されるボリュームのタイプ。
  4. double level -レベル。    

iFractals (Fractals)

インジケーターにパラメータがありません。

バリアント 1。 最後のフラクタル型に基づいて定義します。 最後のフラクタルが上記の場合は、売り。 下にある場合-買い。  

iFrAMA (Fractal Adaptive Moving Average)

インジケーターは移動平均です。 AMAに似ています。 

バリアント 1。 ラインスロープ。 

パラメーター

  1. int ma_period — 平均化期間; 
  2. int ma_shift —インジケーターの水平方向のシフト。 
  3. ENUM_APPLIED_PRICE  applied_price — 価格タイプ;
  4. int shift2 —勾配がチェックされている点の相対ポジションシフト。

バリアント 2。 2ライン: 短期と長期

パラメーター

    1. int ma_period1 — 平滑化期間; 
    2. int ma_shift1 —インジケーターの水平方向のシフト。 
    3. ENUM_APPLIED_PRICE  適用価格1 — 価格タイプ;
    4. int ma_period2 — 平均化期間; 
    5. int ma_shift2 —インジケーターの水平方向のシフト。 
    6. ENUM_APPLIED_PRICE applied_price2-価格タイプ。
注: 最後の番号1を持つ変数は、短期に使用され、2は長期に使用されます。 

iGator (Gator Oscillator)

このインジケーターはアリゲーターインジケーターに基づいて計算されます。 このインジケーターによって提供される情報はアリゲーターから入手することができます。 

iIchimoku (Ichimoku Kinko Hyo)

次のインジケーターラインは、 転換線基準線と雲のどれかになります。 雲では、ポジションを変更する2つのラインを定義できます (上のラインが変更されます)。 2つのバリアントがあります。

バリアント 1転換基準ラインのポジション。 転換線 (赤色) が基準(青色) の上にある場合は、上昇トレンドです。 転換線基準を下回る場合は、下降トンドです。

パラメータ: 

    1. int tenkan_sen — 転換線の期間; 
    2. int kijun_sen — 基準線の期間; 
    3. nt senkou_span_b —先行スパン b 期間。  

バリアント 2。 雲の方向に基づいています。 雲は二つの線で定義されています。SpanA と SpanB。 SpanA が SpanB の上にある場合—上昇トレンド, 逆は下降トレンドです。

パラメータ: 

    1. int tenkan_sen — 転換線の期間; 
    2. int kijun_sen — 基準線の期間; 
    3. nt senkou_span_b —先行スパン b 期間。  

その非常に特殊な性質ゆえ、このインジケーターを使用しません。 

iMomentum (Momentum)

このインジケータは、サブウィンドウ内のオシレーターです。 インジケータラインが非常に不均一であり、トレンドを決定するには適していません。 レベルを持つバージョンが使用されます。

バリアント 1。 レベル 中立レベル: 100。 標準インジケーターのパラメータに加えて、売りレベルが必要です。 買いレベルは、100のレベルに対して対称的に計算されます。

パラメータ:

    1. int mom_period — 適用期間; 
    2. ENUM_APPLIED_PRICE applied_price — 価格タイプ;
    3. double level — 売りのレベル.  

iMFI (Money Flow Index)

このインジケーターは、0 ~ 100 の範囲のサブウィンドウのオシレーターです。 中立レベル:50。 インジケータラインは非常に不均一であり、トレンドを決定するには適していません。

バリアント 1。 レベル。 標準パラメータに加えて、売りレベルを決定するパラメータが必要です。 買いレベルは、50のレベルに対して対称的に計算されます。 インジケーターラインが買いレベルを上回っている場合、上昇トレンド。下回る場合は下降トレンドです。 

パラメータ: 

    1. int ma_period — 平均化期間;
    2. ENUM_APPLIED_VOLUME APPLIED_VOLUME —計算に使用されるボリュームのタイプ。
    3. double level — 売りのレベル.  

iMA (Moving Average)

シンプルな移動平均です。

バリアント 1。 ラインスロープ。

パラメーター

    1. int ma_period — 平均化期間; 
    2. int ma_shift —インジケーターの水平方向のシフト。 
    3. ENUM_MA_METHOD ma_method — 平滑化タイプ; 
    4. ENUM_APPLIED_PRICE applied_price — 価格タイプ;
    5. int shift2 —勾配がチェックされている点の相対ポジションシフト。

バリアント 2。 2ライン: 短期と長期

パラメーター

  1. int ma_period1 — 平滑化期間; 
  2. int ma_shift1 —インジケーターの水平方向のシフト。 
  3. ENUM_MA_METHOD ma_method1 — 平滑化タイプ; 
  4. ENUM_APPLIED_PRICE applied_price1 — 価格タイプ;
  5. int ma_period2 — 平均化期間; 
  6. int ma_shift2 —インジケーターの水平方向のシフト。 
  7. ENUM_MA_METHOD ma_method2 — 平滑タイプ; 
  8. ENUM_APPLIED_PRICE applied_price2-価格タイプ。
注: 最後の番号1を持つ変数は、短期に使用され、2は長期に使用されます。 


iOsMA (Moving Average of Oscillator (MACD histogram)

OsMAオシレーターはサブウィンドウのヒストグラムです。 2つのバリアントが可能です。レベルと方向に基づいています。

バリアント 1。 レベル。 ヒストグラムがレベルより上にある場合買い、マイナス値以下の場合は売りです。

パラメータ: 

  1. int fast_ema_period — 短期移動平均期間; 
  2. int slow_ema_period — 長期移動平均期間; 
  3. int signal_period — シグナル期間;
  4. ENUM_APPLIED_PRICE  applied_price — 価格タイプ; 
  5. double level -レベル。

バリアント 2。 方向。 ヒストグラムが上向きになっている場合買い。下向きの場合-売り。 2番目のポイントの方向が定義されて相対的なシフトを決定する追加のパラメータが必要です。  

パラメータ:

  1. int fast_ema_period — 短期移動平均期間; 
  2. int slow_ema_period — 長期移動平均期間; 
  3. int signal_period — シグナル期間;
  4. ENUM_APPLIED_PRICE  applied_price — 価格タイプ; 
  5. int shift2 —方向を決定するための2番目の点のシフト。 

iMACD (Moving Averages Convergence-Divergence)

MACD ヒストグラムは、サブウィンドウにヒストグラムとシグナル線を描画します。 インジケーターを使用するには、ヒストグラムレベル、その方向、およびシグナル線に対する相対ポジションに基づいて、次の3つの方法があります。 ただし、後者は、レベル (レベルが0に設定されている場合) による特殊なケースであり、使用されません。  

バリアント 1。 レベル。 ヒストグラムがレベルより上にある場合買い、マイナス値以下の場合は売りです。

パラメータ: 

  1. int fast_ema_period — 短期移動平均期間; 
  2. int slow_ema_period — 長期移動平均期間; 
  3. int signal_period — シグナル期間;
  4. ENUM_APPLIED_PRICE  applied_price — 価格タイプ; 
  5. double level -レベル。

バリアント 2。 方向。 ヒストグラムは上向きに指示されている場合-買い;下向きの場合-売り。 2番目のポイントの方向が定義されて相対的なシフトを決定する追加のパラメータが必要です。  

パラメータ:

  1. int fast_ema_period — 短期移動平均期間; 
  2. int slow_ema_period — 長期移動平均期間; 
  3. int signal_period — シグナル期間;
  4. ENUM_APPLIED_PRICE  applied_price — 価格タイプ; 
  5. int shift2 —方向を決定するための2番目の点のシフト。 

iOBV (On Balance Volume)

AD と同様に、このインジケーターは特定の範囲の値を持たず、途切れます。 これは使いません。 

iSAR (Parabolic Stop And Reverse System)

インジケーターは価格チャートに表示され、1ラインのドットを描画します。 価格の移動方向に応じて、ラインを上下に配置することができます。

バリアント 1。 価格に対する相対的なポジション。 価格がインジケータラインの上-上昇トレンド、価格がインジケーターラインの下-下降。 

パラメータ:

  1. double step — 価格変化ステップ — アクセルレーションファクター;
  2. double maximum — 最大ステップ. 

iRSI (Relative Strength Index)

サブウィンドウ内のオシレーター。 MFI に似た1つのアプリケーションバリアント。

バリアント 1。 レベル。

パラメータ: 

  1. int ma_period — 平均化期間; 
  2. ENUM_APPLIED_PRICE  price — 価格タイプ;
  3. double level — 売りのレベル.  

iRVI (Relative Vigor Index)

シグナル線を持つサブウィンドウ内のオシレーター。 値は0を中心に変化します。

バリアント 1。 レベル。 基準より上で-買い、下で-売り。

パラメーター:

    1. int ma_period — 平均化期間;
    2. double level -レベル。  

バリアント 2。 メインとシグナル線。

パラメーター:

    1. int ma_period —平均期間。  

iStdDev (Standard Deviation)

このインジケーターは方向に依存しません。 ATRに似ています。

バリアント 1。 レベル。 

パラメータ: 

    1. int ma_period — 平均化期間; 
    2. int ma_shift —インジケーターの水平方向のシフト。 
    3. ENUM_MA_METHOD ma_method — 平滑化タイプ; 
    4. ENUM_APPLIED_PRICE applied_price — 価格タイプ;
    5. double level -レベル。  

iStochastic (Stochastic Oscillator)

メインとシグナル線があるサブウィンドウ内のオシレーター。 

バリアント 1。 メインラインの勾配。 

パラメータ:

  1. int Kperiod — K期間;
  2. int Dperiod — D期間;
  3. int slowing — スムージング; 
  4. ENUM_MA_METHOD ma_method — 平滑化タイプ; 
  5. ENUM_STO_PRICE price_field — 価格;
  6. int shift2 —勾配を決定するための2番目の点のシフト。 

バリアント 2。 レベル。 インジケーターの値は0から100まで異なり、ニュートラルレベルは50です。 売りレベルには追加のパラメータが必要です。買いレベルが計算されます。 

パラメータ:

  1. int Kperiod — K期間;
  2. int Dperiod — D-period;
  3. int slowing — スムージング; 
  4. ENUM_MA_METHOD ma_method — 平滑化タイプ; 
  5. ENUM_STO_PRICE price_field — 価格;
  6. double level -レベル。

バリアント 3。 メインとシグナル線のポジション。

パラメータ:

  1. int Kperiod — K期間;
  2. int Dperiod — D期間;
  3. int slowing — スムージング; 
  4. ENUM_MA_METHOD ma_method — 平滑化タイプ; 
  5. ENUM_STO_PRICE price_field-価格。

iTEMA (Triple Exponential Moving Average)

もうひとつの移動平均。

バリアント 1。 ラインスロープ。

パラメーター

  1. int ma_period — 平均化期間; 
  2. int ma_shift —インジケーターの水平方向のシフト。 
  3. ENUM_APPLIED_PRICE applied_price — 価格タイプ;
  4. int shift2 —勾配がチェックされている点の相対ポジションシフト。

バリアント 2。 2ライン: 短期と長期

パラメーター

  1. int ma_period1 — 平滑化期間; 
  2. int ma_shift1 —インジケーターの水平方向のシフト。 
  3. ENUM_APPLIED_PRICE applied_price1 — 価格タイプ;
  4. int ma_period2 — 平均化期間; 
  5. int ma_shift2 —インジケーターの水平方向のシフト。 
  6. ENUM_APPLIED_PRICE applied_price2-価格タイプ。
注意. 最後に1がつく変数は高速ラインに、2がつく変数は低速ラインに使用されます。 

iTriX (Triple Exponential Moving Averages Oscillator)

サブウィンドウ内のオシレーター。 1つのバリアント-ライン勾配。 変更については、2つのラインで2番目のバリアントです。 高速かつ低速 

バリアント 1。 ラインスロープ。

パラメーター

  1. int ma_period — 平均化期間; 
  2. int ma_shift —インジケーターの水平方向のシフト。 
  3. ENUM_APPLIED_PRICE applied_price — 価格タイプ;
  4. int shift2 —勾配がチェックされている点の相対ポジションシフト。
注: iTriX関数には ma_shift パラメータがありませんが、インジケータはシフト可能です。 いずれの場合も、shift パラメータ (すべてのインジケーターに対して0に設定されます) が、バーインデックスを計算することによって、シフトは実行されません

バリアント 2。 2ライン: 短期と長期

パラメーター

  1. int ma_period1 — 平滑化期間; 
  2. int ma_shift1 —インジケーターの水平方向のシフト。 
  3. ENUM_APPLIED_PRICE applied_price1 — 価格タイプ;
  4. int ma_period2 — 平均化期間; 
  5. int ma_shift2 —インジケーターの水平方向のシフト。 
  6. ENUM_APPLIED_PRICE applied_price2-価格タイプ。
注意. 最後に1がつく変数は高速ラインに、2がつく変数は低速ラインに使用されます。 

iWPR (Williams' Percent Range)

このインジケーターは1に設定されているが、逆のスケールでは、メインストキャスティクスラインと同じです。 これは使いません。

iVIDyA (Variable Index Dynamic Average)

もうひとつの移動平均。

バリアント 1。 ラインスロープ。

パラメーター

  1. int cmo_period-cmo 期間 
  2. ema_period-平滑化期間 
  3. ma_shift —インジケーターの水平方向のシフト 
  4. ENUM_APPLIED_PRICE APPLIED_PRICE-価格タイプ
  5. int shift2 —勾配がチェックされている点の相対ポジションシフト。
バリアント 2。 2ライン: 高速かつ低速。

パラメーター

  1. int ma_period1 — 平滑化期間; 
  2. int ma_shift1 —インジケーターの水平方向のシフト。 
  3. ENUM_APPLIED_PRICE applied_price1 — 価格タイプ;
  4. int ma_period2 — 平均化期間; 
  5. int ma_shift2 —インジケーターの水平方向のシフト。 
  6. ENUM_APPLIED_PRICE applied_price2-価格タイプ。
注: 最後の番号1を持つ変数は、短期に使用され、2は長期に使用されます。 

Volumes (ボリューム)

インジケーターの値は、価格の方向に依存しません。 このインジケーターは、ATRやSTD と同様に使用できます。

バリアント 1。 レベル インジケーターの値がレベルを上回っている場合は、売買が許可されます。 

パラメータ:

  1. ENUM_APPLIED_VOLUME APPLIED_VOLUME —ボリュームのタイプ;
  2. double level -レベル。  

インジケーターとそのアプリケーションの亜種を定義しています。 ここで、すべての型の列挙を記述します。 Includes フォルダで、UniTrend フォルダを作成し、その中に列挙を含む URUniTrendDefines.mqh ファイルを作成します。 

enum EType{    Type_ADX_PDIMDI,          //ADX インジケーターの PDI および MDIラインのポジション    Type_ADX_Level,           //レベルを基準とする ADX 線の位置    Type_ADXW_PDIMDI,         //ADX ワイルダーインジケーターの PDI および MDI ラインのポジション    Type_ADXW_Level,          //ADXワイルダーのレベルに対する ADX ラインのポジション    Type_Alligator,           //アリゲーター    Type_AMA_Dir,             // АМАの方向          Type_AMA_2MA,             // 2つの АМА    Type_ATR_Level,           //ATR    Type_BuBe_Level,          //ブルベアパワーとレベル    Type_BuBe_Dir,            //ブルの方向/ベアの力    Type_Bands,               //ボリンジャーバンド    Type_CCI_Level,           //CCI とレベル    Type_Chaikin_Level,       //チャイキンオシレーターとレベル    Type_DEMA_Dir,            //DEMAの方向    Type_DEMA_2MA,            //2つのDEMA    Type_DeMarker_Level,      //DeMarker とレベル    Type_Envelopes,           //エンベロープ    Type_Force_Level,         //フォースオシレーターとレベル    Type_Fractals,            //フラクタル    Type_FrAMA_Dir,           //FrAMAの方向    Type_FrAMA_2MA,           //2つの FrAMAs    Type_Ichimoku_TK,         //一目均衡表: 転換線と基準    Type_Ichimoku_SASB,       //一目均衡表:雲    Type_Momentum_Level,      //運動量とレベル    Type_MFI_Level,           //MFIとレベル    Type_MA_Dir,              //MAの方向    Type_MA_2MA,              //2つのMA    Type_OsMA_Dir,            //OsMAの方向    Type_OsMA_Level,          //OsMAとレベル    Type_MACD_Dir,            //MACD の方向    Type_MACD_Level,          //MACD とレベル    Type_SAR,                 //SAR    Type_RSI_Level,           //RSIとレベル    Type_RVI_Level,           //RVIとレベル    Type_RVI_MS,              //RVIのメインラインとシグナル線    Type_STD_Level,           //標準偏差とレベル    Type_Sto_Dir,             //確率の方向    Type_Sto_Level,           //確率とレベル    Type_Sto_MS,              //確率の主およびシグナルライン    Type_TEMA_Dir,            //TEMAの方向    Type_TEMA_2MA,            //2つのTEMA    Type_TriX_Dir,            //TriXの方向    Type_TriX_2MA,            //2つのTriXs    Type_VIDyA_Dir,           //VIDyAの方向    Type_VIDyA_2MA,           //2つのVIDyAs    Type_Volumes              //ボリューム

};

外部パラメータ

上記のインジケータの説明を分析することで、必要な外部パラメータのセットを決定することができます。 必要なパラメータとその型はすべて表1に示されています。 基本的にプレフィックス "f_" (高速を意味する) で変数を使用します。 低速な移動平均を持つバリアントの場合、パラメータの2番目のグループを "s_" というプレフィックスで使用します (低速)。

表 1。 外部パラメータとそのタイプ  

Type Name
int  f_period1
int  f_shift1
int  f_period2
int  f_shift2
int  f_period3
int  f_shift3
ENUM_MA_METHOD  f_method
ENUM_APPLIED_PRICE  f_price
ENUM_APPLIED_VOLUME   f_volume
ENUM_STO_PRICE  f_sto_price
double  f_level
int  f_dot2shift
double  f_step 
double  f_maximum 
int  s_period1
int  s_shift1
int  s_period2
int  s_shift2
int  s_period3
int 
s_shift3
ENUM_MA_METHOD  s_method
ENUM_APPLIED_PRICE  s_price
int mult 
int  level_digits 
int  sar_step_digits 
int  sar_maximum_digits 

インジケーターの説明で指定されたパラメータに加えて、テーブルの下部に追加パラメータを使用できます。

  • mult —クオートで囲まれた桁数に応じて、ポイント単位で測定されるパラメータの乗数。 MACD やOsMAなど、インジケーターの値は、価格と接続されているので、ポイントで設定する方が便利です。 パラメータ値は、クオートの桁数に応じて修正する必要があります。
  • level_digits パラメータの小数点以下の桁数。 グラフィカルインターフェースでは、レベル値は、CSpinBox コントロール ("+" と "-" ボタンを持つ入力フィールド) を使用して設定されるため、異なるインジケーターに対して異なる最小の変更を設定すると便利です ("+" または "-" が押されたときに値が変化する量)。
  • sar_step_digits — SARインジケーターのステップパラメータの小数点以下の桁数。
  • sar_maximum_digits — SARインジケーターの最大パラメータの小数点以下の桁数。
今ではパラメータの適切な値を決定することは困難ですlevel_digits,sar_step_digits, sar_maximum_digits では、 URUniTrendDefines.mqh ファイルに定数を追加するので、その値をシンプルに修正できます。
#define ADX_LEVEL_DIGITS         0 //ADXインジケーター
#define ADXW_LEVEL_DIGITS        0 //ADXワイルダーインジケーター
#define ATR_LEVEL_DIGITS         1 //ATRインジケーター用
#define BUBE_LEVELS_DIGITS       1 //ブルベアインジケータ
#define CCI_LEVEL_DIGITS         0 //CCIインジケータ
#define CHAIKIN_LEVEL_DIGITS     0 //チャイキンオシレーター用
#define DEMARKER_LEVEL_DIGITS    2 //Demarker インジケーター
#define FORCE_LEVEL_DIGITS       3 //フォースインジケーター
#define MOMENTUM_LEVEL_DIGITS    2 //モメンタムインジケーター
#define MFI_LEVEL_DIGITS         0 //MFIインジケータ
#define OSMA_LEVBEL_DIGITS       2 //OsMAインジケーター
#define MACD_LEVEL_DIGITS        2 //MACD インジケーター
#define RSI_LEVEL_DIGITS         0 //RSIインジケーター
#define RVI_LEVEL_DIGITS         2 //RVIインジケーター
#define STD_LEVEL_DIGITS         1 //STDインジケーター
#define STO_LEVEL_DIGITS         0 //ストキャスティクスインジケーター
#define BANDS_LEVEL_DIGITS       1 //ボリンジャーバンド
#define ENVELOPES_LEVEL_DIGITS   2 //エンベロープインジケーター
#define SAR_STEP_DIGITS          3 //SARインジケータ (ステップパラメータ) 
      #define SAR_MAXIMUM_DIGITS       2 //SARインジケータ (最大パラメータ) 

ATRについては、ブル/ベア、OsMA、MACD、std レベルの値はポイント単位で設定されます。 

表1に基づいて、次の構造を作成してみましょう。

struct SExtParams{
   int                 f_period1;
   int                 f_shift1;
   int                 f_period2;
   int                 f_shift2;
   int                 f_period3;
   int                 f_shift3;
   long                f_method;
   long                f_price;
   long                f_volume;
   long                f_sto_price;
   double              f_level;
   int                 f_dot2shift;
   double              f_step;  
   double              f_maximum;  
   int                 s_period1;
   int                 s_shift1;
   int                 s_period2;
   int                 s_shift2;
   int                 s_period3;
   int                 s_shift3;
   long                s_method;
   long                s_price;
   int                 mult;
   int                 level_digits;
   int                 sar_step_digits;
   int                 sar_maximum_digits;      
            };

パラメータを構造体に結合すると、コードの残りの部分から分離することができます。 使用可能なオプションが十分でない場合で、新しいトレンド検出タイプを追加することによってインジケーターを修正する必要がある場合は、非常に便利です。 また、関数やクラスメソッドへのパラメータの転送が大幅に簡略化されています。

この記事で生成されたインジケーターは、文字の行としてのトレンドを示すので、(これはすべての指標で同じです)、簡単にトレンドの始まりについて通知する関数をインジケーターに追加することができます。 トレンドの終わりに興味がある人もいれば、新しいトレンドの出現に興味がある人もいます。 したがって、通知の種類を選択するための列挙体を作成します。

enum EAlerts{
   Alerts_off=0, //通知無効
   Alerts_Bar0=1, //新足の通知
   Alerts_Bar1=2 //完了した足の通知
            };  

インジケーターの作成

ユニバーサルインジケーターのクラスの作成については、「グラフィカルインターフェイスを持つユニバーサルオシレーター」と「グラフィカルインターフェイスを持つユニバーサルチャンネル」の記事で詳しく解説しています。 この記事に関連して、特定の関数を検討してみましょう。

トレンドを決定するための上記のメソッドのすべては、2つのカテゴリーに分けられます。 1つのハンドルをチェックする必要があるインジケーターをロードした後、2つを確認します。 つまり、基本クラスには、ハンドルをチェックするさまざまなメソッドを持つ2つの子クラスがあります。 トレンドが決定される独自の子クラスがあります。

基本クラス:

class CUniTrend{
   protected:
  
      int m_handle1;
      int m_handle2;
      
      string m_name;
      string m_help;
      
      int m_ci;
      
      double m_b1[1];
      double m_b2[1];      
      double m_b3[1];    
      double m_b4[1];
            
      int m_shift;
      int m_shift1;    
      int m_shift2;
      int m_shift3;
      
      int m_dot2shift;
      
      double m_level;      
      
   public:
  
      void CUniTrend(){
         m_handle1=INVALID_HANDLE;
         m_handle2=INVALID_HANDLE;
      }
      
      void ~ CUniTrend () {
         if(m_handle1!=INVALID_HANDLE){
            IndicatorRelease(m_handle1);
         }
         if(m_handle2!=INVALID_HANDLE){
            IndicatorRelease(m_handle2);
         }        
      }
  
      virtual int Calculate( const int rates_total,
                     constint prev_calculated,
                     double & upBuffer[],
                     double & dnBuffer[]
      ){
         return(rates_total);
      }
      
      virtual bool Calculated(){
         return(false);
      }
      
      virtual bool CheckHandles(){
         return(true);
      }      
      
      string Name(){
         return(m_name);
      }    
      string Help(){
         return(m_help);
      }
            };

プロテクトセクションには、子クラスで役立つさまざまな補助変数があります。 インジケーターハンドルの変数はコンストラクターで初期化され、ハンドルはデストラクターでエントリーされます。 残りのメソッドは仮想です。

1つのインジケーターを持つバリアントの子クラス:

class CUniTrend1:public CUniTrend{
   public:
      bool Calculated(){
         if(BarsCalculated(m_handle1)>0){
            return(true);
         }  
         else{
            return(false);
         }    
      }
      
      boolCheckHandles () {
         return(m_handle1!=INVALID_HANDLE);
      }
            };

このクラスには、CheckHandle () という2つの実数メソッドがあり、インジケーターが読み込まれるかどうかを確認し、計算 () を使用して、インジケーターが完全に計算されているかどうか調べることができます。

2つのインジケーターを持つバリアントの子クラス:

class CUniTrend2:public CUniTrend{
   public:
      bool Calculated(){
         if(BarsCalculated(m_handle1)>0 && BarsCalculated(m_handle2)>0){
            return(true);
         }  
         else{
            return(false);
         }    
      }      
      
      boolCheckHandles () {
         return(m_handle1!=INVALID_HANDLE && m_handle2!=INVALID_HANDLE);
      }
            };

異なるバリアントを持つすべてのクラスは、CUniTrend1 または CUniTrend2 の子クラスになります。 次の子クラスを検討します。

class CUniTrend_ADX_PDIMDI:public CUniTrend1{
   private:  
   public:
  
      void CUniTrend_ADX_PDIMDI( bool use_default,
                                 bool keep_previous、
                                 SExtParams と a) {}
        
         //デフォルトパラメータの設定
        
         if(use_default){
            if(keep_previous){
               if(par.f_period1==PARAMETER_EMPTY)par.f_period1=14;
            }
            else{
               par.f_period1=14;
            }      
         }          
         //インジケーターの読み込み
         m_handle1=iADX(Symbol(),Period(),par.f_period1);
         //インディケータの名前とパラメータのヒントを形成する
         m_name=StringFormat( "iADX_PDIMDI(%i)",
                              par.f_period1
                            );
  
         m_help=StringFormat( "adx_period - f_period1(%i)",
                              par.f_period1
                            );
      }
      
      int Calculate( const int rates_total,
                     constint prev_calculated,
                     double & upBuffer[],
                     double & dnBuffer[]
      ){
         int start;
        
         if(prev_calculated==0){
            start=1;
         }
         else{
            start=prev_calculated-1;
         }
      
         for(int i=start;i<rates_total;i++){
        
            upBuffer[i]=EMPTY_VALUE;        
            dnBuffer[i]=EMPTY_VALUE;
        
            m_ci=rates_total-i-1;
            
            if(CopyBuffer(m_handle1,PLUSDI_LINE,m_ci,1,m_b1)==-1){
               return(0);
            }
            
            if(CopyBuffer(m_handle1,MINUSDI_LINE,m_ci,1,m_b2)==-1){
               return(0);
            }
            
            if(m_b1[0]>m_b2[0]){
               upBuffer[i]=1;
            }
            else if(m_b1[0]<m_b2[0]){
               dnBuffer[i]=-1;            
            }
            
         }      
      
         return(rates_total);
      }
            };

クラスコンストラクタの主要なポイントはコメントされ、OnCalculate() メソッドは、インジケーターの標準 oncalculate () 関数のアナログです。 この関数のコードは、インジケーターコードと同様に作成されます。

添付では、すべてのインジケータークラスがファイル URInclude/UniTrend/UniTrendIndicators.mqh にあります。

すべてのクラスを用意したので、ユニバーサルオシレーターとユニバーサルチャンネルについての記事と同様に、トレンドを判断するための簡単な指標を作成することができます。 グラフィカルインターフェースの準備ができているインジケーターは、Indicators/iUniTrend.mq5 ファイルの添付にあります。

グラフィカルインターフェースの作成

グラフィカルインターフェイスのすべてのクラスは、 URUniTrendForm.mqh および URUniTrendControl.mqhファイルにあります。 URUniTrendForm.mqh ファイルで使用でき、URUniTrendControl.mqh ファイルには、インジケーターパラメータをエントリーするためのユニバーサルコントロールのクラスがあります。 すでに普遍的なオシレーターとユニバーサルチャンネルについての記事で検討されているので、詳細にフォームクラスの作成を議論する必要はありません。 また、「カスタムグラフィカルコントロール」の記事でも詳しく考えられています。 第3部。 フォーム". ユニバーサルコントロールの作成を検討します。

ユニバーサルコントロールの基礎は、CUniTrendControl 基本クラスです。 クラスの public セクションには仮想メソッドのみが含まれ、プロテクトセクションにはドロップダウンリストを使用するための補助メソッドが含まれています。 次に、コメント付きの基本クラスコードを示します。

class CUniTrendControl{
   protected:
      
      /* 最小値の変更を計算するための関数
         パラメータの小数点以下の桁数
      */
      double SolveChange(int d){
         return(NormalizeDouble(1.0/pow(10,d),d));  
      }
      
      //ENUM_MA_METHOD バリアントによるリストのエントリー
      void AddVariantsMethod(CComBox & cb){
         for(int i=0;i<ArraySize(e_method);i++){
            cb.AddItem(EnumToString((ENUM_MA_METHOD)e_method[i]));
         }
      }
      
      //ENUM_APPLIED_PRICE バリアントによるリストのエントリー
      void AddVariantsPrice(CComBox & cb){
         for(int i=0;i<ArraySize(e_price);i++){
            cb.AddItem(EnumToString((ENUM_APPLIED_PRICE)e_price[i]));
         }
      }      
      
      //ENUM_APPLIED_VOLUME バリアントによるリストのエントリー
      void AddVariantsVolume(CComBox & cb){
         for(int i=0;i<ArraySize(e_volume);i++){
            cb.AddItem(EnumToString((ENUM_APPLIED_VOLUME)e_volume[i]));
         }
      }  
      
      //ENUM_STO_PRICE バリアントによるリストのエントリー     
      void AddVariantsStoPrice(CComBox & cb){
         for(int i=0;i<ArraySize(e_sto_price);i++){
            cb.AddItem(EnumToString((ENUM_STO_PRICE)e_sto_price[i]));
         }
      }      
      
      //enum_ma_method の値インデックスの取得  
      int MethodIndex(long val){
         for(int i=ArraySize(e_method)-1;i>=0;i--){
            if(e_method[i]==val){
               return(i);
            }
         }
         return(-1);
      }
      
      //enum_applied_price の値インデックスの取得
      int PriceIndex(long val){
         for(int i=ArraySize(e_price)-1;i>=0;i--){
            if(e_price[i]==val){
               return(i);
            }
         }
         return(-1);
      }  
      
      //enum_applied_volume の値インデックスの取得   
      int VolumeIndex(long val){
         for(int i=ArraySize(e_volume)-1;i>=0;i--){
            if(e_volume[i]==val){
               return(i);
            }
         }
         return(-1);
      }  
      
      //enum_sto_price の値インデックスの取得     
      int StoPriceIndex(long val){
         for(int i=ArraySize(e_sto_price)-1;i>=0;i--){
            if(e_sto_price[i]==val){
               return(i);
            }
         }
         return(-1);
      }      
      
   public:
      
      // Initialization of controls
      virtual void Init(SExtParams & par){}
      
      //値の設定
      virtual void SetValues(SExtParams & par){}      
      
      //値の取得
      virtual void GetValues(SExtParams & par){}
      
      //コントロールの表示
      virtual void Show(int x,int y){}      
      
      //コントロールの非表示
      virtual void Hide(){}      
      
      //フォームの高さを計算するためのコントロールの数
      virtual int ControlsCount(){
         return(0);
      }
      
      //イベントの処理
      virtual int Event(int id,long lparam,double dparam,string sparam){
         return(0);
      }
      
};
    

ADX とレベル (2 つのコントロール) に基づいてトレンドを検出する子クラスを考えてみましょう:

class CUniTrendControl_ADX_Level: public CUniTrendControl{
   private:
  
      //シンプルなコントロールへのポインタ
      CSpinInputBox m_f_period1;
      CSpinInputBox m_f_level;
  
   public:
  
      // Initialization of controls
      void Init(SExtParams & par){
         m_f_period1.Init("f_period1",SPIN_BOX_WIDTH,1," adx_period");
         m_f_period1.SetMinValue(1);
         m_f_period1.SetReadOnly(false);
         m_f_level.Init("f_level",COMBO_BOX_WIDTH,this.SolveChange(par.level_digits)," level");
         m_f_level.SetMinValue(0);
         m_f_level.SetReadOnly(false);
      }
  
      //値の設定
      void SetValues(SExtParams & par){        
         m_f_period1.SetValue(par.f_period1);
         m_f_level.SetValue(par.f_level);
      }
  
      //値の取得
      void GetValues(SExtParams & par){
         par.f_period1=(int)m_f_period1.Value();
         par.f_level=m_f_level.Value();
      }    
  
      //コントロールの表示
      void Show(int x,int y){
         m_f_period1.Show(x,y);
         y+=20;
         m_f_level.Show(x,y);
      }      
  
      //コントロールの非表示
      void Hide(){
         m_f_period1.Hide();
         m_f_level.Hide();
      }
  
      //フォームの高さを計算するためのコントロールの数
      intControlsCount () {
         return(2);
      }
  
      //コントロールイベントの実行
      int Event(int id,long lparam,double dparam,string sparam){
         int e1=m_f_period1.Event(id,lparam,dparam,sparam);
         int e2=m_f_level.Event(id,lparam,dparam,sparam);
         if(e1!=0 || e2!=0){
            return(1);
         }
         return(0);
      }
};
    

SExtParam の変数がメソッド SetValues () と getvalues () に渡されると、構造体の必須フィールドだけが子クラスで使用されます。 レベルコントロールの最小変更値を設定する必要があります。コントロールの初期化中に行うことができるため、パラメータを持つ構造体も init () メソッドに渡されます。 一般に、子クラスの作成は、「カスタムグラフィカルコントロール」で説明されているコントロールの作成のすべての原則に対応しています。 パート 1: シンプルなコントロールの作成」では、ここで必要なメソッドだけが作成されているわけではありません。 

GUIとインジケータの組み合わせ

インジケーター作成のこの段階は、ユニバーサルトレンドインジケーターの作成とユニバーサルチャネル作成の対応する段階によく似ています。 この違いを考えてみましょう。

以前は、インジケーターがデフォルト値 (UseDefault = true) で動作していた場合、すべてのパラメータは-1 で初期化されました。 インジケーターのレベルパラメータが負になる可能性があるため、このオプションは適していません。 したがって、変数の初期化は、URUniTrendDefines.mqh ファイルで宣言された PARAMETER_EMPTY 定数の値によって実行されます。 定数には、INT_MAX の値 (レベルの実数値のリミットを大きく超える値) があります。

もう一つの違いは、OnTimer () 関数です。 計算された () メソッドは、指標を計算するかどうかをチェックするために呼び出され、トレンドのいくつかのために1つの指標をチェックする必要があり、2つの指標を確認します。 インジケータークラス内でのみ知ることができます。

その結果、別の便利なインジケーターを得ます (図10)。

図10. グラフィカルインタフェースを備えたユニバーサルトレンドインジケーター
図10. グラフィカルインタフェースを備えたユニバーサルトレンドインジケーター

注: フォーム上のリストで選択したバリアントの名前を表示するだけでなく、使用するインジケーターの種類も左上隅のインジケーターサブウィンドウに表示されます。 タイプに加えて、すべてのパラメータの値 (括弧内) が表示されます。 レベル値がポイントで指定されている場合、実際のレベル値を計算するための式が書き込まれます (図11)。

 
図11. ポイントで指定されたパラメータの表示

このインジケーターは、以下の添付ファイルIndicators/iUniTrendGUI.mq5で使用できます。  

結論 

このインジケータは、トレンドを決定するため46の異なるオプションがあります。 インジケーターとその種類のパラメータを変更することができるグラフィカルインターフェイスは、ヒストリーを分析することができます。 通知関数の存在は、実際の実用的なアプリケーションのインジケーターを有用になります。

グラフィカルインターフェイスを作成する新しいアプローチには、長所と短所の両方があります。 大量のコードが含まれているため、大量のタスクがあります。 コントロールの可視性を管理するクラスとは異なり (ユニバーサルオシレーターとユニバーサルチャンネルのように)、ここではほぼすべてのトレンドの検出のバリアントに対して実質的に完全な制御要素が作成されました。 しかし、フォームコードからの複合コントロールのコードの明確な分離と独立性は、その開発を大幅に簡素化し、また、必要な場合は、インジケータのさらなる拡大を簡素化します。

添付

この記事に添付されている必要なダウンロード可能なアーカイブです。 このファイルは適切なフォルダに配置されます。 ターミナルの同じフォルダに保存する必要があります。 

MetaQuotes Software Corp.によりロシア語から翻訳された
元の記事: https://www.mql5.com/ru/articles/3018

添付されたファイル |
files.zip (32.11 KB)
グラフィカルインターフェイスX:ソート、テーブル再構築とセル内のコントロール(ビルド11) グラフィカルインターフェイスX:ソート、テーブル再構築とセル内のコントロール(ビルド11)

レンダーテーブルにデータソート、列と行の数の管理、コントロールを配置するためのテーブルのセルタイプの設定といった新しい機能を追加し続けます。

グラフィカルインターフェイスX:レンダーテーブルの更新とコード最適化(ビルド10) グラフィカルインターフェイスX:レンダーテーブルの更新とコード最適化(ビルド10)

レンダーテーブル(CCanvasTable)に新しい機能を補完していきます。テーブルには、ホバー時の列の強調表示;、各セルにアイコンの配列を追加する機能とそれらを切り替えるメソッド、 実行時にセルテキストを設定または変更する機能などが含まれます。

グラフィカルインタフェースX: マルチラインテキストボックス内のワードラップアルゴリズム(ビルド12) グラフィカルインタフェースX: マルチラインテキストボックス内のワードラップアルゴリズム(ビルド12)

マルチラインテキストボックスの開発を続けましょう。今回の課題は、テキストがボックス幅を超えた場合には自動的にワードラップを行い、機会が生じた場合にはワードラップを取り消してテキストを前行に収めることです。

MetaTrader 4でMQL5ウィザードの既製エキスパートアドバイザーが機能 MetaTrader 4でMQL5ウィザードの既製エキスパートアドバイザーが機能

本稿ではMetaTrader 4のためのMetaTrader 5取引環境の簡単なエミュレータについてお話しします。このエミュレータは標準ライブラリの取引クラスの移行と調整を実装するものです。その結果、MetaTrader 5ウィザードで生成されたエキスパートアドバイザーは、そのままMetaTrader 4でコンパイルして実行することができます。