タイトルが入力されていません。
コンテンツがありません。
There have no category
There have no subcategory
zigzagのリペイントしない過去の高値、安値を使ってロジックを組みたいのですが、 可能でしょうか?
例えば、何番目前の高値、安値みたいに条件を設定できるインジケーターを導入して もらえたらありがたいのですが、
zigzagの確定済みの過去高値・安値を使ってEAロジックを組みたい、というご質問ですね。
残念ながら、EAつくーるの機能のみでは「ZigZagの何番目前の高値・安値」を直接指定して条件に使うことは難しいです。
EAつくーるの「取引条件」では、カスタムインジケーターの値を参照することは可能ですが、ZigZagのように「直近から数えて何個目の山・谷を取得する」という処理は、通常の「計算位置:何本前」とは考え方が異なります。
たとえば「10本前のZigZag値」は指定できても、「2個前のZigZag高値」「3個前のZigZag安値」のような指定は、EAつくーる標準機能だけでは行えません。
EAつくーるの機能のみでは「ZigZagの何番目前の高値・安値」を直接取得することはできませんが、出力されたコードを改造することで実現可能であると存じます。 修正方法を考えてみましたので提案させていただきます。
【準備】
まずEAつくーる側では、仮のエントリー条件を設定してEAを作成してください。 例として、初期状態に近い以下のような条件で問題ありません。
ローソク足 = ローソク足 ↓ 買いエントリー
その後、出力されたmq4ファイルをMetaEditorで開き、ZigZagの過去高値・安値を取得する処理を追加します。
【修正方法】
まず、コード内で以下を検索してください。
double PriceToPipsWithSymbol(double value, string symbol)
この関数より下あたりに、次の関数を追加します。
【修正後】
double getZigZagHigh(int zigzagIndex, int depth = 12, int deviation = 5, int backstep = 3) { int count = 0; for(int i = 3; i < Bars; i++) { double zz = iCustom(Symbol(), 0, "ZigZag", depth, deviation, backstep, 0, i); if(zz != 0 && MathAbs(zz - iHigh(Symbol(), 0, i)) < Point * 10) { count++; if(count == zigzagIndex) return(zz); } } return(0); } double getZigZagLow(int zigzagIndex, int depth = 12, int deviation = 5, int backstep = 3) { int count = 0; for(int i = 3; i < Bars; i++) { double zz = iCustom(Symbol(), 0, "ZigZag", depth, deviation, backstep, 0, i); if(zz != 0 && MathAbs(zz - iLow(Symbol(), 0, i)) < Point * 10) { count++; if(count == zigzagIndex) return(zz); } } return(0); }
次に、エントリー条件部分を修正します。 コード内で以下を検索してください。
【修正前】
if(iClose(Symbol(), 0, 0)+PipsToPrice(0) == iClose(Symbol(), 0, 0)+PipsToPrice(0)) signal = 1;
たとえば「現在価格が直近の確定ZigZag高値を上抜けたら買い」という条件にする場合は、以下のように変更します。
double zigzagHigh1 = getZigZagHigh(1); if(zigzagHigh1 > 0 && Ask > zigzagHigh1) signal = 1;
また、「現在価格が直近の確定ZigZag安値を下抜けたら売り」にする場合は、以下のようにします。
double zigzagLow1 = getZigZagLow(1); if(zigzagLow1 > 0 && Bid < zigzagLow1) signal = -1;
「2番目前のZigZag高値」を使いたい場合は、次のように指定します。
double zigzagHigh2 = getZigZagHigh(2);
「3番目前のZigZag安値」を使いたい場合は、次のように指定します。
double zigzagLow3 = getZigZagLow(3);
【注意点】
ZigZagは性質上、直近の山・谷が後から変わることがあります。 そのため、リペイントを避けたい場合は、現在足や直近すぎる値を使わず、ある程度過去の確定した山・谷を使う必要があります。
上記サンプルでは for(int i = 3; i < Bars; i++) としており、現在足・1本前・2本前を避けて検索しています。 より安全にしたい場合は、i = 5 や i = 10 から検索する形に変更してください。
for(int i = 3; i < Bars; i++)
i = 5
i = 10
例:
for(int i = 10; i < Bars; i++) {
このようにすると、より過去のZigZag値だけを対象にできます。
なお、ご要望の「何番目前のZigZag高値・安値を条件に使えるインジケーター」につきましては、EAつくーる側の標準項目としては現在対応しておりません。 対応する場合は、カスタムインジケーター側で「直近高値」「2個前の高値」「直近安値」「2個前の安値」などを別々のバッファとして出力し、EAつくーるの「カスタムインジケーター」で参照する方法が比較的扱いやすいです。
コメント文がありません。
zigzagの確定済みの過去高値・安値を使ってEAロジックを組みたい、というご質問ですね。
残念ながら、EAつくーるの機能のみでは「ZigZagの何番目前の高値・安値」を直接指定して条件に使うことは難しいです。
EAつくーるの「取引条件」では、カスタムインジケーターの値を参照することは可能ですが、ZigZagのように「直近から数えて何個目の山・谷を取得する」という処理は、通常の「計算位置:何本前」とは考え方が異なります。
たとえば「10本前のZigZag値」は指定できても、「2個前のZigZag高値」「3個前のZigZag安値」のような指定は、EAつくーる標準機能だけでは行えません。
EAつくーるの機能のみでは「ZigZagの何番目前の高値・安値」を直接取得することはできませんが、出力されたコードを改造することで実現可能であると存じます。
修正方法を考えてみましたので提案させていただきます。
【準備】
まずEAつくーる側では、仮のエントリー条件を設定してEAを作成してください。
例として、初期状態に近い以下のような条件で問題ありません。
その後、出力されたmq4ファイルをMetaEditorで開き、ZigZagの過去高値・安値を取得する処理を追加します。
【修正方法】
まず、コード内で以下を検索してください。
この関数より下あたりに、次の関数を追加します。
【修正後】
次に、エントリー条件部分を修正します。
コード内で以下を検索してください。
【修正前】
たとえば「現在価格が直近の確定ZigZag高値を上抜けたら買い」という条件にする場合は、以下のように変更します。
【修正後】
また、「現在価格が直近の確定ZigZag安値を下抜けたら売り」にする場合は、以下のようにします。
「2番目前のZigZag高値」を使いたい場合は、次のように指定します。
「3番目前のZigZag安値」を使いたい場合は、次のように指定します。
【注意点】
ZigZagは性質上、直近の山・谷が後から変わることがあります。
そのため、リペイントを避けたい場合は、現在足や直近すぎる値を使わず、ある程度過去の確定した山・谷を使う必要があります。
上記サンプルでは
for(int i = 3; i < Bars; i++)としており、現在足・1本前・2本前を避けて検索しています。より安全にしたい場合は、
i = 5やi = 10から検索する形に変更してください。例:
このようにすると、より過去のZigZag値だけを対象にできます。
なお、ご要望の「何番目前のZigZag高値・安値を条件に使えるインジケーター」につきましては、EAつくーる側の標準項目としては現在対応しておりません。
対応する場合は、カスタムインジケーター側で「直近高値」「2個前の高値」「直近安値」「2個前の安値」などを別々のバッファとして出力し、EAつくーるの「カスタムインジケーター」で参照する方法が比較的扱いやすいです。