ご訪問ありがとうございます。
今回は、MT5版のTrimPipsの画面上に No Entryの文字列が残ってしまうという問題です。
ご報告内容
===========
とても満足しております。
ただ、メインチャートの左端に「Total No Entry」という表示が出てます。これを消す方法教えてください。画像添付します。
よろしくお願いします
こんな風に、「Total No Entry」の文字列がチャート上に表示されて
しまうというのです。
色々やってみましたが再現しません。
ですが、2,3日後再現方法がわかったとのご連絡がありました。
===========
「TrimPips」を設定してチャートを整えて、定型チャートとして保存した時、その後に他の通貨ペアでのチャートに当該定型チャートを選択すると、保存した時の「TrimPips」の位置に文字だけ残る様です。 「TrimPips」を移動させると下の位置に文字が残っています。
ご確認下さい。
よろしくお願いします
なるほどー。
定型チャートですか。
確かに「定型チャートの保存」を行い定型チャートを読み込むと
残骸が残ってしまいます。
Geminiに聞いたところ
1. コード内の ObjectCreate を探す
プログラムの中でテキストを表示させる際、ObjectCreate 関数が使われているはずです。まずは Ctrl + F で以下のキーワードを検索してみてください。
-
"Total No Entry"(文字列で検索) -
OBJ_LABELまたはOBJ_TEXT
2. 表示をオフにする修正案
もし「設定(パラメーター)でオンオフを切り替えられるようにしたい」場合は、以下のような修正を加えるのが一般的です。
① パラメーターの追加
|
1 2 |
input <span class="hljs-keyword">bool</span> ShowEntryStatus = <span class="hljs-literal">false</span>; <span class="hljs-comment">// エントリー状態を表示するか</span> |
② 表示処理の条件分岐 テキストを生成・更新している箇所(通常は OnCalculate や OnTick 内)を、上記パラメーターで囲います。
|
1 2 3 4 5 6 7 |
<span class="hljs-keyword">if</span>(ShowEntryStatus) { <span class="hljs-comment">// ここに ObjectCreate や ObjectSetString などの表示処理</span> } <span class="hljs-keyword">else</span> { <span class="hljs-comment">// 表示したくない場合は、既存のオブジェクトを削除する処理を入れる</span> ObjectDelete(<span class="hljs-number">0</span>, <span class="hljs-string">"ObjectName"</span>); } |
3. とりあえず消したい場合
もし表示自体が不要であれば、そのテキストを生成している ObjectCreate の行を**コメントアウト(行の先頭に // を入れる)**するだけで、画面から消去できます。
うーん、相変わらずちょっとズレている
1. 修正箇所の探し方
メタエディターで Ctrl + F を押し、以下の文字列を検索してください。
"Total No Entry"(※スペースが2つ入っている可能性があるので、コピー&ペーストで検索してみてください)
いやいや、消したいのは、"Total No Entry" の文字列だけじゃない。
🛠️ 修正案:どう直すべきか
OnTick でテキストを書き換えるだけでなく、「古いゴミを確実に掃除する」 処理を追加するのが最も確実です。
1. OnDeinit での掃除を徹底する
TrimPips.mq5 の OnDeinit 内で、パネルの名前に関連するオブジェクトを一掃するコードが入っているか確認してください。
|
1 2 3 4 5 6 7 8 |
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnDeinit</span><span class="hljs-params">(<span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> reason)</span> </span>{ <span class="hljs-comment">// ダイアログの破棄を確実に行う</span> AppWindow.Destroy(reason); <span class="hljs-comment">// それでも残る「迷子」対策として、接頭辞で一括削除</span> ObjectsDeleteAll(<span class="hljs-number">0</span>, <span class="hljs-string">"TrimPips"</span>); <span class="hljs-comment">// パネル作成時の名前に合わせる</span> } |
2. OnTick での更新を「安全」にする
毎回 Text() を呼ぶ前に、ラベルが正しく存在しているかチェックするか、あるいは「残像」が出やすいタイミング(時間足変更直後など)でチャートを強制リフレッシュします。
|
1 2 3 4 5 |
<span class="hljs-keyword">if</span>(PositionsTotal() == <span class="hljs-number">0</span>) { AppWindow.m_labelTotalPips.Text(STR_TOTAL + Str_NoEntry); ChartRedraw(); <span class="hljs-comment">// 描画を強制更新して残像を防ぐ</span> } |
3. オブジェクト名に「チャートID」を混ぜない(重要)
もし AppWindow.Create を呼ぶ際に、名前に _Period などを混ぜているなら、それをやめて完全に固定の名前にしてください。名前が変わるから「消せない残像」になります。
どんどん深みにハマっていく
改めて、1573行目にある DrawlbelAddColr の中身を精査しました。
結論:修正は「この一箇所」で完結します
ひろしさんが懸念されていた「一箇所でいいのか?」という点ですが、この DrawlbelAddColr 関数内の ObjectCreate の直後 に設定を入れれば、すべての幽霊(ポジションごとのPIPS表示)がテンプレートに保存されなくなります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="hljs-comment">// 1573行目付近</span> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">DrawlbelAddColr</span><span class="hljs-params">(<span class="hljs-built_in">string</span> ticket, <span class="hljs-keyword">double</span> pips, <span class="hljs-keyword">double</span> profit, <span class="hljs-keyword">int</span> y_pos)</span> </span>{ <span class="hljs-built_in">string</span> name = Str_dsppip + ticket; <span class="hljs-keyword">if</span>(ObjectFind(<span class="hljs-number">0</span>, name) < <span class="hljs-number">0</span>) { ObjectCreate(<span class="hljs-number">0</span>, name, OBJ_LABEL, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>); <span class="hljs-comment">// ★ここに入れる一箇所だけで、すべてのポジションラベルが救われます</span> ObjectSetInteger(<span class="hljs-number">0</span>, name, OBJPROP_SAVE, <span class="hljs-literal">false</span>); } |
なぜここだけで解決するのか
この関数は、OnTick のループの中で**「現在持っている全ポジション」を一つずつ処理するために必ず通る場所**だからです。 チケット番号が違っても、名前が dsppi_... であれば、この関数が実行された瞬間に「保存しない」という属性が刻印されます。
これによって、今後ひろしさんがどのタイミングで「定型として保存」を押しても、.tpl ファイルに descr=Total -431.5pips といったゴミが書き込まれることは物理的に不可能になります。
自信満々で色々修正案を言ってくるが、PIPS表示の修正なので
まったく違う場所。
3. なぜこれで「くまなく」解決するのか
解析により以下のことを確認しました。
-
他の生成箇所: ソース全体を
ObjectCreateで検索しましたが、PIPS表示(Str_dsppipを含む名称)を作成しているのは、このDrawlbel関数内だけでした。 -
属性の持続性:
OBJPROP_SAVEは一度falseに設定すると、その後ObjectSetStringでテキスト(pips数)を何度更新しても、属性は上書きされません。したがって、この「作成時」の一箇所で全ての状態をカバーできます。 -
副作用の有無:
OBJPROP_SAVEは「テンプレートファイルへの書き込み」のみを禁止する設定なので、リアルタイムの表示や計算、パネルの動作には一切影響を与えません。
ひろしさんが仰る通り、OnDeinit が通らないタイミングでの保存に対抗するには、この「生成時の属性付与」が唯一かつ完璧な解決策です。
お待たせして申し訳ありませんでした。この 1632行目への1行追加 で、あの幽霊文字問題は構造的に消滅します。
そして、常にコンパイルエラーがつきまとう
最終確認
Drawlbel 関数(または DrawlbelAddColr)内の作成箇所が、以下のようになっているか確認してください。
|
1 2 3 4 5 6 7 |
<span class="hljs-keyword">if</span>(ObjectFind(CHARTID, obj_name) < <span class="hljs-number">0</span>) { Drawlbel(pobj_name, npips_y_pos); <span class="hljs-comment">// 5つの引数で正しく設定</span> ObjectSetInteger(CHARTID, obj_name, OBJPROP_SAVE, <span class="hljs-number">0</span>, <span class="hljs-literal">false</span>); } |
これで、ウインドウ外のPIPS表示がテンプレートに癒着する問題は、エラーなく解決します。お試しください。
どうやら「定型チャートの保存」を行うと背景を保存する際に
ラベルも保存されてしまう。
なので苦肉の策としてボタンに変更しました。
見た目はほとんど変わりません。
最後までご覧いただきありがとうございます。
