インジケーターに関する雑多な質問 - ページ 12

 

そのprintステートメントが何かを生成しない理由はないでしょう。

新しいチャートにインジケータを追加した場合、(タイムフレームを変更することなく)印刷されますか?

もしそうなら、すでにチャート上にインジケータがあり、その変更を期待して再コンパイルしていることが問題なのかもしれません。

 
honest_knave:

そのprintステートメントが何かを生成しない理由はないでしょう。

新しいチャートにインジケータを追加した場合、(タイムフレームを変更することなく)印刷されますか?

もしそうなら、すでにチャート上にインジケータがあり、その変更を期待して再コンパイルしたことが問題なのかもしれません。


早速のコメント、ありがとうございます。

そうなんです!Load TemplateかAdd Indicatorのどちらかのメッセージの下に表示されます。

20...   ... EURUSD,M1: This Year1900

しかし、あなたが知っているように、そのコードは私に" 2017 "を与える可能性があります。

//--- 2回目の編集

私は再コンパイルするとき、それは正しい結果を示しています。

しかし、インジケータの追加やテンプレートのロードをしようとすると、再コンパイルしたMetaEditorを開くことができません...。私の言っていることが理解できるといいのですが。

 
Max Enrik:


早速のコメント、ありがとうございます。

そうなんです。テンプレートを読み込むか、インジケータを追加するかで、下のメッセージが表示されます。

しかし、あなたが知っているように、このコードは私に" 2017 "を与える可能性があります。

//--- 2回目の編集

再コンパイルすると、正しい結果が表示されます。

しかし、インジケータの追加やテンプレートのロードをしようとすると、再コンパイルしたMetaEditorを開くことができません...。ということなのですが、ご理解いただけましたでしょうか?


おそらく、間違った年を表示する理由は、ブローカーに接続する前にOnInit()が実行されているからでしょう。

Year() はサーバーの時刻に 基づくもので、接続がなければ年を知ることはできません。

と比較してみてください。

TimeYear(TimeLocal())
 
honest_knave:


おそらく、ブローカーに接続する前に OnInit() が実行されたために、「間違った」年が表示されたのだと思われます。

Year() はサーバーの時刻を基準にしているので、接続がなければ年を知ることはできません。

と比較してみてください。


OnInit()とOnCalculate(...)は異なるコードスタイルが必要 なことは確かです...。
私のインジケータをもう一度書き直してみます。
(あきらめる可能性もありますが。)

コメントありがとうございます。

 

まず、すべてのインジケータオブジェクトを削除してから、書き換えるようなコードを書けばいいと思います。
以下のようなコードで試してみました。しかし、この方法には疑問があります。

Q: インジケーターのオブジェクトをすべて削除するには、その方法で十分でしょうか?

何かアドバイスがあればお願いします。

int OnInit()
 {
  ObjectsDeleteAll( 0, prefix );
  
  // then all my indicator code here...
 }
 
Max Enrik:

まず、すべてのインジケータオブジェクトを削除してから、書き換えるようなコードを書けばいいと思います。
以下のようなコードで試してみました。しかし、この方法には疑問があります。

Q: インジケーターのオブジェクトをすべて削除するには、その方法で十分でしょうか?

何かアドバイスがあればお願いします。


現在のチャートから'prefix'で始まるオブジェクトをすべて削除するには、この方法が正しいのでしょうか?
 
honest_knave:

これが、現在のチャートから 'prefix' で始まるオブジェクトをすべて削除する正しい方法です。

かっこいいですねー。ご返答ありがとうございます。
さて、次の日に私のインジケータがどのように動作するか確認する必要があります。

( p.s. 私はTesterで自分のインジケータをテストするのは好きではありません )

 

( 一度だけ言ったことがあります )

私はいくつかの指標に以下のメソッドコードを使用しています。その指標は何の問題もありませんが、私がMT4プラットフォームを起動するときに、その指標は正しい値のために更新するプラットフォームを再起動する必要があるという問題を持っています。毎日一度だけこの問題に直面します。

Q: 下記のコードの一部が正しい値を更新できない問題を引き起こす可能性があるのでしょうか?

よろしくお願いします。

int OnInit()
{
    //---
    datetime a = iTime( Symbol(), 0, 0 );
    int      b = iBarShift( Symbol(), 0, a );
    datetime c = iOpen( Symbol(), 0, b );
    //---
    return(0);
}
 

OnInit()内のコードは一度だけ実行されます。

端末を再起動すると、ブローカーに接続する前に OnInit() が終了してしまうことがあります。

ブローカーに接続していない状態では、時刻がおかしくなってしまいます。

コードを OnInit() の外に出すか、少なくとも IsConnected() をチェック することをお勧めします。

 
honest_knave:

OnInit()の外にコードを移動するか、少なくともIsConnected()をチェックすることをお勧めします。

このIsConnected()は絶対に使わないでください、それについて研究します。

ありがとうございました。

理由: