解決済み

複数のカスタムインジケーターを使ったエントリー

2025/01/11 21:44
41

お世話になっております。初めて投稿させていただきます。
カスタムインジケーターを5つ自分で作成したのですが、画像のようなローソク足何本以内に3つ同じ方向のサインが出ていたらエントリーするEAを作りたいのです。またほかの要素にパラボリックを設定して買いの方向に逆行しているならエントリーしない、サインが3つ出てエントリーしているなら決済にパラボリックを使用したいと思っております。
複数のサインをローソク足何本以内に同じ方向に3つでたらエントリーという形はEAつくーるで作成可能でしょうか?

自分で作成したインジケーターはシンプルなもので2つは2本のMAのクロスと3つはMACDのシグナル0クロスのようなものです。
ご教授よろしくお願いいたします。

ezyzip.zip

コメント

GogoJungle
2025/01/15 16:30

はじめまして!ご利用いただきありがとうございます。

ご提案いただいた条件はEAつくーるの機能のみでも作成可能であると存じますが、あまり現実的でないかもしれません。

条件

「A,B,C,D,Eの5つのインジケーターのうち少なくとも3つのインジケーターについて、直近3本以内(0本前、1本前、2本前)のいずれかのタイミングでサインが出た場合にエントリーする」という条件を考えます。

方法

カスタムインジケーターのサインの検知

まず、あるインジケーターについて、n本前の時点でサインが出たことを検知するための条件は

カスタムインジケーター(n本前) > 数値(0)
AND
カスタムインジケーター(n本前) < 数値(99999)

とします。99999の部分は十分大きな値であれば何でも構いません。

以下の画像の[条件1][条件2]が1セットで、「カスタムインジケーターtest_indicatorが1本前にサインを出していた」となります。
「パラメータ」の部分は、「+」マークを押してカスタムインジケーターが必要とするパラメータの数だけ入力欄を増やしてご入力ください。

LABO_2053_1.png
LABO_2053_2.png
LABO_2053_3.png

「少なくとも3つ」という条件を作成する

ローソク足の位置をl,m,n、インジケーターの名前をX,Y,Zとします。
「l本前のX」「m本前のY」「n本前のZ」の3つのサインが出ていることを検知する条件は、

l本前のX > 数値(0)
AND
l本前のX < 数値(99999)
AND
m本前のY > 数値(0)
AND
m本前のY < 数値(99999)
AND
n本前のZ > 数値(0)
AND
n本前のZ < 数値(99999)

・・・☆

となります。
さてここで、l,m,nとX,Y,Zの選び方は
l,m,n → 0,1,2の3通りがX,Y,Zそれぞれの選択肢に対して存在するので3^3 = 27通り
X,Y,Z → 5個のインジケーターの中から3個を選択するので5 * 4 * 3 / (3 * 2 * 1) = 10通り
となります。

すなわち、☆の塊のl,m,n,X,Y,Zに対応する0,1,2とA,B,C,D,Eを適用した270通りの条件を「条件追加(OR)」で用意すれば、「少なくとも3つ」という条件をご作成いただけます。

代替案

以上の方法がEAつくーるのみで作成する方法ですが、かなり労力がかかるため現実的ではないと考えられます。
ソースコードの修正が可能な場合は下記を参考に修正してみるのもよいかもしれません。

※検証は行っておりませんので、あくまで参考までにお願いいたします。

変数の準備

「直近〇本」という許容期間を設定するための変数と、各インジケーターのサインの状況、各インジケーターのサインが出た際のバー数を保存するための変数を用意します。

input int Magic1 = 1;などが書いてある部分の下に追加するとよいでしょう。

input int TolerancePeriod = 3; // 許容期間

int isIndicatorA = 0;
int isIndicatorB = 0;
int isIndicatorC = 0;
int isIndicatorD = 0;
int isIndicatorE = 0;

int barsIndicatorA = 0;
int barsIndicatorB = 0;
int barsIndicatorC = 0;
int barsIndicatorD = 0;
int barsIndicatorE = 0;

判定処理の作成

OnTick関数内のif(signal != 0 && getOpenLots(Magic1) == 0)が記載してある行の直前に、下記のようなコードを作成します。
(※繰り返しとなりますが、検証は行っておりませんので、あくまで参考までにお願いいたします。)

// カスタムインジケーターの値を取得
// この部分はEAつくーるの取引条件で「カスタムインジケーター」を選択して出力したコードからコピペすると楽かもしれません。
   double indicatorA = iCustom(Symbol(), 0, "A", 0, 0);
   double indicatorB = iCustom(Symbol(), 0, "B", 0, 0);
   double indicatorC = iCustom(Symbol(), 0, "C", 0, 0);
   double indicatorD = iCustom(Symbol(), 0, "D", 0, 0);
   double indicatorE = iCustom(Symbol(), 0, "E", 0, 0);

// カスタムインジケーターAに関する処理
   if (indicatorA > 0 && indicatorA < 99999) {
      isIndicatorA = 1; // Aが条件を満たしている
      barsIndicatorA = Bars; // Aが条件を満たしたバー数を記録
   } else {
      if (isIndicatorA) {
         if (Bars - barsIndicatorA >= TolerancePeriod) { // Aが条件を満たさなくなってから許容期間を超過した場合
            isIndicatorA = 0; // フラグをリセット
         }
      }
   }

// カスタムインジケーターBに関する処理
   if (indicatorB > 0 && indicatorB < 99999) {
      isIndicatorB = 1; // Bが条件を満たしている
      barsIndicatorB = Bars; // Bが条件を満たしたバー数を記録
   } else {
      if (isIndicatorB) {
         if (Bars - barsIndicatorB >= TolerancePeriod) { // Bが条件を満たさなくなってから許容期間を超過した場合
            isIndicatorB = 0; // フラグをリセット
         }
      }
   }

// C,D,Eに関しても同様の処理を記載

// ・
// ・
// ・


// エントリーの判定
// フラグの合計が3以上(つまり3つ以上のインジケーターのサインが出現した)場合はエントリーのシグナルを設定する
   if (isIndicatorA + isIndicatorB + isIndicatorC + isIndicatorD + isIndicatorE >= 3) {
      signal = 1;
   } else {
      signal = 0;
   }

以上でございます。
長くなりましたが、ご提示いただいた条件の作成は、少し、難しいものであると存じます。

完全な答えのご提供ができずご不便おかけしますが、ご参考になりましたら幸いでございます。

たまお
2025/01/15 22:11

丁寧なご回答ありがとうございます。こちらの知識がないため理解できてない事が多いのですが、AI等に助けてもらいつつご助言頂いたことを足して工夫してみます。ありがとうございました!

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。