Viseu さんが書きました:GoldenFilter_v1.mq4を見ると、iMAの最終パラメータ(シフト量)が i - 1 と書いてありますねぇ。
これだと、最新のBarの値動きに影響を受けて、1つ前のBarの売買サインが出たり消えたりするのかと・・・
→ 2つ後ろのBarが出現した時点で売買サインが確定するのではないかと・・・
→ 過去のBarではキレイに↑↓サインが出るけど、最新Bar付近ではキタナクなるのではないかと・・・
→ 即ち、チャートを開き直すと、最新Bar付近のサインが変わっているのではないかと・・・
まさにその通りですね。
チャートにLoadされた時とそうでない時とで、シグナルの出方が変わってきます。
それを解消するためには、シグナル用と思われる MAUp / MADown をループに入る都度、EMPTY_VALUE を設定して初期化し続けることで解消可能です。
ただし、シグナルが
でたりでなかったりレートの動きによって点滅しますけど。
もし、確定足でシグナルを出そうとするなら、試してないので、こうなるだろう、と言うレベルですけど、
--------------------------------------------------
if(counted_bars > 0)
counted_bars = counted_bars - 2; ← 初回実行時以外はループ回数を2回増やす
limit = Bars - counted_bars;
//----
for(i = limit - 1;
i > 1; i--) ← 2つ前までの足しかチェックしない
または
for(i = limit - 1;
i >= 2; i--) ← 2つ前までの足しかチェックしない
--------------------------------------------------
って感じに変更すれば良いかも。
2つ前までの足しかチェックしないのは、1つ前までだと、今の足が対象になるので確定した1つ前の足までの参照範囲にするためですね。
この程度の変更なら、ロジックの最適化の範疇なので、シグナル自体に問題はでないかと。
あとは、
MAUp[i - 2] = 0.8;
MADown[i - 2] = 0.8;
と言う風に、シグナルの格納箇所を今の足に変更しますね。
そこまで手を入れたくない、なら、最初のほうに書いた部分だけの手入れのみにして、
for(i = limit - 1;
i > 0; i--)
{
MAUp[i] = EMPTY_VALUE; MADown[i] = EMPTY_VALUE;<snip>
}
って風に、追加で参照意味のない今の足までのループを外すぐらいですか。
意味のない足まで参照するとか、CPUコストの無駄遣いなのは嫌いです…。
後は、アラートがでまくるので、アラートを出すタイミングをfor(...) {...} から外に出して、MAUp と MADown を参照してシグナルを出すようにしますね。
その方が、メールアラートを出したい、ってなった時に処理も追加しやすくなりますし、何よりも、ループ内でのアラートって、基本的に嫌いなので^^;
でも、実際に動くかは、やってみないとわからないです^^;
それに、まだ、Golden_V3 にまで手をつける余裕がないので、検証他は他人任せですけど…。