//+------------------------------------------------------------------+
//|                                                  LousokuMark.mq4 |
//|                                  Copyright(c) 2010 Masaru Sasaki |
//|                                                                  |
//+------------------------------------------------------------------+
//
// 「禁止事項」
//  *このプログラムソースコードをそのまま流用したソフトの販売等を
//   一切禁止致します。
// 
// 「免責事項」
//  *このプログラムに基づく行為の結果発生した障害、損失などについて
//    著作者は一切の責任を負いません。
//
// 「説明」
//  *動いているローソク足現在値の１つ前と２つ前のローソク足形状にて
//   酒田五法を用いた判定をしています。
//   ただし、長い上ひげ、長い下ひげ、については標準設定でオフに
//   しています。
//   理由としては、何pips以上を長いと感じるのに対して個人差が大きい為です。
//   判定結果は、標準設定では、Expertsタブに表示しています。
//   1以外の数値（例：2）設定で、チャートの左上に表示します。
//   ローソク足のみでの判定ですので、最高値、最安値位置の出現判定
//   をしておりません。
//   移動平均線やRSI等の他の指標と組み合わせてご使用下さい。
//   ちなみに、酒田五法のローソク足が覚えきれないので作成しました。^^;
//
//
// 参考書籍：FXメタトレーダー入門 (PanRolling)
//           ちゃんと儲けたい人の株価チャート分析大全  (自由国民社)
//           ここまで使えるローソク足チャート (日本経済新聞社)
//
#property copyright "Copyright(c) 2010 Masaru Sasaki"
#property link      "http://www.metaquotes.net"

#property indicator_chart_window

// ローソク足判定結果表示位置
#define PRN_EXPERTS 1  // Expertsタブ
#define PRN_COMMENT 2  // チャート左上


// 長い上ひげ on/off フラグ
extern bool Hige_ue_long_flag = false;

// 長い上ひげサイズ指定 pips
extern int Hige_ue_long_size = 20;

// 長い下ひげ on/off フラグ
extern bool Hige_sita_long_flag = false;

// 長い下ひげサイズ指定 pips
extern int Hige_sita_long_size = 20;

// ローソク足判定結果表示位置の選択  標準設定：Expertsタブ
extern int SELECT_PRN = PRN_EXPERTS;




