ライブラリ: カレンダー - ページ 4

 
fxsaber:

これはできない。専門家に連絡してください。

もちろんです。ありがとう。
 
すべてのニュースイベントが正しくダウンロードされているにもかかわらず、バックテストが 約5年間(2017年以降)に制限されているようです(BINファイルは67MB)。MT5がバックテスト用のメモリで処理できるイベント数に制限があるのでしょうか?
 
mqtrader #:
すべてのニュースイベントが正しくダウンロードされているにもかかわらず、バックテストが約5年間(2017年以降)に制限されているようです(BINファイルは67MB)。MT5がバックテスト用のメモリで処理できるイベント数に制限があるのでしょうか?
#property script_show_inputs

#include <fxsaber\Calendar\Calendar.mqh> //https://www.mql5.com/ja/code/32430

input bool inFromFile = false;

#define  CALENDAR_FILENAME "Calendar.bin" // カレンダーを読み書きするためのファイル名。

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // カレンダーを全部使った。
    Calendar.Save(CALENDAR_FILENAME); // 65 MB。
  }
  
  Print(Calendar[0].ToString());
}


結果

2007.01.06 23:30 USD 1 CFTC Crude Oil Non-Commercial Net Positions(cftc-crude-oil-non-commercial-net-positions), United States(US) | 2.2 K |  | 19.8 K | 

カレンダーデータベースの最初のイベントは2007年1月です。

 
Forecast "の値が2017.05.05から始まっていることに今気づきました。他の値はその日より前に使用できます。

fxsaberさん、大変便利なライブラリをありがとうございました!
 

イベントカレンダーは、大幅に未来に向かって規定されています。そのため、あらかじめMT5のデータからファイルを保存しておけば、MT4でリマインダーを使用することができます(たとえば、1ヶ月前)。

これは、私がMT4でやっていることです。

MT4でカレンダーを使う手順。


1.MT5でカレンダーをCommonファイルに保存するスクリプトを実行する。

#include <fxsaber\Calendar\Calendar.mqh> //https://www.mql5.com/ja/code/32430

#define  CALENDAR_FILENAME "Calendar.bin" // カレンダーを読み書きするためのファイル名。

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // カレンダーを全部使った。
  Calendar.Save(CALENDAR_FILENAME, true); // カレンダーを記録。> 65 MBを超える。
}


2.共通ファイルからMT4にカレンダーをロードする。


例として、MT4で現在のシンボルの通貨に関する重要なイベントのリマインダーを以下に示します。

#include <fxsaber\Calendar\Calendar.mqh> //https://www.mql5.com/ja/code/32430

#define  CALENDAR_FILENAME "Calendar.bin" // カレンダーを読み書きするためのファイル名。

int OnInit()
{
  return(!EventSetTimer(1));
}

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // カレンダーが空でない場合。
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // 未来のイベントを見つけた。
    
    Comment(Calendar.ToString(Pos, 5, true)); // プリントアウトした。
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // カレンダーをファイルからロード。
  {
    string Currencies[2];
    
    // 現在の文字の通貨を取得します。
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // シンボルの通貨にイベントを残す。
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // 重要な出来事だけが残された。
  }    
}


起動後、チャートが更新され(カウントダウン)、シンボルの通貨の重要なイベントのリマインダーがMT4で直接表示されます。


同様にCalendarもMT4-Testerで動作します。

 
Mark Taylor #:

しかし、カレンダーファイルの標準ダウンロードを行うと、次のような問題が発生する。

その後、開始時間を設定し、各通貨のループでこの時間以降のイベントを取得します。

ソースが読めるように貼り付けてみてください。

 

力強い労働をありがとう。

もちろん、このような仕事は、開発され、修正され、ドキュメント、コミュニティ全体、一人ではなく、記述されるべきです。しかし、何らかの理由で、管理自体がそのような規定を与えていないだけでなく、適切な組織のために、同じGitHubへのリンクを挿入していません。プロジェクトは ありますが、その使用は、ほとんど同じGitHubです。

ありがとうございました!コードのために、それは正直なところ、このようなコードを読むことは非常に興味深いです:オーバーロードテンプレート コメントの欠如 ))この創造性の 価値が何であるか、5分はそれが何であるかを考えた:クラスのインスタンスまたはデータを持つ配列。一般的に、脳の発達のためのすべて。
CALENDAR Calendar;
Calendar[i].time
もちろん、仕事はクールです、あなたはそれがどのように動作するかを理解する必要があります。
 

をマージした後、配列全体を時間順にソートする関数があればいいのですが。

int operator +=( const CALENDAR &Value )
  {
    const int Size1 = this.GetAmount();
    const int Size2 = Value.GetAmount();

    if (!Size1)
      for (int i = ::ArrayResize(this.Events, Size2) - 1; i >= 0; i--)
        this.Events[i] = Value.Events[i];
    else if (Size2)
    {
      EVENT Array[];

      ::ArrayResize(Array, Size1 + Size2);

      int i = 0;
      int j = 0;
      int k = 0;

      while ((i < Size1) && (j < Size2))
        Array[k++] = (this.Events[i] < Value.Events[j]) ? this.Events[i++] : Value.Events[j++];

      while (i < Size1)
        Array[k++] = this.Events[i++];

      while (j < Size2)
        Array[k++] = Value.Events[j++];

    #ifdef __MQL5__
      ::ArraySwap(this.Events, Array);
    #else // #ifdef __MQL5__
      ::ArrayFree(this.Events);

      ::ArrayCopy(this.Events, Array);
    #endif // #ifdef __MQL5__ #else
    }

    return(this.GetAmount());
  }
bool operator <( const EVENT &Value ) const
  {
    return(!Value.time || (this.time < Value.time));
  }
 
BillionerClub #:

をマージした後、配列全体を時間順にソートしてくれるとうれしい。

そうならない例を挙げてください。

 
fxsaber #:

そうでない例を挙げてほしい。

あなたのコードはわかりにくいですが、上のコードでは最終的なソートが行われていると思いますが、おそらくそのコードには誤りがあります。あまりないことですが、配列をマージするとき、配列の中で最も新しい要素はより長い期間を持つはずなので、最終的な配列はソートがないという形でエラーになります。

2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 08:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 13:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 16:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 20:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.05 00:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.07 00:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
   int totall = Calendar+=Calendar3;

for(int i=0;i<totall;i++)
  {
   Print(TimeToString(Calendar[i].time));
  }