解決済み

違う時間足のMACDを適用

EAつくーる
はやうち太郎
2025/03/16 13:20
84

教えてください。15分足のエントリー条件に「4H足のMACDが連続で上昇している」を加えることは可能でしょうか?
▽15分足での買いエントリーの条件
2本前のMACD終値≦1本前のMACD終値≦0本前のMACD終値 
※全て4H足のMACD終値

コメント

GogoJungle
2025/03/19 19:16

可能でございます。
MACDの「時間足」にて「4時間足」をご設定ください
LABO_2135_1.png

はやうち太郎
2025/03/19 20:53

もう1点追加で教えてください。
エントリー条件が複数あるとして、下記条件のみ成立していない場合、その日はエントリーしないという設定は可能でしょうか?ちなみに7-17時のエントリー時間制限及び1日1回のエントリー回数制限をかけています。(教えていただいた条件で設定しています。)

▽成立していない条件
2本前のMACD終値≦1本前のMACD終値≦0本前のMACD終値 
※全て4H足のMACD終値

GogoJungle
2025/03/21 19:39

「ある日の、ある時刻において条件を満たさなかった場合は、その日のエントリーを禁止する」という条件でよろしいでしょうか?
或いは「常に条件をチェックし続け、一回でも満たさなかった場合、その日のそれ以降のエントリーを禁止する」という条件でしょうか?

前者の場合、「ある時刻」(例えば7:00など)を決定する必要があります。

  • 「ある時刻」において「2本前のMACD終値≦1本前のMACD終値≦0本前のMACD終値」を満たしているかを調べ、満たしていない場合はエントリー許可フラグをfalseにする
  • 許可フラグがfalseの場合はエントリーしない
  • 日付が変わったタイミングでエントリー許可フラグをtrueに戻す

という方法でロジックを作成できそうです。

後者の場合、エントリーの頻度がかなり低くなると予想されますが、作成はより簡単です。

  • ティック毎に「2本前のMACD終値≦1本前のMACD終値≦0本前のMACD終値」を満たしているかを調べ、満たしていない場合はエントリー許可フラグをfalseにする
  • 許可フラグがfalseの場合はエントリーしない
  • 日付が変わったタイミングでエントリー許可フラグをtrueに戻す

という方法で作成できます。

ご希望の条件について詳細をお伝えいただけましたら、コードの修正方法を考えてみます。

はやうち太郎
2025/03/22 14:27

ありがとうございます。具体的に言いますと、
例えばA条件、B条件として
A条件:15分足のMACD0本前≧MACD1本前≧MACD2本前
B条件:4H足のMACDMACD0本前≧MACD1本前≧MACD2本前
A条件が成立したときのみB条件を確認し成立していたら買いエントリー、していなかったらその日はエントリーしないとしたいです。
フローのイメージは以下です。※時間制限:7-17時内、取引回数制限:時間内1回
ステップ①:ティック毎にA条件の成立を確認
↓YES(NOはステップ①継続)
ステップ②:B条件の成立を確認
↓YES        ↓NO
買いエントリー    その日はエントリーしない

上記の条件設定したいです。

GogoJungle
2025/03/26 19:51

詳細のご説明、ありがとうございます。

1日1回のエントリー回数制限
https://labo.gogojungle.co.jp/articles/2134

と併用できる形でコードの修正方法を考えてみましたので、提案させていただきます。
isEntryフラグを流用しますので、単体での利用はできません。)

1. 準備

作成したいEAとは別のファイルで条件Bのコードを取得するためだけのEAを作成し、ダウンロードします。
ソースコードをエディターで開いたら、signal = 1と検索し、該当箇所のif文を控えておきます。

例えば、条件Bが「4H足MACD(0本前) ≧ 4H足MACD(1本前) ≧ 4H足MACD(2本前)」の場合は

4H足MACD(0本前) ≧ 4H足MACD(1本前)
AND
4H足MACD(1本前) ≧ 4H足MACD(2本前)
↓
買いエントリー

であり、取得できるコードは次のようになります。

   if(iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0)  >=  iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)
    && iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)  >=  iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2)) signal = 1;

2. 条件Bのコードの修正

「1.」で取得した条件Bのif文を、「signalが0でないときに条件Bを満たさなかったら、エントリーフラグを降ろす」という処理に修正します。

修正後

   if(signal != 0 && !(iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0)  >=  iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)
    && iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)  >=  iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2))) isEntry = 0;

修正内容は

  • 「if(」のすぐ後にsignal != 0 && (「signalが0でない、かつ~」)を追加
  • それ以降の条件を!( )(「(カッコ内の条件)でない」)で囲む
  • signal = 1isEntry = 0に変更する

の3点です。特に、!( )の右側のカッコを付け忘れないようにご注意ください。

3. 作成した条件を本体に追加する

条件B以外を適切に設定してダウンロードし、1日1回のエントリー回数制限の改造が終わった状態のコードに、「2.」で作成したプログラムを追加します。改造後のエントリー処理の直前に挿入しましょう。

修正前

   if(signal != 0 && getOpenLots(Magic1) == 0 && isEntry == true) { // この行を探します。改造後のコードです。

修正後

   if(signal != 0 && !(iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0)  >=  iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)
    && iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1)  >=  iMACD(Symbol(), PERIOD_H4, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2))) isEntry = 0;

   if(signal != 0 && getOpenLots(Magic1) == 0 && isEntry == true) {

以上でございます。
ご参考になりましたら幸いです。

はやうち太郎
2025/03/29 17:00

回答ありがとうございます。早速試してみました。バックテストやってみた感じ、思っているところでエントリーしていない気がしました。30分足のバックテストでは、4H足のMACD終値は正確に捉えられないのでしょうか?

関連トピックス

検索結果がありません。

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

注目トピックス

検索結果がありません。