Init()およびDeInit()実行シーケンス - ページ 18

 
Alexey Kozitsyn:
松葉杖の使用など?例を挙げてみましょうか。

異なるシンボルやTFを持つチャートにChartIndicatorAdd()でインジケータを追加することはできません。エラーが表示されます。

https://www.mql5.com/ru/docs/chart_operations/chartindicatoradd

ChartIndicatorAdd

指定されたハンドルを持つインジケータを指定されたチャートウィンドウに追加します。インジケータとチャートは同じシンボルとタイムフレームに描画されなければ なりません。

これが今の制約です。サービスには入りません。
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
ほとんどsubjの話題で、ちょっとだけ脱帽。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2016.09.23 10:48

  1. NONEのチャートにインジケータを設定しました
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define  TOSTRING(A) #A + " = " + (string)A + "\n"
    
    int OnCalculate( const int rates_total,
                     const int prev_calculated,
                     const datetime &time[],
                     const double &open[],
                     const double &high[],
                     const double &low[],
                     const double &close[],
                     const long &tick_volume[],
                     const long &volume[],
                     const int &spread[] )
    {
      if (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. チャートからインジケーターを手で取り外すこと。
  3. ログを見ると、インジケータが動作し続けていることがわかります。ターミナルですべてのチャートを閉じても、実行されたままです。そして、それは当然ながら何の役にも立ちません。
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. 端末を再起動すると、インジケータの実行が停止します。
  5. アイドリングでこのように実行できる指標がどれだけあるのか、私たちは何も知らないのですコントロールが全くできていないのです。
開発者に文句を言わずに。
 
fxsaber:
これはもう制限です。サービスには入りません。

そういうことでは全然ないんです。EAからインジケータを追加するのではなく、EAを使用してインジケータを作成する。

これについては

サービスや1つのチャートで複数のEAを動かす機能では、議論されているトラブスを完全にカバーすることはできないのでは?

サービスを利用してインジケータを作成することができない場合、ファイルからのデータでインジケータを作成する問題が解消されません。OnDeinit() -> OnInit() のシーケンスが制御されていない場合。TFの変更はユーザーのアクションであり、このアクションに対する応答(OnDeit())は、これが必要ないとき(OnInit()の後、あるいはOnCalculate()の後かもしれません)に発生します。

つまり、インジケータがデータをファイルに記録し、そのデータに基づいてグラフの系列をプロットする場合、データが「連続して」書き込まれていないと、すべてのデータの正しい表示が行われない。

しかし、もしサービスがグローバルなプログラム(GPTのような、しかしプログラム全体)であり、それが指標バッファを 作成でき、計算がTFs変更/チャートクローズなどのユーザーアクションによって中断されないならば、この問題は存在しないでしょう。しかし、その間、指標はいつものように去勢される。

 
Alexey Kozitsyn:

そういうことでは全然ないんです。EAからインジケータを追加するのではなく、EAを使用してインジケータを作成 する。

用語がよくわからない。

 
fxsaber:

用語がよくわからない。

データを表示するだけでなく、インジケーターバッファに 書き込んだ状態で計算し、表示すること。
 
Slawa:

OnChartEventに対する解決策はまだありません。

解決策がないとはどういうことですか?マウスへのアクセス機能がなければ、どんなサービスになるのでしょうか?そして、ユーザーイベントも 処理したい。
 
Alexey Kozitsyn:
データを表示するだけでなく、インジケーターバッファに 書き込みながら計算し、表示する。

彼らは、TFの変更時に、この指標で計算されたデータを、信頼性が高く論理的にこの指標の別のコピーに移行 することができないことを訴えています。

これは、計算部分をサービスが行い、それをインジケータが表示するようにすれば、サービスを通じて簡単に行うことができます。

太字で表示されている以外の場合は、従来の指標と同じように書くことができます。

 
fxsaber:

彼らは、TFの変更時に、この指標で計算されたデータを、信頼性が高く論理的にこの指標の別のコピーに移行 することができないことを訴えています。

これは、計算部分をサービスが行い、それをインジケータが表示するようにすれば、サービスを通じて簡単に行うことができます。

太字で強調表示されている以外の場合は、従来通りの方法でインジケータを書くことができます。

よし、じゃあ、何が出るか見てみよう。ベータ版はいつになるのでしょうか?
 
Alexey Kozitsyn:
よし、まあ、どうなるかな。ベータ版はいつ?
私がゴーサインを出したら、今夜になりますよ。
 
Nikolai Semko:
解決策がないってどういうこと?マウスへのアクセス機能がなければ、どんなサービスになるのでしょうか?あと、ユーザーイベントも 扱いたいですね。

No solutionは「解き方がわからない」という意味で、「解かない」という意味ではありません。

また、カスタムイベントについても全く問題ありません