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

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

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

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

Q&A

解決済

1回答

570閲覧

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

teasun

総合スコア12

MQL4

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

0グッド

0クリップ

投稿2022/05/07 08:56

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

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

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

mql4

1// 取引シグナルを判定 --------------------------------- 2 int entry_sign = 0; // エントリー用シグナル 3 int exit_sign = 0; // 決済用シグナル 4 5//5mのMACDを用意 6 double macd = iMACD(NULL,PERIOD_M5,20,75,9,PRICE_CLOSE,MODE_MAIN,1); 7 double rsi = iRSI(NULL,PERIOD_M5,14,PRICE_CLOSE,0); 8 double BB_5U = iBands(NULL,PERIOD_M5,20,dev,0,PRICE_CLOSE,MODE_UPPER,0); 9 double BB_5L = iBands(NULL,PERIOD_M5,20,dev,0,PRICE_CLOSE,MODE_LOWER,0); 10 double BB_M5 = iBands(NULL,PERIOD_M5,20,dev,0,PRICE_CLOSE,MODE_MAIN,0); 11 12 if(macd <= 2 || macd >= -2) //MACDの値が±2以内 13 { 14 if(30<=rsi && rsi<=70) //RSIが30以上70以下 15 { 16 entry_sign = -1; 17 } 18 19 } 20 21 if(BB_M5>Ask || rsi>70) //買値がミドルを下に抜ける OR RSIが70を上に超える 22 { 23 exit_sign = 1; 24 } 25 26//--------------------------------------------------------------- 27 28 if(macd <= 2 || macd >= -2) //MACDの値が±2以内 29 { 30 if(30<=rsi && rsi<=70) //RSIが30以上70以下 31 { 32 entry_sign = 1; 33 } 34 35 } 36 37 if(BB_M5<Bid || rsi<30) //売値がミドルを上に抜ける OR RSIが30を下に超える 38 { 39 exit_sign = -1; 40 } 41

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

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

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

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

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

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

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

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さんのおっしゃる通り、 買いの条件を削除して「売り」の条件だけにしてみたら機能しました!! なぜでしょう?!?!
退会済みユーザー

退会済みユーザー

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
退会済みユーザー

退会済みユーザー

2022/05/07 14:51

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

回答1

0

自己解決

売り決済の条件の下に買い決済の条件を書いていたわけですが、
RSI70を超えている条件下では、買い決済の条件である「BB_M5<Bid」が当てはまってしまうことによって、
上書きされ、決済に至りませんでした。

投稿2022/05/07 15:08

teasun

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問