// // 包み陽線+下ひげ // // 〜.efuncというファイルに関数としてまとめておくと、$FUNC文を利用して // スクリーニングとバックテストの両方で同じ手法を使うことが簡単になります。 //--------------------各パラメータの意味の説明 // 底値判定パラメータ //  5日移動平均乖離率が-2以下を底値とする場合。 // int ma_days = 5; // 移動平均線の日数 // double maRate = -2; // 移動平均乖離率がこれ以下じゃないとだめ // 包み陽線判定パラメータ // 昨日と今日の終値と始値の差が今日の終値にたいして、この%以上ないと駄目。 // すなわちどれぐらい昨日を包んでいるかを決める。 // 1%というと、ちょっとだけ包んでいればOK。 // double tsutsumiRate = 1; // // 下ヒゲ判定パラメータ // 下ひげの長さが全体の長さの、この%以上を下ヒゲとみなす。 // double shitahigeRate = 10; //-------------------------------------------------------- // 移動平均乖離率インジケータをMARateという名前で使う宣言 $INDICATOR MARate $MARate bool Shitahige_Tsutsumi(int ma_days,double maRate,double tsutsumiRate,double shitahigeRate) { // 底値判定部分------------------------------- // 移動平均乖離率の移動平均日数をma_daysにする。 $MARate.MA.days = ma_days; // 今日の移動平均乖離率を求め、rに入れる。 double r = $MARate.MARate.Value(0); if( r > maRate ) return false; // 包み陽線の判定部分--------------------------- // 昨日、今日のいずれかで取引がないときはやめ。 if( Double.IsNaN(Close(-1)) ) return false; if( Double.IsNaN(Close(0)) ) return false; // 前日の始値と終値の小さいほうをl,大きいほうをhにする。 double l,h; if( Open(-1) > Close(-1) ) { l = Close(-1); h = Open(-1); } else { l = Open(-1); h = Close(-1); } if( Close(0) < Open(0) ) // 今日が陰線は違う。 return false; if( Close(0) <= h ) // 今日の終値がhより低いとだめ。 return false; if( Open(0) >= l ) return false; double h1 = h-l; // 昨日の実幅 double h0 = Close(0)-Open(0); // 今日の実幅 double diff = h0-h1; r = diff/Close(0)*100; if( r < tsutsumiRate ) return false; //実幅差が 指定%以上ない。 // 下ひげ判定部分--------------------------------- //  すでにClose(0)>Open(0)、すなわち陽線とわかっている。 double hc = High(0)-Close(0); // 上ひげの長さ double ol = Open(0)-Low(0); // 下ひげの長さ double hl = High(0)-Low(0); // 全体の長さ // 上ヒゲの長さが下ひげ長さの半分以上はだめ if( hc*2 > ol ) return false; // 下ひげの長さが、全体の長さの5%以下はだめ if( hl*shitahigeRate/100 > ol ) return false; return true; }