真偽値をうまく使うことで様々な条件式を表現できる
タイトル見ても何のことかよくわからないと思いますので、例を用いて説明します。
トレード戦略を考える際に、ある2つの値(インジケーター等)のうち、値1が0を越えたら○○する、値2が0を越えたら○○する、どちらかが0を超えたら○○する、両方とも0を超えたら○○する、そもそもこの条件は使わない、と表現したいことがあると思います。
※”0を越えたら”の部分は他の文言に置き換えても構いません。
どのパターンが最も適しているか分からない時は、全パターンで試してみたくなるものです。
その時、1つのパターンをプログラミングしてはテストして、だと非効率ですし、機能としても決め打ちとなるため、汎用性に欠けます。
そこで、上記の条件式をうまく表現できる方法をご紹介します。
// ・・・
extern string Note = "0を越えているのは、1:val1 2:val2 3:va1 or val2 4:val1 and val2 0:このインジケーターは使わない";
extern int Val_Kbn = 3;
// ・・・
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// ・・・
double val1 = NormalizeDouble(iCustom(NULL, 0, "インジケーター名", ,.., 0, 1), Digits);
double val2 = NormalizeDouble(iCustom(NULL, 0, "インジケーター名", ,.., 1, 1), Digits);
bool val1_Flg = false;
bool val2_Flg = false;
// このインジケーターは使わない
if(Val_Kbn == 0){
val1_Flg = true;
val2_Flg = true;
// val1が0を越えている場合
}else if(Val_Kbn == 1){
if(val1 > 0.0){
val1_Flg = true;
}
val2_Flg = true;
// val2が0を越えている場合
}else if(Val_Kbn == 2){
val1_Flg = true;
if(val2 > 0.0){
val2_Flg = true;
}
// val1かval2のどちらかが0を越えている場合
}else if(Val_Kbn == 3){
if(val1 > 0.0 || val2 > 0.0){
val1_Flg = true;
val2_Flg = true;
}
// val1とval2の両方が0を越えている場合
}else if(Val_Kbn == 4){
if(val1 > 0.0){
val1_Flg = true;
}
if(val2 > 0.0){
val2_Flg = true;
}
}
if(val1_Flg && val2_Flg){
// 仕掛け等のアクション
}
// ・・・
}
Val_KbnをEAのパラメータにしておき、その値で条件式を制御しています。条件が成立したら、フラグを立てます(真偽値を真trueにします)。
- 0の場合:インジケーターを使わないので、無条件で条件が成立します。
- 1の場合:val1が0を越えると条件が成立します。val2は無視です。
- 2の場合:val2が0を越えると条件が成立します。val1は無視です。
- 3の場合:val1かval2のどちらかが0を越えると条件が成立します。
- 4の場合:val1とval2の両方が0を越えると条件が成立します。
条件の厳しさで言うと、左から厳しい順で「(厳)4 > 1 = 2 > 3 > 0(緩)」となります。
最後のif(val1_Flg && val2_Flg)は、val1とval2のフラグが両方とも立っている場合のみ、仕掛け等のアクションを行うことを意味します。
両方のフラグを必ず見るため、0~2の場合は、無視している値については強制的にフラグを立てていることに注目してください。
