記事"DoEasyライブラリの時系列(第39部): ライブラリに基づいた指標 - データイベントと時系列イベントの準備"についてのディスカッション

 

新しい記事 DoEasyライブラリの時系列(第39部): ライブラリに基づいた指標 - データイベントと時系列イベントの準備 はパブリッシュされました:

本稿では、DoEasyライブラリを適用して複数の銘柄の複数期間の指標を作成する方法について説明します。指標内で機能するライブラリクラスを準備し、指標のデータソースとして使用される時系列の作成をテストします。時系列イベントの作成と送信も実装します。

指標をコンパイルし、長期間使用していなかった銘柄チャートで起動し(事前の設定で現在の銘柄を使用するように設定している間)、指定した時間枠リストを使用することを選択します。未使用の長い銘柄で指標を起動すると、欠落しているデータをダウンロードして、ジャーナルとチャートでそのことを通知します。


ここでは、次の空の時系列が同期され、新しいティックごとに作成されていることがわかります。以下のエントリが操作ログに表示されています。

Account 8550475: Artyom Trishkin (MetaQuotes Software Corp.) 10425.23 USD, 1:100, Hedge, MetaTrader 5 demo
--- Initializing "DoEasy" library ---
Working with the current symbol only: "USDCAD"
Working with the specified timeframe list:
"M1"  "M5"  "M15" "M30" "H1"  "H4"  "D1"  "W1"  "MN1"
USDCAD symbol timeseries: 
- Timeseries "USDCAD" M1: Requested: 1000, Actual: 0, Created: 0, On the server: 0
- Timeseries "USDCAD" M5: Requested: 1000, Actual: 0, Created: 0, On the server: 0
- Timeseries "USDCAD" M15: Requested: 1000, Actual: 0, Created: 0, On the server: 0
- Timeseries "USDCAD" M30: Requested: 1000, Actual: 0, Created: 0, On the server: 0
- Timeseries "USDCAD" H1: Requested: 1000, Actual: 0, Created: 0, On the server: 0
- Timeseries "USDCAD" H4: Requested: 1000, Actual: 0, Created: 0, On the server: 0
- Timeseries "USDCAD" D1: Requested: 1000, Actual: 0, Created: 0, On the server: 0
- Timeseries "USDCAD" W1: Requested: 1000, Actual: 0, Created: 0, On the server: 0
- Timeseries "USDCAD" MN1: Requested: 1000, Actual: 0, Created: 0, On the server: 0
Library initialization time: 00:00:01.406
"USDCAD" M1 timeseries created successfully:
- Timeseries "USDCAD" M1: Requested: 1000, Actual: 1000, Created: 1000, On the server: 5001
"USDCAD" M5 timeseries created successfully:
- Timeseries "USDCAD" M5: Requested: 1000, Actual: 1000, Created: 1000, On the server: 5741
"USDCAD" M15 timeseries created successfully:
- Timeseries "USDCAD" M15: Requested: 1000, Actual: 1000, Created: 1000, On the server: 5247
"USDCAD" M30 timeseries created successfully:
- Timeseries "USDCAD" M30: Requested: 1000, Actual: 1000, Created: 1000, On the server: 5123
"USDCAD" H1 timeseries created successfully:
- Timeseries "USDCAD" H1: Requested: 1000, Actual: 1000, Created: 1000, On the server: 6257
"USDCAD" H4 timeseries created successfully:
- Timeseries "USDCAD" H4: Requested: 1000, Actual: 1000, Created: 1000, On the server: 6232
"USDCAD" D1 timeseries created successfully:
- Timeseries "USDCAD" D1: Requested: 1000, Actual: 1000, Created: 1000, On the server: 5003
"USDCAD" W1 timeseries created successfully:
- Timeseries "USDCAD" W1: Requested: 1000, Actual: 1000, Created: 1000, On the server: 1403
"USDCAD" MN1 timeseries created successfully:
- Timeseries "USDCAD" MN1: Requested: 1000, Actual: 323, Created: 323, On the server: 323
New bar on USDCAD M1: 2020.03.19 12:18
New bar on USDCAD M1: 2020.03.19 12:19
New bar on USDCAD M1: 2020.03.19 12:20
New bar on USDCAD M5: 2020.03.19 12:20

