無料でロボットをダウンロードする方法を見る
Facebook上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
エキスパート

Download all ticks of a symbol's history - MetaTrader 5のためのエキスパート

ビュー:
95
評価:
(5)
パブリッシュ済み:
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

このエキスパートアドバイザーのコードは、ユーザーのブローカーのマーケットウォッチをスキャンし、すべての利用可能なティック、または日付までのティックをダウンロードするシンボルを抽出します。

それはあなたのバックテストのためにすべてのシンボルの履歴をダウンロードしたり、これらのティックからカスタムチャートを作成するのに役立つことがあります。

端末はデータフォルダにティックをキャッシュしますので、ハードドライブに十分な空き容量があることを確認してください。

シンボルのダウンロードを容易にするために、まずダウンロードマネージャーが必要です。

構造体CDownloadManagerには、保持する必要のあるすべての情報が含まれています。

struct CDownloadManager
  {
   bool              m_started,m_finished;
   string            m_symbols[],m_current;
   int               m_index;

  • ダウンロードの状態(開始/終了)
  • スキャンするシンボルのリスト
  • 現在のシンボル
  • スキャン中のシンボルのインデックス

シンボルを扱うので、バイナリファイルから文字列を書き込んだり読み込んだりするための簡単な関数を2つ作ります。

文字列をファイルに保存する関数:

void writeStringToFile(int f,string thestring)
  {
//シンボル文字列を保存
   char sysave[];
   int charstotal=StringToCharArray(thestring,sysave,0,StringLen(thestring),CP_ACP);
   FileWriteInteger(f,charstotal,INT_VALUE);
   for(int i=0;i<charstotal;i++)
     {
      FileWriteInteger(f,sysave[i],CHAR_VALUE);
     }
  }

文字列をファイルに保存する関数:

  • ファイル・ハンドルfと バイナリ・フラグFILE_WRITE|FILE_BINを 受け取ります。
  • ファイルに書き込む文字列

文字列の長さを整数で書き込み、各文字を文字列に格納する。

ファイルから文字列をロードする関数:

string readStringFromFile(int f)
  {
   string result="";
//シンボル文字列のロード
   char syload[];
   int charstotal=(int)FileReadInteger(f,INT_VALUE);
   if(charstotal>0)
     {
      ArrayResize(syload,charstotal,0);
      for(int i=0;i<charstotal;i++)
        {
         syload[i]=(char)FileReadInteger(f,CHAR_VALUE);
        }
      result=CharArrayToString(syload,0,charstotal,CP_ACP);
     }
   return(result);
  }

ファイルから文字列をロードする関数:

  • バイナリ読み込み用にオープンされたファイルのファイルハンドルf、フラグFILE_READ|FILE_BIN

各文字をchar配列に読み込み、そのchar配列から文字列を作成し、文字列としてロードした結果として返されます。

CDownloadManager構造体に戻る。マネージャーを初期化し、マーケット・ウォッチからそれを埋める方法が必要だ:

   //+------------------------------------------------------------------+
   //| マーケット・ウォッチからシンボルをつかむ|
   //+------------------------------------------------------------------+
   void              grab_symbols()
     {
      //MWからのみ!
      int s=SymbolsTotal(true);
      ArrayResize(m_symbols,s,0);
      for(int i=0;i<ArraySize(m_symbols);i++)
        {
         m_symbols[i]=SymbolName(i,true);
        }
     }

とても簡単だ:

  • マーケット・ウォッチにある(アクティブな)シンボルの数を尋ねる。
  • それらを受け取るためにm_symbols配列のサイズを変更する。
  • 総シンボルにループを回し、シンボル名を要求する。

シンボルデータのダウンロードを管理する責任もあるので、基本的にマネージャーとなる関数が必要になる:

   //+------------------------------------------------------------------+
   //| シンボル・プロセスのダウンロードを管理する|
   //+------------------------------------------------------------------+
   void              manage(string folder,string filename)
     {
      //基本的に、これは次のシンボルを開始またはナビゲートする
      //設定されている場合
      if(ArraySize(m_symbols)>0)
        {
         //開始されていない場合
         if(!m_started)
           {
            m_started=true;
            // 最初のシンボルへ
            m_current=m_symbols[0];
            m_index=1;
            save(folder,filename);
            if(_Symbol!=m_current)
              {
               ChartSetSymbolPeriod(ChartID(),m_current,_Period);
              }
            else
              {
               ENUM_TIMEFRAMES new_period=PERIOD_M1;
               for(int p=0;p<ArraySize(TFS);p++)
                 {
                  if(_Period!=TFS[p])
                    {
                     new_period=TFS[p];
                     break;
                    }
                 }
               ChartSetSymbolPeriod(ChartID(),m_current,new_period);
              }
            return;
           }
         //開始された場合
         else
           {
            m_index++;
            if(m_index<=ArraySize(m_symbols))
              {
               m_current=m_symbols[m_index-1];
               save(folder,filename);
               if(_Symbol!=m_current)
                 {
                  ChartSetSymbolPeriod(ChartID(),m_current,_Period);
                 }
               return;
              }
            else
              {
               m_finished=true;
               FileDelete(folder+"\\"+filename);
               Print("Finished");
               ExpertRemove();
               return;
              }
           }
        }
      else
        {
         Print("Please grab symbols first");
        }
      //セットがここで終わる場合
     }

システムの仕組み

  • チャートが開き、1つのチャートが必要となり、タイマーがセットされる。
  • タイマーが実行され、タイマーをキャンセルする。
  • 新規ダウンロードか継続ダウンロードかをチェックする。
  • 新規ダウンロードの場合、すべてのシンボルを取得して設定する。
  • 継続ダウンロードであれば、現在のシンボルのデータをダウンロードする

これがタイマーでダウンロードを行うコードの部分である:

//+------------------------------------------------------------------+
//|タイマー|
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- 同期している場合
   if(SymbolIsSynchronized(_Symbol)&&TerminalInfoInteger(TERMINAL_CONNECTED)==1)
     {
      EventKillTimer();
      //--- ここにシステムをロードする
      if(MANAGER.load(MANAGER_FOLDER,MANAGER_STATUS_FILE))
        {
         //--- システムがロードされたので、ここでシンボルをスキャンしている
         Comment("System loaded and we are processing "+MANAGER.m_current);
         //--- ティックロード

         //--- ブローカーで利用可能な最も古いティックを最初に見つける
         int attempts=0;
         int ping=-1;
         datetime cursor=flatten(TimeTradeServer());
         long cursorMSC=((long)cursor)*1000;
         long jump=2592000000;//60*60*24*30*1000;

         MqlTick receiver[];
         long oldest=LONG_MAX;
         Comment("PleaseWait");
         while(attempts<5)
           {
            ping=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,cursorMSC,1);
            if(ping==1)
              {
               if(receiver[0].time_msc==oldest)
                 {
                  attempts++;
                 }
               else
                 {
                  attempts=0;
                 }
               if(receiver[0].time_msc<oldest)
                 {
                  oldest=receiver[0].time_msc;
                 }
               cursorMSC-=jump;
               if(limitDate&&receiver[0].time<=oldestLimit)
                 {
                  break;
                 }
              }
            else
              {
               attempts++;
              }

            Sleep(44);
            Comment("Oldest Tick : "+TimeToString((datetime)(oldest/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"\nCursor("+TimeToString((datetime)(cursorMSC/1000),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+")\nAttempts("+IntegerToString(attempts)+")\nPlease wait for response...");
           }
         //--- この時点で、最も古いティックがある。
         //--- 古いものから新しいものへと刻みのリクエストを開始する。
         if(oldest!=LONG_MAX)
           {
            ArrayFree(receiver);
            datetime newest_tick=0;
            //--- symbol_timeに格納されている、このシンボルの最後のティックの時刻を受け取る。
            datetime most_recent_candle=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_TIME);
            while(newest_tick<most_recent_candle)
              {
               //--- 指定された目盛りの制限で、最も古い時間から始まる新しいバッチを要求する。
               int pulled=CopyTicks(_Symbol,receiver,COPY_TICKS_ALL,oldest,tick_packets);
               if(pulled>0)
                 {
                  //--- 新しいバッチを取り出したら、ダウンロードした時間を更新する。
                  newest_tick=receiver[pulled-1].time;
                  oldest=receiver[pulled-1].time_msc;
                  ArrayFree(receiver);
                 }
               //--- タイムアウトサーバーリクエスト。
               Sleep(44);
               Comment("Pulled up to "+TimeToString(newest_tick,TIME_DATE|TIME_MINUTES|TIME_SECONDS)+" so far");
              }
           }
         else
           {
            Alert("Please close the terminal \n head over to the ticks folder \n and delete the empty folders");
            ExpertRemove();
           }
         //--- マネージャーを更新し、次に進む
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
        }
      else
        {
         //--- ダウンロードを開始するには、マーケット・ウォッチ・シンボルを入手する。
         Comment("Grabbing MW and starting");
         MANAGER.grab_symbols();
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
        }
     }
  }


MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/56324

MACDカラーヒストグラム MACDカラーヒストグラム

MACDカラーヒストグラムは、古典的なMACD(移動平均収束ダイバージェン ス)インディケータの改良版で、市場のモメンタムをより明確かつ直感的 に視覚的に分析できるように設計されています。このインディケータは、伝統的なMACDの機能と、MACDラインとシグナ ル・ラインの関係に基づいて色が変化するダイナミック・ヒストグラムを組み合 わせており、トレーダーは市場のトレンド、反転ポイント、優柔不断の瞬間を素早く 識別することができます。

Multiple EA Tracking with a Magic Number Based Profit and Loss Live Dashboard in MQL5 Multiple EA Tracking with a Magic Number Based Profit and Loss Live Dashboard in MQL5

複数の取引ロボットを同時に稼働させている場合でも、洗練されたストラテジーを1つだけ稼働させている場合でも、各Expert Advisorのパフォーマンスを追跡するのは意外と時間がかかるものです。MetaTrader 5(MT5)は「ツールボックス」に注文とポジションを表示するのが便利ですが、多数のロボットが同じ口座を共有している場合、どのEAが利益または損失を生み出しているかを把握するのが難しくなります。1つの口座に数十から数百の取引があり、それぞれが異なるEAによって開設されている可能性があり、1つのロボットの結果と他のロボットの結果を分けることが難しくなります。

Useful #define statements Useful #define statements

これらは、EAで演算を行う際に便利な#define文です。ファイルの先頭で変数名を代入するだけで、他の#define文に処理を任せることができます。 このファイルを使用するには、EAファイルの先頭行に#include<DEFINE_statements.mqh> を追加してください。

Self Optimized SMA Self Optimized SMA

このインディケータは2本の線を描画します。下 線 は 、上 昇 し た 直 近 の SMA期間に基づいて計算されます。上側の線は、下降した直近のSMA期間に基づいて計算されます。