MQL4・EA開発ノート-ピンバー判定について-


はじめに

皆さんこんにちは!
今日はEA開発におけるピンバーの判定方法について執筆させて頂きます。

まずはじめに、ピンバーとは何かをお伝えさせて頂きます。
ピンバーとは、ローソク足チャート上において現れる買いと売りの均衡状態が崩れ始めた時に出やすいローソク足のプライスアクションです。
主に長い下ひげや上ひげが出現し、一度価格が下がった(上がった)にもかかわらず買いや売りの形勢の逆転によって、価格を戻しきった時などによく出現します。

さて、このピンバーですが、EAの開発において、ピンバーの判定を行いたい時があります。その時どのようなコードを書けばいいか分からないという方の為にピンバーの判定のコードを載せたいと思います。ご注意点としましては、開発経験がそこまで長くない著者が作ったコードですので、間違いや無駄なコードなどが含まれている場合があります。また、このコードを使って取引した結果被った損害等に関しては、保証できませんのでご注意下さい。以上のことをご留意頂いた上でコードのご使用をいただければと思います。

まずは本題であるコードを載せます。

実際のソースコード

-----------------------ここから-------------------------

//外部変数の設定
extern string PinBarSettings = "PinBarの設定";//PinBarの設定
extern double PinBarRatio = 2;//ローソク足実体に対するひげの倍率
extern double PinBarBeardRatio = 2;//PinBar側のひげと逆側のひげの比率
extern int DifferenceAveragePeriod = 20;//ローソク足実体の平均期間
extern double DAUpperRatio = 5;//実体平均期間に対する上限比率
extern double DALowerRatio = 1;//実体平均期間に対する下限比率

//ピンバー判定処理部分
  double ClosePrice = iClose(Symbol(),0,1);
  double OpenPrice = iOpen(Symbol(),0,1);
  double HighPrice = iHigh(Symbol(),0,1);
  double LowPrice = iLow(Symbol(),0,1);
  bool PlusIsPinBarUp = false;
  bool PlusIsPinBarDown = false;
  bool MinusIsPinBarUp = false;
  bool MinusIsPinBarDown = false;
  //ローソク足実体の平均値算出
  double AverageDifference = 0;
  for(int i=1;i<=DifferenceAveragePeriod;i++){
     double Difference = 0;
     Difference = MathAbs(iClose(Symbol(),0,i)-iOpen(Symbol(),0,i));
     AverageDifference = AverageDifference + Difference;
  }
  AverageDifference = AverageDifference/DifferenceAveragePeriod;
  //PinBar判定開始
  if(OpenPrice < ClosePrice){
  //陽線の場合の処理
     if(MathAbs(ClosePrice-OpenPrice)*PinBarRatio <= MathAbs(OpenPrice-LowPrice)
     && MathAbs(OpenPrice-LowPrice) >= MathAbs(HighPrice-ClosePrice)*PinBarBeardRatio
     && MathAbs(ClosePrice-OpenPrice) > AverageDifference*DALowerRatio && MathAbs(ClosePrice-OpenPrice) < AverageDifference*DAUpperRatio){
        PlusIsPinBarUp = true;
     }
     if(MathAbs(ClosePrice-OpenPrice)*PinBarRatio <= MathAbs(HighPrice-ClosePrice)
     && MathAbs(OpenPrice-LowPrice)*PinBarBeardRatio <= MathAbs(HighPrice-ClosePrice)
     && MathAbs(ClosePrice-OpenPrice) > AverageDifference*DALowerRatio && MathAbs(ClosePrice-OpenPrice) < AverageDifference*DAUpperRatio){
        PlusIsPinBarDown = true;
     }
  }else if(OpenPrice > ClosePrice){
  //陰線の場合の処理
     if(MathAbs(OpenPrice-ClosePrice)*PinBarRatio <= MathAbs(ClosePrice-LowPrice)
     && MathAbs(HighPrice-OpenPrice)*PinBarBeardRatio <= MathAbs(ClosePrice-LowPrice)
     && MathAbs(OpenPrice-ClosePrice) > AverageDifference*DALowerRatio && MathAbs(OpenPrice-ClosePrice) < AverageDifference*DAUpperRatio){
        MinusIsPinBarUp = true;
     }
     if(MathAbs(OpenPrice-ClosePrice)*PinBarRatio <= MathAbs(HighPrice-OpenPrice)
     && MathAbs(HighPrice-OpenPrice) >= MathAbs(ClosePrice-LowPrice)*PinBarBeardRatio
     && MathAbs(OpenPrice-ClosePrice) > AverageDifference*DALowerRatio && MathAbs(OpenPrice-ClosePrice) < AverageDifference*DAUpperRatio){
        MinusIsPinBarDown = true;
     }
  }
  

-----------------------ここまで-------------------------

コード説明

コードのご説明を簡単にさせて頂きます。


判定処理のはじめでは、ローソク足の実体部分の平均を算出しています。これは後でピンバーのフィルタリングに使用する為の値です。

ピンバーの判定開始の処理では、まず最初に、(OpenPrice < ClosePrice)の部分で陽線判定・陰線判定の分岐処理を行っています。

次にその中のif文処理の中を見ていきましょう。
MathAbs(ClosePrice-OpenPrice)*PinBarRatio <= MathAbs(OpenPrice-LowPrice)の部分では実体とピンバー部分のひげの長さの比率のフィルタリングを行っています。
MathAbs(OpenPrice-LowPrice) >= MathAbs(HighPrice-ClosePrice)*PinBarBeardRatioの部分では上ひげと下ひげの比率の計算を行っています。これにより、ピンバーであっても、上ひげ下ひげの長さがほぼ一緒のような場合を排除できます。
 MathAbs(ClosePrice-OpenPrice) > AverageDifference*DALowerRatio && MathAbs(ClosePrice-OpenPrice) < AverageDifference*DAUpperRatioの部分では、実体の平均値に対して、平均の何倍までの実体の長さまでなら許容するかを設定できます。

最終、陽線の上昇ピンバー、陽線の下降ピンバー、陰線上昇のピンバー、陰線の下降ピンバーの判定をtrue・falseで返します。

外部変数の設定値を変えることによって、ピンバーの検出頻度を上げたり、だましを少なくするなどの操作も可能かと思います。

以上が今回のコードとなります。
今回のコード紹介は如何でしたか?
お気に召して頂ければ、また、お気に入りやサポートなどして頂ければ励みになります。

この記事が気に入ったらサポートをしてみませんか?