作者: Artyom Trishkin

 

記事に間違いはありませんか?

このライブラリは、インジケータがシンボル・チャート上で実行されている場合はタイマーで動作し、インジケータがテスターで実行されている場合はティックでOnCalculate() で動作します。

それとも私が誤解しているのでしょうか?
 
Сергей Таболин:

記事に間違いはありませんか?

このライブラリは、インジケータがシンボル・チャート上で実行されている場合はタイマーで動作し、インジケータがテスターで実行されている場合はティックでOnCalculate()で動作します。

それとも私が誤解しているのでしょうか?
その通りです。その通りです。
 

こんにちは、

私はジャーナルに最後の "完全な "バーのいくつかのパラメータを 印刷しようとしていますが、私は保存されたシリーズデータを更新していないか、それをソートしていないと推測されます(しかし、私はそれを時間によってソートし、私が望むバーを取得する方法も見つけることができません)、私の結果は常に履歴の2番目のバーであり、前の完全なバーのリアルタイムデータを更新したことはありません...次に、直近の完全なバーのサイズを、過去10~20本のバーと比較したいのですが、 何か良い方法があれば教えてください!

このアクションは、"New Bar "イベントで実行しています

   else if(idx>SERIES_EVENTS_NO_EVENT && idx<SERIES_EVENTS_NEXT_CODE)
     {
      //--- 新しいバー」イベント
      if(idx==SERIES_EVENTS_NEW_BAR)
        {
         Print(TextByLanguage(" Новый бар на ","New Bar on "),sparam," ",TimeframeDescription((ENUM_TIMEFRAMES)dparam),": ",TimeToString(lparam));

        
//--- すべての新しいバーに最後の完全なバーサイズを表示する 
         // 渡された文字列からシンボルオブジェクトを取得する param 
         CSymbol *symbol=engine.GetSymbolObjByName(sparam);
         if(symbol==NULL)
            return;
         // このタイムフレームの最後の完全なバー(チャートの右から現在の-1)を取得する。
         CBar *bar=engine.SeriesGetBar(symbol.Name(),(ENUM_TIMEFRAMES)dparam,1);
         if(bar==NULL)
            return;            
         //--- バー・オブジェクトから受け取ったデータを表示する。
         Print(TextByLanguage(「Бар♪」。,"Data from Bar \"")+symbol.Name()+"\" "+TimeframeDescription((ENUM_TIMEFRAMES)dparam)+": "+TimeToString(bar.Time(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+
            " H: "+DoubleToString(bar.High(),symbol.Digits())+
            " L: "+DoubleToString(bar.Low(),symbol.Digits())+
            " Size: "+DoubleToString(bar.Size(),symbol.Digits()));        
        
        }
     }

ジャーナル結果のスクリーンショットを添付します。

ファイル:
Example.jpg  102 kb
 
iabbott :

こんにちは、

私はジャーナルに最後の "完全な "バーのいくつかのパラメータを印刷しようとしていますが、私は保存されたシリーズデータを更新していないか、それをソートしていないと推測します(しかし、私はそれを時間によってソートし、私が望むバーを取得する方法も見つけることができません)、私の結果は常に履歴の2番目のバーであり、前の完全なバーのリアルタイムデータを更新したことはありません...次に、直近の完全なバーのサイズを、過去10~20本のバーと比較したいのですが、 何か良い方法があれば教えてください!

私はこのアクションを "New Bar "イベントで実行して います:

ジャーナル結果のスクリーンショットを添付します。

このような結果を得るプログラムのソースコードを添付してください。

新しいバーの開始時にどの時間枠のバーを受信したいですか?

 

こんにちは、

Pt39のTestDoEasy EAの新しいバーイベントにコードブロックを追加しました。

新しいバーのオープンで、イベントをトリガーしたタイムフレームのバー履歴をチェック したいのですが、イベントは各タイムフレームで別々にトリガーされるので、このチェックをイベントの一部として置く方が簡単だと思いました。

ありがとうございます。

ファイル:
 

最新情報は?

僕のやり方が悪いのかな?もしライブラリーに問題があるのなら、誰かがもっと早く見つけているはずだと思うんだけど... :)

ありがとう!

 
iabbott:

最新情報は?

僕のやり方が悪いのかな?もしライブラリーに問題があるのなら、誰かがもっと早く見つけているはずだと思うんだが......)

