質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

解決済

RSIが70を超えたら決済をする

teasun
teasun

総合スコア12

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

2回答

0評価

0クリップ

208閲覧

投稿2022/05/07 08:56

自分で気づく事は困難だと判断したため質問させていただく事となりました。
宜しければお時間を頂戴させていただき、お力添えしていただけたら大変幸いに存じます。

1.やりたい事
2.発生している問題点
3.問題に対して調査した内容
4.具体的に分からない部分

ソースコードを記載させて頂きます。

mql4

// 取引シグナルを判定 --------------------------------- int entry_sign = 0; // エントリー用シグナル int exit_sign = 0; // 決済用シグナル //5mのMACDを用意 double macd = iMACD(NULL,PERIOD_M5,20,75,9,PRICE_CLOSE,MODE_MAIN,1); double rsi = iRSI(NULL,PERIOD_M5,14,PRICE_CLOSE,0); double BB_5U = iBands(NULL,PERIOD_M5,20,dev,0,PRICE_CLOSE,MODE_UPPER,0); double BB_5L = iBands(NULL,PERIOD_M5,20,dev,0,PRICE_CLOSE,MODE_LOWER,0); double BB_M5 = iBands(NULL,PERIOD_M5,20,dev,0,PRICE_CLOSE,MODE_MAIN,0); if(macd <= 2 || macd >= -2) //MACDの値が±2以内 { if(30<=rsi && rsi<=70) //RSIが30以上70以下 { entry_sign = -1; } } if(BB_M5>Ask || rsi>70) //買値がミドルを下に抜ける OR RSIが70を上に超える { exit_sign = 1; } //--------------------------------------------------------------- if(macd <= 2 || macd >= -2) //MACDの値が±2以内 { if(30<=rsi && rsi<=70) //RSIが30以上70以下 { entry_sign = 1; } } if(BB_M5<Bid || rsi<30) //売値がミドルを上に抜ける OR RSIが30を下に超える { exit_sign = -1; }

1.やりたい事
RSIが70を超えたら決済をする

2.発生している問題点
「売り」注文の決済で使用しているRSIの条件のみ機能しない事です。
「買い」注文の決済で使用しているRSIの条件は機能しており、
エントリー条件にもRSIは使用しているのですが、
上記の時だけなぜか機能しません。

3.問題に対して調査した内容
・全角の数字でもコンパイルが通った為、別の部分のコピペを利用して全角部分がないことは確かめました

・比較演算子の||が機能していないのかと思ったので、比較演算子を使わず、if文を2つにして条件を分岐させました

・もう一方の条件が何かしら原因かと思い、RSIのみの条件にしてみましたが、案の定一向に決済されませんでした

・この海外口座のメタエディタのみバグっているのではと思い、別の海外口座のメタエディタにコピペしましたが、何も変わりませんでした

・VScodeで観察してみましたが特に問題はありませんでした

・rsiという変数名か、変数自体に問題があるのかもと思い、変数に代入せず直接iRSI関数を使いってみましたが、同じく認識されず決済されませんでした

・数値を使っているのがまずいと思い、double型の変数を宣言して使用しましたが何も変わりませんでした

4.具体的に分からない部分
なぜ、その部分だけ機能しないのかがわかりません(__)
その部分だけを既存のmacdの条件にしてみたところ、同様に機能しませんでした。
もっと根本的に何か理解できていない部分があるのかもと思っているのですが、
自分ではもうどこから考えたらいいのかわからなくなり、
最終手段に甘えてしまう事となりました。

何卒回答いただけましたら幸いです。m(__)m

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

xg63ex2b

2022/05/07 11:58

「売り」から入る場合と「買い」から入る場合の条件があるのかな?と思いますが、「買い」の条件を削除して「売り」の条件だけにしてみたら何か変わりますでしょうか?
yu-ima

2022/05/07 12:41

if(macd <= 2 || macd >= -2) //MACDの値が±2以内 この条件では、常にtrueになります。 //MACDの値が±2以内 なら if(macd <= 2 && macd >= -2) です。
teasun

2022/05/07 13:13

おっしゃる通りでしたm(__)m xg63ex2bさんのおっしゃる通り、 買いの条件を削除して「売り」の条件だけにしてみたら機能しました!! なぜでしょう?!?!
xg63ex2b

2022/05/07 13:39 編集

コメントありがとうございます。 原因が特定できたっぽいようで良かったです。 ``` if(BB_M5>Ask || rsi>70) //買値がミドルを下に抜ける OR RSIが70を上に超える if(BB_M5<Bid || rsi<30) //売値がミドルを上に抜ける OR RSIが30を下に超える ``` exit_signを1にした後に、-1を再代入してしまっているのかな?と思いました。 (RSIが70より大きいと、移動平均線(ミドルバンド)の上にBidがありそうな気がしました) デバッグすると次のような評価がされていると思います。 `rsi>70`で`exit_sign = 1;` `BB_M5<Bid`で`exit_sign = -1;`
teasun

2022/05/07 13:59

なるほど!!! なんでそんなことに気付けなかったのかと、自分の未熟さを痛感いたしました。 詳しく解説いただきまして本当に本当にありがとうございますm(__)m ベストアンサーにさせてくださいm(__)m m(__)m
xg63ex2b

2022/05/07 14:51

コメントありがとうございます。 解決したようで良かったです。 原因を特定できた上でコメントしたわけではありませんでしたので、 自己解決の形で、ご自身で回答を入力することでOKと思いますよ。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。