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

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

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

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

プログラミング言語

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

関数

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

Q&A

0回答

1364閲覧

MQL4について「サインツールの制御で分からない箇所があります」

tommy---

総合スコア2

MQL4

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

プログラミング言語

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

関数

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

0グッド

0クリップ

投稿2021/10/11 18:01

前提・実現したいこと

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以上」などで連続しない制御は考えていません。

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

該当のソースコード

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);

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

//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ページで確認できます。

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

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

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

y_waiwai

2021/10/11 22:28

質問文は編集できます 無駄に質問建てないで、追記修正しよう
tommy---

2021/10/11 22:54

申し訳御座いません。 サーバーエラーと出て投稿できていないと思い、その後にタイトルを変更して再度投稿したら2連続で投稿した形になってしまい削除できない事もその後に知りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問