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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

2759閲覧

MQL4について、サインツールのある部分の制御について困っています。

tommy---

総合スコア2

MQL4

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/10/11 18:03

編集2021/10/14 07:39

前提・実現したいこと

MQL4でサインツールの作成をしています。

発生している問題・エラーメッセージ

解決出来ない制御があります。
下記のコードはその条件を簡易化したものになります

制御したい条件
①Entryアローが出たら次はExitアローが出るまでEntryアローは出現させない
②Exitアローが出たら次はEntryアローが出るまでExitアローは出現させない

これを実現させる為、Entry条件に「EntryFlag==false」の制御を入れ、Entry条件を満たした場合に「EntryFlag = true」を入れてます。
理由はこうする事で上記記載の
【①Entryアローが出たら次はExitアローが出るまでEntryアローは出現させない】
これを制御出来るからです。
但し、同じ足でTick中に満たしていた条件から外れた場合にアローを消す処理
「UpEntryBuf[i] = EMPTY_VALUE;」
こちらを制御に入れている事で、アローが消えた後でもifを通った段階で「EntryFlag = true」にしているので再度同じ足でTick中に条件を満たしてもifの中に「EntryFlag==false」の条件を入れている関係上、if文は通りません。

過去足のアローは全て正常に出る為、チャートを更新すれば過去足分は正常にアローが出現しますが、リアルタイムの場合は上記の制御のせいで無理です。

ちなみにインジケーター条件の縛りは簡易化しているものなので、実際の条件はもっと色々詰め込んでいます。
その為、例えば前足で「RSIが30以上」などで連続しない制御は考えていません。

色々方法を試しましたが、どのような条件にすれば①②の制御を成功させる事が出来ますでしょうか?
かなりの期間解決出来ずに悩んでいます。
アドバイス頂けると幸いです。

該当のソースコード

//エントリー判定
bool EntryFlag = false;

int maxBars = 2000;
int limit = Bars-IndicatorCounted()-1;
limit = MathMin(limit, maxBars);

for(int i = limit; i >= 0; i--)
{
if(i >= 0)
{
//インジケーター関数
double RSI = iRSI(NULL,0,14,PRICE_CLOSE,i);
double BandLow = iBands(NULL,0,20,2.0,0,PRICE_CLOSE,MODE_LOWER,i);
double close_0 = iClose(NULL, 0, i);

//Entryサイン
if(EntryFlag == false && RSI<30 && BandLow > close_0 )
{
UpEntryBuf[i] = iLow(NULL, 0, i);
EntryFlag = true;
}
else
{
UpEntryBuf[i] = EMPTY_VALUE;//出現した上アローを消す
}
//Exitサイン
if(EntryFlag == true && RSI>50)
{
UpExitBuf[i] = iHigh(NULL, 0, i);
EntryFlag == false;
}
else
{
UpExitBuf[i] = EMPTY_VALUE;//出現した上アローを消す
}

//UPBuf[i],UpExitBuf[i] はアロータイプのバッファです。

試したこと

EntryFlagでEntryの判断をするのではなく
カウントで試してみたり(全く同じことでした)

Entryの後にExit、Exitの後にEntryという条件になっている事から
EntryとExitにTime[i]でアロー出現時間をとっておき
Entry条件
EntryアローTime[i]よりExitアローTime[i]の方が大きい
(Exitアローの方が後に出ている)
などの制御でも試していきましたが、結果としてEntryアロー出現時にTime[i]を取ってしまったらその時点で「EntryアローTime[i]よりExitアローTime[i]の方が大きい」の条件が崩れてしまう為、色々試した所で結果として全て同じ事の繰り返しになってしまっています。

アローを消す処理さえしなければ正常に通るのは分かっているのですが、それだと意味が無いので…

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

すみません。 問題が理解が出来ていないのかもしれないのですが。
リアルで、アローが出ないことが問題なのですね?

最新足中に複数回tickが発生するとすれば、その最新足内でExit条件が発生しない限り、最新足ではアローは必ず消されますね。
tickに対しtrue後は、Entryサインのelse側を通るから。

それと、for文の条件部分は、i>0にはなっていないですよね。

投稿2021/10/14 22:47

yu-ima

総合スコア249

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

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

tommy---

2021/10/14 23:27

ご回答有難う御座います。 合っています。 過去チャートだと正常にアローは出ますが、リアルタイムチャートだとTick発生で条件から外れる→elseでアローを消す、この処理の後に「EntryFlag=true」をfalseに戻せないので条件が通らずアローが出現しません。 なぜアローが出ないかは理解していますが、これをどうすれば解決出来るか分からず質問させて頂きました。 >>それと、for文の条件部分は、i>0にはなっていないですよね。 これはi>=0ではなくi>0になっていないかという事でしょうか? 0を含むになっています。
yu-ima

2021/10/14 23:56

//Entryサイン if(EntryFlag == false ) { if ( RSI<30 && BandLow > close_0 ) { UpEntryBuf[i] = iLow(NULL, 0, i); EntryFlag = true; } } else if ( /* falseへ戻す条件 */ ) { UpEntryBuf[i] = EMPTY_VALUE;//出現した上アローを消す EntryFlag = false; } //Exitサイン
tommy---

2021/10/15 00:41

あー確かに、確かにそれなら出来そうです! 何故思いつかなかったのか、物凄く良いアドバイスを有難う御座います。 else { UpEntryBuf[i] = EMPTY_VALUE;//出現した上アローを消す EntryFlag = false; } では試していたのですが、なぜelseだとダメなんでしょうか? 初歩的な質問すみません。
yu-ima

2021/10/15 02:37 編集

先のままだと、trueの時及び、falseでも後の条件が成立しなければ、常にelseが実行されます。 elseで、EntryFlag = false;を行うと、次回条件が成立しなければ同じことです。 従って、先にtrue/falseを判断し、それぞれの状態の中で、該当する判断をするべきだと思います。 蛇足ですが、UpEntryBuf[i]、UpExitBuf[i]のエリアは、最初EMPTY_VALUEになっていると思いますが、不定であるとすると、新足の最初に初期化(EMPTY_VALUE)する必要があるかもしれません。
tommy---

2021/10/15 09:03

ありがとうございます! 無事完成出来ました。 非常に助かりました。
guest

0

forループの中に bool EntryFlag = false;が記述してあります。
最初のif文を実行するときは、常にfalseですが問題ありませんか?

投稿2021/10/14 06:50

yu-ima

総合スコア249

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

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

tommy---

2021/10/14 07:37

ご指摘ありがとう御座います。 本来はグローバル領域の方に記載してあります、完全にこちらに書くときに間違えてしまいました。 修正しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問