前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー