
サポートラインおよびレジスタンスラインの自動構築
イントロダクション
この記事では、サポートラインとレジスタンスラインの構築をします。 通貨シンボルのテクニカル分析は、金融相場でのトレードに重要なファクターです。 ラインの自動構築は、金融アナリストやトレーダーのテクニカル分析を加速します。 また、ここで説明するインジケーターは、EAを開発するために使用することができます。
すべての天井と底を検索
サポートラインとレジスタンスラインは、位置的な天井と価格チャートの底を介してプロットされます。 極値を決定するために、よく知られているジグザグインジケーターを適用します。 エントリーのサポートとレジスタンスに必要なプロパティを設定することができます。
ラインの縮尺はジグザグインジケーターのパラメータを使用して変更できますが、異なるタイムフレームに同じパラメータを適用することもできます。 これより、サポートとレジスタンスレベルを構築するために必要な極値を得ることができます。
下の画像は、時間枠の変化に伴って極値がどのように変化するかを示しています。 最初の画像は30分の期間を包含する分チャートを表示し、2番目は4時間です。
適切な極端を選択してレベルを構築
現在の価格の近くに位置する唯一のサポート/レジスタンスを構築するつもりです。 また、ラインが価格に収束する斜面を持つように、ダウントレンド中に前の極値以上の極値を使います。 最初のイメージでは、ポイント1-2-3-4-5-7、2番目は 1-1-2-3-6-7-8 になります。
ここでは、極値の選択基準を定義したので、コードに実装してみましょう。 主なポイントを明確にするために、ここでは部分的にのみ表示します。
//+------------------------------------------------------------------+ struct trade_points //極値の構造を定義する { double price; //価格 int pos; //場所、バーインデックス bool hpoint; //yes の場合 bool lpoint; //yes の場合、底 };
OnInit()関数内でジグザグインジケータのハンドルを作成する :
int() { ZZ_handle=iCustom(_Symbol,_Period,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep); return(INIT_SUCCEEDED); }
さらに、すべてのジグザグインジケーターの極値の値を1つずつソートすることにより、行列にデータをエントリーします。
double max=close[1]; double min=close[1]; int z=0; for(shift=0;shift<rates_total && !IsStopped();shift++) { CopyBuffer(ZZ_handle,0,shift,1,ZigzagBuffer); if(ZigzagBuffer[0]>0) { if(ZigzagBuffer[0]>=max && ZigzagBuffer[0]==high[shift]) { ArrayResize(mass,z+1); max=ZigzagBuffer[0]; mass[z].price=ZigzagBuffer[0]; mass[z].pos=shift; mass[z].hpoint=true; mass[z].lpoint=false; z++; } if(ZigzagBuffer[0]<=min && ZigzagBuffer[0]==low[shift]) { ArrayResize(mass,z+1); min=ZigzagBuffer[0]; mass[z].price=ZigzagBuffer[0]; mass[z].pos=shift; mass[z].lpoint=true; mass[z].hpoint=false; z++; } } }
トレンドラインを構築するための基準の定義
極値を持つ配列を形成した後、必要とするサポート/レジスタンスを構築することができます。 ラインを構築するための主な基準を定義する方法は、下の画像で説明されています。
ポイント1から、次のいずれかのポイントを介してラインを構築することができます。 しかしすべてのそのようなラインをサポート/レジスタンスの物として考慮することができません。 その上、関連性を失うことがあります。 チャート上の不必要なグラフィカルオブジェクトを取り除きたいので、冗長なラインを破棄して並べ替えを実行しましょう。
ラインの始点が A であると仮定します, 2 番目の極値は B であり、最後の足の近くのポイントは C です.
複数の条件があり、そのセットはさまざまな状況で絶えず変化しています。 基本的なものだけを考慮してみましょう。 将来的には、誰でも自分の裁量で、このインジケーターを向上させることができます。 主な基準は以下のとおりです。
- АB/BС 距離比率
- 価格が AB セグメントを越える回数
- 価格が BC セグメントを越える回数
- Сから現在の価格までの距離
- 最小ラインおよび最大ライン長さ
- ラインのトレンド
- レジスタンスの上または下の価格の場所
エントリー構成をよりよく理解するために、上記の基準を詳細に検討してみましょう。
- 許容比率を維持するために、Fibo 比を使用し、最小許容比率を0.25 または0.382 に設定します。 この基準に従って、長さの比率はАB/АС > = 02.25 (0.382) と BС/АС > = 02.25 (0.382) の条件に対応している必要があります。 便宜上、このパラメータの値をエントリーに設定します。
- すべての既存のラインも徹底的に価格が AB ラインを越える回数でソートする必要があります。 そのような検証を行う方法の多くのオプションがあります。 このラインを突破した閉じた足だけを考慮することができます。または高値/安値でブレイクを検討することができます。 この検証の2番目の基準は、この線分セグメントを越える足の数です。 パラメータはエントリーとしても行われます。
- ブレークスルーの数によってラインの重要性を評価することができます。 上記の基準のすべては、ラインを形成し、EAを開発する際のトレード戦略を形成するため両方を使用することができます。 このインジケーターでは、まだこのセグメントを越えていないラインのみが表示されます。
- 現在の価格から1位のラインまでの距離は、ラインの現在の関連性に応じてフィルタできます。 例えば、ラインだけをプロットすることができる距離は50-100 ポイントを超えていません。
- 今回の場合のラインの最小の長さはジグザグのインジケーターのエントリーによって定められるが、この変数はまた必要ならば監視することができます。 このインジケーターは、AB および BC セグメントの最小長をチェックします。
- サポートラインはポジションを開くために使用されるので、インジケーターは上昇トレンドのゼロまたは正のトレンドと下降トレンドのゼロまたは負のトレンドを持つラインを構築します。
- 2つの方法でラインを使用することができます。 最初に、トレンドの方向に切れ目のないラインとトレードを検討します。 2つ目に、反対方向のトレードを開始するためのトレンドラインのブレークスルーのみを使用します。 両方のタイプのラインは重要であるので、従って両方ともインジケーターに反映されるべきです。
下記は、トレンドのレジスタンスが形成されるコードの一部です。
//ラインが基準に一致するかどうかを判断し、行列に記入します。 for(j=z-1; j>=0; j--) { if(mass[j].hpoint) for(i=j-1; i>=0; i--) { if(mass[i].hpoint) if(i<j) { a=mass[j].pos; b=mass[i].pos; double ratio=double((a-b)*100/a); //AC 全長に対する AB セグメントの比率を定義 if(ratio>fibo && ratio<(100-fibo)) // 基準1が満たされているかどうかを定義、АB/BСセグメント比 if(b>Min_dist &&(a-b)>Min_dist) // 基準5が満たされているかどうかを定義、АB および BСセグメントの最小長 { ax=mass[j].price; bx=mass[i].price; coef=(ax-bx)/(a-b); price=close[1]; deviation=(ax+coef*bx)-price; cross_bc=0; cross_ab=0; if(MathAbs(deviation)<tolerance*_Point) // 基準4が満たされているかどうかを定義します (前の足の近くのポイント間距離) { //a 地点から b 地点までのクロス数 for(int n=a; n>b; n--) if((close[n]-(ax+coef*(b-n)))>0) cross_ab++; //b 地点から終点までのクロス数 for(int n=b-1; n>=0; n--) if(close[n]>(bx+coef*(b-n)) && close[n+1]<(bx+coef*(b-n+1))) cross_bc++; if(cross_bc<=Intersection_bc && cross_bc<=Intersection_ab)//条件2と3が満たされているかどうかを定義 { //ダウントレンドの行列 ArrayResize(DownTrend,y+1); DownTrend[y].a=a; DownTrend[y].b=b; DownTrend[y].ax=ax; DownTrend[y].bx=bx; DownTrend[y].dst=MathAbs(deviation); DownTrend[y].coef=coef; y++; } } } } } } //取得したマトリックスを使用して、チャートの下向きの線を表示します。 for(j=0; j<ArraySize(DownTrend); j++) { a=DownTrend[j].a; b=DownTrend[j].b; ax=DownTrend[j].ax; bx=DownTrend[j].bx; coef=DownTrend[j].coef; if(a>0 && b>0 && MathAbs(a-b)>0) { if(a>0 && b>0 && MathAbs(a-b)>0) { //トレンドラインを作成 TrendCreate(0,"DownTrend "+string(j),0,time[a],ax,time[b],bx,DColor,DStyle,DWidth,DBack,DSelection,DRayLeft,DRayRight,DHidden,DZOrder); ChartRedraw(); } }
インジケーターの構造の例:
トレーディングにおけるサポート/レジスタンスラインの使用
サポート/レジスタンスのレベルを適用する主要なトレードの原則は上昇トレンドの間にサポートラインの近くで買うことです (下降の間に売る) 。 グラフィカルなモデル (パターン) も同様に使用されます。
このトレード戦略は、金融商品がレンジであっても、または価格がパターンを形成するときに、トレンドの動きを活用することができます。 トレンドは、トレードの方向性を決定するのに役立ちます。 たとえば、現在のトレンドが下向きになっているが、その後レンジになる場合は、サポートレベルで買うのではなく、レジスタンスの近くに売りトレードを開くことが望ましい。 下降トレンドは売りトレードが買いよりチャンスを有することを意味します。 トレンドが上向きであり、三角形に続けば、この三角形のサポートラインの近くで買いの取引をすればよい。
オープニングトレンド-サポート/レジスタンスの近くに次のトレードは利益をもたらすかもしれませんが、価格はしばしば、レベルをブレイクします。 したがって、特定の金融商品については、このレベルの重要性の確認を待つ必要があります。 ラインで売り買う前に、価格の方向性が決まるまで待つ必要がある。 または、レベルからの価格のリバウンドを待って、その後だけトレードすることができます。
サポートラインからの買いのトレードをするとき、価格が近くで統合し、統合区域の高値を通した価格のブレイクの後で買いのオーダーをすることを待つことが適切です。 これは、レベルが実際に価格に影響を与えることを保証し、また、価格がレベルから (上) 必要な方向に移動を開始します。 これで、買いトレードを実行する必要があります。 同様の状況は、レジスタンスから売りトレードを開始するときに発生します。: レジスタンス領域の近くに統合を待つ必要があり、価格が位置的な安値に落ちるときにトレードします。
トレードするとき、ポジションを閉じるための条件をあらかじめ想定する必要があります。 サポートラインからの買いのトレードするとき、価格が強いレジスタンスに達する前にポジションを閉じることが良いでしょう。 売りトレードするときに同様の状況が発生します。 また、2次サポートレベル/レジスタンスレベルの情報で閉じることもできます。 サポートラインで買う場合は、昇順のトレンドチャンネルのレジスタンスレベルで売る必要があります。 また、レベルを介して価格がブレイクする場合は、より大きな利益を得るために試すことができます。 たとえば、三角形のサポートレベル (一般的な上向きのトレンド) から買う場合、価格が三角形を破り、移動を続けるまで、ポジションを保持することができます。 その後、次のレジスタンスで決済することがあります。
インジケーターベースのEA
インジケーターベースの EA
- ストップロスとテイクプロフィット
- 買い/売りオーダーの最大数
- トレーリングストップ
- ブレイクイーブン
- インジケーターシグナルによる反対トレードのクローズ
- 4つの HTF フィルタ (MACD、RSI は、WPR、MA) を選択する関数
このEA は、インジケータによって生成されたトレンドラインと直接連動します。 したがって、リアルタイムで動作するように同じチャート上で起動するようにインジケータが必要です。 インジケーターの設定は、インジケーター自体で構成されます。 このEA にはインジケーターの設定もありますが、テスト目的でのみ使用されます。 EAをテストするために、EAを初期化する際に定義されたインディケータハンドルがコード内に作成されました。
3つの EA 操作モードがあります。
- レベルから-トレンドラインからの潜在的な価格ロールバックの方向でのトレード。 足の高値または安値がレベルを越えた場合は、ポジションが開かれますが、終値は現在のトレンド線をブレイクせず、次の足の価格も同様にブレイクされずに閉じられます。 このEA は、触れた後でラインが価格によってブレイクされたかどうかを調べます。
- レベルの内訳-トレンドラインの潜在的なブレークスルーの方向にトレード。 足の高値または安値がレベルを越えた場合にはポジションが開かれ、終値は現在のトレンドラインをブレイクせず、次の足のロウソクはトレンドラインをブレイクして閉じた。
- all —上記で説明した両方のモードが使用されます。
買いと売りのシグナルが形成されているコード内の関数です。
//+------------------------------------------------------------------+ int signal() { int res=0; int MACD=0; int rsi=0; int wpr=0; int ma=0; if(Use_MACD==true)MACD=MACDS(); if(Use_rsi==true)rsi=rsiS(); if(Use_wpr==true)wpr=wprS(); if(Use_ma==true)ma=maS(); CopyOpen(NULL,0,1,3,O); CopyHigh(NULL,0,1,3,H); CopyLow(NULL,0,1,3,L); CopyClose(NULL,0,1,3,C); Signals=0; for(int i=0;i<ObjectsTotal(0,0,OBJ_TREND);i++) { string sName=ObjectName(0,i,0,OBJ_TREND); if(StringFind(sName,"UpTrend")==0 || StringFind(sName,"DownTrend")==0) { ax=ObjectGetDouble(0,sName,OBJPROP_PRICE,0); bx=ObjectGetDouble(0,sName,OBJPROP_PRICE,1); p1=(int)ObjectGetInteger(0,sName,OBJPROP_TIME,0); p2=(int)ObjectGetInteger(0,sName,OBJPROP_TIME,1); a=iBarShift(p1); b=iBarShift(p2); kkk=(bx-ax)/(a-b); lvl=bx+kkk*b; plvl=bx+kkk*(b-1); if(mode==0 || mode==2) { if(StringFind(sName,"UpTrend")==0 && L[1]<=plvl && C[1]>plvl && C[0]>lvl)Signals=1; if(StringFind(sName,"DownTrend")==0 && H[1]>=plvl && C[1]<plvl && C[0]<lvl)Signals=2; } if(mode==1 || mode==2) { if(StringFind(sName,"UpTrend")==0 && L[1]<=plvl && C[1]>plvl && C[0]<lvl)Signals=2; if(StringFind(sName,"DownTrend")==0 && H[1]>=plvl && C[1]<plvl && C[0]>lvl)Signals=1; } } } if(Signals==1 &&(MACD==1 || Use_MACD==false) && (rsi==1 || Use_rsi==false) && (wpr==1 || Use_wpr==false) && (ma==1 || Use_ma==false))res=1; if(Signals==2 &&(MACD==2 || Use_MACD==false) && (rsi==2 || Use_rsi==false) && (wpr==2 || Use_wpr==false) && (ma==2 || Use_ma==false))res=2; return(res); } //+------------------------------------------------------------------+
このテストでは、ロールバックトレードの収益性は、画期的なものに比べて低いことが示されています。
以下のエントリーで3つのモードをテストするテストチャートを以下に示します。
input string s="-------------------------------------------"; //主な設定 input int Magic=12345; input double LotSize=0.1; input int Slippage=30; //スリッページ、ポイント input int StopLoss=0; //ストップロス、ポイント input int TakeProfit=0; //テイクプロフィット、ポイント input int TrailingStart=0; //トレーリングスタート、ポイント input int TrailingStop= 0; //トレーリングストップ、ポイント input int TrailingStep= 0; //トレーリングストップのステップ、ポイント input int SL_prof=0; //スタートBE、ポイント input int SL_lev=0; //BE レベル、ポイント input int Buy_max=1; //最大買いオーダー input int Sell_max=1; //最大売りオーダー input bool Sig_close=true; //カウンタトランザクションを閉じる input tip mode=0; input string s0="-------------------------------------------"; //インジケーターの設定 input int _ExtDepth=12; input int _ExtDeviation=5; input int _ExtBackstep=3; input int _Min_dist=0; //最短距離 input int _fibo=30; //Fibo 比 input int _tolerance=200; //公差 input int _Intersection_ab=1; //点 a から点 b までのクロスの許容数 input int _Intersection_bc=1; //ポイント b からポイント c へのクロスの許可された数 input string s1="-------------------------------------------"; //MACD の設定 input ENUM_TIMEFRAMES MACD_tf=PERIOD_CURRENT; //期間 input int fast_ema_period=12; //高速 ma の期間 input int slow_ema_period=26; //長期 ma の期間 input int signal_period=9; //差異の平均の期間 input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; //価格の種類 input string s2="-------------------------------------------"; //RSI 設定 input ENUM_TIMEFRAMES rsi_tf=PERIOD_CURRENT; //期間 input int rsi_period=14; //期間 input ENUM_APPLIED_PRICE rsi_applied_price=PRICE_CLOSE; //価格の種類 input double rsi_max_s=100; //売りの最高値 input double rsi_min_s=70; //売りの最安値 input double rsi_max_b=30; //買いの最大価格 input double rsi_min_b=0; //買いの最安値 input string s3="-------------------------------------------"; //WPR の設定 input ENUM_TIMEFRAMES wpr_tf=PERIOD_CURRENT; //期間 input int calc_period=14; //期間 input double wpr_max_s=0; //売りの最高値 input double wpr_min_s=-20; //売りの最安値 input double wpr_max_b=-80; //買いの最大価格 input double wpr_min_b=-100; //買いの最安値 input string s4="-------------------------------------------"; //MA の設定 input ENUM_TIMEFRAMES ma_tf=PERIOD_CURRENT; //期間 input int ma_period=10; //MA の期間 input int ma_shift=0; //shift input ENUM_MA_METHOD ma_method=MODE_SMA; //スムージングの種類 input ENUM_APPLIED_PRICE ma_applied_price=PRICE_CLOSE; //価格の種類 input bool Use_MACD=true; //フィルタとして MACD を使用 input bool Use_rsi=false; //フィルタとして RSI を使用 input bool Use_wpr=false; //フィルタとして WPR を使用する input bool Use_ma=false; //フィルタとして MA を使用する input int sbar=1; //シグナル足 0-現在、1-終値
テスト中に、1つだけトレードの0.1 ロットのいずれかの方向に開かれた。 反対のシグナルの場合には、現在のトレードは決済し、反対のトレードが開きました。 MACD フィルターが適用された, 買いトレードがゼロ未満のインジケーター値で開かれたことを意味します。売りは、上記のインジケーター値で開かれました。 このテストは、2015-2017 に EURUSD H1 で実行されました。
レベルから:
レベルブレイクダウン:
以下に、複数の通貨ペアのデフォルト設定でのテスト結果を示します。
ここでは、良好な結果が EURUSD と USDCHF にのみ表示されていることがわかります。 まず第一に、すべてのラインがトレード時に考慮すべきではないという事実によるものです。 また、記事の冒頭に記載されている他の要因を考慮する必要があります。
さらに、重要なニュースのリリース後にサポート/レジスタンスが非常に頻繁に壊れているので、基礎分析の影響を念頭に置いておく必要があります。
したがって、EA にニュースフィルタを追加し、ニュースリリースの時点でのみ、ニュースの間に完全にトレードを無効にした後、両方のタスクをテストすることが可能です。 また、EA はレンコンチャートでも使用できます。
最適化
私の意見では、最初の7つのパラメータは、すでに最適な値を持っているので、さらにを最適化しません。 ジグザグパラメータはデフォルトで設定されており、ビットには適合しません。 最適化の際には、以前にテストしたすべての通貨に最も適したパラメータ値が次のように設定されている可能性があります。
- _ExtDepth=24;
- _ExtDeviation=55;
- _ExtBackstep=9;
最適化中にトレードを開くには、特定の金融商品に適した操作モードと、その結果に対するフィルタの影響の強さを定義しました。 唯一の MACD インジケーターは、フィルタとして使用されました。 しかし、別のタイムフレーム上の他のインジケーターを試すことができます。
反対のシグナルによって閉じる関数は、決済に使用された。 利益を修正し、最大の結果を得るために、損益とテイクプロフィット関数が使用されました。 各通貨の最適なパラメータは、関数のテスト中に決定されました。
ストップロスは使用されませんでした。 損失のトレードは、反対のシグナルによってのみ決済された。
最適化はテーブルに表示されます。 このテストは2017に0.1 のロットサイズで実行されました。 また、オープンの売買トレードの数は10に増加した、他のすべてのパラメータは、デフォルトで設定されていました。
シンボル | モード |
MACD フィルター | テイクプロフィット |
Start BE |
利益 |
プロフィットファクター: | リカバリーファクター: |
最大 DD、% |
合計トレード: | 利益トレード、% |
---|---|---|---|---|---|---|---|---|---|---|
EURUSD |
レベルの内訳 |
false |
0 |
25 |
117.20 |
1.88 |
1.65 |
0.69 |
79 |
73.42 |
USDCHF |
レベルの内訳 | false | 20 |
10 |
135.24 |
1.31 |
1.12 |
1.03 |
482 |
72.41 |
GBPCHF |
レベルから |
true |
20 |
10 |
91.56 |
1.39 |
0.51 |
1.58 |
246 |
91.06 |
AUDUSD |
レベルの内訳 | false | 20 |
10 |
139.20 |
1.39 |
1.66 |
0.79 |
485 |
71.96 |
AUDCAD |
レベルの内訳 | true | 25 |
5 |
117.51 |
1.94 |
1.06 |
0.57 |
246 |
84.96 |
EURJPY |
レベルの内訳 | false | 20 |
5 |
128.90 |
1.60 |
0.98 |
1.26 |
341 |
78.89 |
GBPUSD |
レベルから | false | 100 |
0 |
102.1 |
1.20 |
1.32 |
0.58 |
274 |
52.92 |
USDJPY |
レベルから | false | 30 |
0 |
147.75 |
1.56 |
0.79 |
1.73 |
348 |
79.89 |
EURGBP |
レベルから | true | 20 |
5 |
124.45 |
1.39 |
1.14 |
1.03 |
341 |
78.01 |
EURCHF |
レベルから | true | 20 |
5 |
141.08 |
2.07 |
1.88 |
0.68 |
367 |
63.22 |
USDCAD |
レベルの内訳 | false |
100 |
25 |
142.57 |
1.46 |
0.45 |
1.22 |
248 |
78.87 |
NZDUSD |
レベルから | false | 0 |
25 |
270.50 |
1.37 |
1.04 |
2.37 |
616 |
62.11 |
GBPJPY |
レベルの内訳 | true | 150 |
20 |
163.62 |
2.56 |
1.10 |
1.41 |
103 |
68.25 |
結論
この記事では、サポートラインとレジスタンスラインの自動構築の基本的な原則を考察しました。 この原則で EA を開発し、13の金融商品のエントリーを最適化するために使用されました。 特定の金融商品の最大の結果を得るには、その最適なパラメータを個別に選択する必要があります。 このEA は、基本的な関数と4つの HTF フィルタの数を持つ最適なパラメータを見つけるために開発されています。トレードを自動化し、サポート/レジスタンスでタスクを確認します。 このインジケーターと EA は、特定のニーズに応じて拡張および改善することができます。
ロールバックのトレードは、通貨の画期的なものよりも収益性が低いことが判明しました。 各金融商品は、個々のアプローチを必要とするように推移することを示しています。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/3215





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索