//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();

      bool buyLousokuMark = false, sellLousokuMark = false;
      string s1hantei = "ローソク判定--> ";
      string s2hantei = "";
       
      if( Close[2] > Open[2] && Close[1] < Open[1] && Close[2] > Open[1] && Open[2] < Close[1] ){
          sellLousokuMark = true;
          s2hantei = "陰のはらみ線でした。";
      }
      else if( Close[2] > Open[2] && Close[1] < Open[1] && Close[2] < Open[1] && Open[2] > Close[1] ){
          sellLousokuMark = true;
          s2hantei = "陰のつつみ線でした。";
      }
      else if( Close[3] < Open[3] && Close[2] < Open[2] && Close[1] < Open[1] && Close[3] > Close[2] && Close[2] > Close[1]){
          sellLousokuMark = true;
          s2hantei = "三羽ガラスでした。 相場の転換点又は、";
      }
      else if( Close[2] > Open[2] && Close[1] < Open[1] && Close[2] == Close[1] && Close[2] < Open[1] ){
          sellLousokuMark = true;
          s2hantei = "出会い線でした。";
      }
      else if( Close[2] > Open[2] && Close[1] < Open[1] && Close[2] < Open[1] && Close[2] > Close[1] && Open[2] < Close[1] ){
          sellLousokuMark = true;
          s2hantei = "かぶせ線でした。";
      }
      else if( Close[2] > Open[2] && Close[1] < Open[1] && Close[2] > Open[1] && Open[2] < Open[1] && Open[2] > Close[1] ){
          sellLousokuMark = true;
          s2hantei = "たすき線でした。";
      }
      else if( Close[2] > Open[2] && Close[1] < Open[1] && Open[2] == Open[1] ){
          sellLousokuMark = true;
          s2hantei = "振り分け線でした。";
      }
      else if( Close[2] > Open[2] && Close[1] > Open[1] && Close[1] == High[1] && Open[1] > Low[1] ){
          sellLousokuMark = true;
          s2hantei = "陽のカラカサ線でした。";
      }
      else if( Close[2] > Open[2] && Close[1] < Open[1] && Open[1] == High[1] && Close[1] > Low[1] ){
          sellLousokuMark = true;
          s2hantei = "陰のカラカサ線でした。";
      }
      else if( Close[2] < Open[2] && Close[2] < Close[1] && Open[2] > Open[1] && Close[1] == Open[1] ){
          buyLousokuMark = true;
          s2hantei = "陰の寄引同時線はらみ足でした。";
      } 
      else if( Close[2] < Open[2] && Close[1] > Open[1] && Open[2] > Close[1] && Close[2] < Open[1] ){
          buyLousokuMark = true;
          s2hantei = "陽のはらみ線でした。";
      }
      else if( Close[2] < Open[2] && Close[1] > Open[1] && Open[2] < Close[1] && Close[2] > Open[1] ){
          buyLousokuMark = true;
          s2hantei = "陽のつつみ線でした。";
      }
      else if( Close[3] > Open[3] && Close[2] > Open[2] && Close[1] > Open[1] && Close[3] < Close[2] && Close[2] < Close[1]){
          buyLousokuMark = true;
          s2hantei = "赤三兵でした。 相場の転換点又は、";
      }
      else if( Close[2] < Open[2] && Close[1] > Open[1] && Close[2] == Close[1] && Close[2] > Open[1] ){
          buyLousokuMark = true;
          s2hantei = "出会い線でした。";
      }
      else if( Close[2] < Open[2] && Close[1] > Open[1] && Close[2] < Open[1] && Open[2] > Open[1] && Open[2] < Close[1] ){
          buyLousokuMark = true;
          s2hantei = "たすき線でした。";
      }
      else if( Close[2] < Open[2] && Close[1] > Open[1] && Open[2] == Open[1] && Open[2] < Close[1] ){
          buyLousokuMark = true;
          s2hantei = "振り分け線でした。";
      }
      else if( Close[2] < Open[2] && Close[1] > Open[1] && Low[2] > Open[1] && (((Open[2] - Close[2])/2)+Close[2]) < Close[1] ){
          buyLousokuMark = true;
          s2hantei = "切り込み線でした。";
      }
      else if( Close[1] == Open[1] ){
          buyLousokuMark = true; sellLousokuMark = true;
          s2hantei = "寄引同時線でした。相場の転換点か？";
      }
      else if( Hige_ue_long_flag == true ){
            double lusize = Hige_ue_long_size * Point;
            if( Close[1] > Open[1] && (High[1] - Close[1]) >= lusize ){
                sellLousokuMark = true;
                s2hantei = "陽線の長い上ひげでした。";
            }
            if( Close[1] < Open[1] && (High[1] - Open[1]) >= lusize ){
                sellLousokuMark = true;
                s2hantei = "陰線の長い上ひげでした。";
            }
      }
      else if( Hige_sita_long_flag == true ){
            double lssize = Hige_sita_long_size * Point;
            if( Close[1] < Open[1] && (Close[1] - Low[1]) >= lssize ){
                buyLousokuMark = true;
                s2hantei = "陰線の長い下ひげでした。";
            }
            if( Close[1] > Open[1] && (Open[1] - Low[1]) >= lssize ){
                buyLousokuMark = true;
                s2hantei = "陽線の長い下ひげでした。";
            } 
      }
      else {
          // ローソク判定不可
          sellLousokuMark = false; buyLousokuMark = false;
          s1hantei = "ローソク判定できませんでした。"; s2hantei = "";

      }
      
      // ローソク判定結果を表示。 
      if( sellLousokuMark == true && buyLousokuMark == false)
      {
         if( SELECT_PRN == PRN_EXPERTS )
            Print(s1hantei+s2hantei+"最高値圏なら売りシグナル");
         else
            Comment(s1hantei+s2hantei+"最高値圏なら売りシグナル");
      }
      else if( buyLousokuMark == true && sellLousokuMark == false)
      {
         if( SELECT_PRN == PRN_EXPERTS )
            Print(s1hantei+s2hantei+"最安値圏なら買いシグナル");
         else
            Comment(s1hantei+s2hantei+"最安値圏なら買いシグナル");
      }
      else
      {
         if( SELECT_PRN == PRN_EXPERTS )
            Print(s1hantei+s2hantei);
         else
            Comment(s1hantei+s2hantei);
      }
           
   return(0);
  }
//+------------------------------------------------------------------+