ありがとう!

申し訳ない。忙しかったんだ。すぐに問題を解決するよ。
 

Artyomさん、CEngine::SeriesSync() で行っているように、::Comment()を使って チャートのコメントに記述するライブラリについて、具体的なアイデアはありますか?

void CEngine::SeriesSync(SDataCalculate &data_calculate,const uint required=0)
  {
//...
      //--- 空の時系列データをチャートのコメントとして表示し、時系列データをサーバーのデータと同期させてみる。
      ::Comment(series.Header(),": ",CMessage::Text(MSG_LIB_TEXT_TS_TEXT_WAIT_FOR_SYNC));
      ::ChartRedraw(::ChartID());

//...
            //--- チャートのコメントと、再作成された時系列データによるジャーナルエントリを表示する。
            ::Comment(series.Header(),": OK");
            ::ChartRedraw(::ChartID());
            Print(series.Header()," ",CMessage::Text(MSG_LIB_TEXT_TS_TEXT_CREATED_OK),":");
            series.PrintShort();

//...
     //--- すべてのコメントを削除する
      ::Comment("");
      ::ChartRedraw(::ChartID());
  }

個人的な意見ですが、これはライブラリのユーザーに任せるのがベストだと思います。私は、チャートコメントを操作してEAの主要な運用面を出力する独自のライブラリを持っているので、DoEasyライブラリからの干渉は避けたいと強く思っています。その点で、今後の計画は?

 
Dima Diall :

Artyomさん、CEngine::SeriesSync() のように、::Comment()を使って チャートのコメントに書くライブラリの具体的なアイデアはありますか?

個人的な意見ですが、これはライブラリのユーザーに任せるのがベストだと思います。私は、チャートコメントを操作してEAの主要な運用面を出力する独自のライブラリを持っているので、DoEasyライブラリからの干渉は避けたいと強く思っています。その点で、今後の計画は?

将来的にグラフィックを使った作業が あれば、標準的なコメントはなくなるでしょう。

 

こんにちは - イベントハンドラのコードをより詳しく見てみると、イベントのソースを解析するために異なるメソッドを使用していることに気づきました...OnChartEvent() からのチャートイベントID パラメータに基づいて いる場合もあれば、engine.EventSource(lparam)を介して lparam パラメータから抽出している場合もあります。

void OnDoEasyEvent(const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
  {
   int idx=id-CHARTEVENT_CUSTOM;
//--- lparamから(1)イベント時刻ミリ秒、(2)理由、(3)ソースを取得し、(4)正確なイベント時刻を設定する。
   ushort msc=engine.EventMSC(lparam);
   ushort reason=engine.EventReason(lparam);
   ushort source=engine.EventSource(lparam);
   long time=TimeCurrent()*1000+msc;
   
//--- シンボル・イベントの処理
   if(source==COLLECTION_SYMBOLS_ID)
     {
      //...
     }
//--- Handling account events
   else if(source==COLLECTION_ACCOUNT_ID)
     {
      //...
     }
//--- Handling market watch window events
   else if(idx>MARKET_WATCH_EVENT_NO_EVENT && idx<SYMBOL_EVENTS_NEXT_CODE)
     {
      //...
     }
//--- Handling timeseries events
   else if(idx>SERIES_EVENTS_NO_EVENT && idx<SERIES_EVENTS_NEXT_CODE)
     {
      //...
     }
//--- Handling trading events
   else if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE)
     {
      //...
     }