ブログタイトルを「FX自動売買システム開発部」から「autoFX」に変更しました!

2つの値の片方が条件を満たした場合か両方が満たした場合か

真偽値をうまく使うことで様々な条件式を表現できる

タイトル見ても何のことかよくわからないと思いますので、例を用いて説明します。

トレード戦略を考える際に、ある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の場合は、無視している値については強制的にフラグを立てていることに注目してください。

MQL4プログラミングの最新記事8件

>完全放ったらかしEA 「AutoEndlessCatchRange」

完全放ったらかしEA 「AutoEndlessCatchRange」

「本業が忙しい!」「でも資産運用したい!」そんなあなたに最適なEAです。兼業トレーダーの方はチャートを毎日みて分析してトレードする時間はなかなか確保できないものです。トレードは本EAに任せて、本業やプライベートの時間をもっと増やしませんか?元々は自分自身のために開発したEAですので、手抜き無しのガチものです。

CTR IMG