หน้าแรก การเทรดด้วยระบบ โพสต์

ดาวน์โหลดประวัติการเคลื่อนไหวของสัญลักษณ์ใน MetaTrader 5

ไฟล์แนบ
56324.zip (3.28 KB, ดาวน์โหลด 0 ครั้ง)

สวัสดีครับเพื่อนนักเทรด! วันนี้เราจะมาพูดถึงการดาวน์โหลดข้อมูลการเคลื่อนไหวของสัญลักษณ์ใน MetaTrader 5 ที่เราสามารถใช้ในการทดสอบย้อนหลังหรือสร้างกราฟแบบกำหนดเองได้

โค้ด EA นี้จะช่วยให้เราสามารถสแกนตลาดของโบรกเกอร์และดาวน์โหลดข้อมูลการเคลื่อนไหว (ticks) ทั้งหมดที่มี หรือดาวน์โหลดจนถึงวันที่กำหนด

อย่าลืมตรวจสอบให้แน่ใจว่ามีพื้นที่ว่างในฮาร์ดดิสก์เพียงพอครับ เพราะข้อมูล ticks จะถูกเก็บในโฟลเดอร์ข้อมูล

เพื่อเริ่มกระบวนการดาวน์โหลดสัญลักษณ์ เราต้องมี Download Manager ก่อน โดยโครงสร้าง CDownloadManager จะจัดเก็บข้อมูลที่เราต้องการ

struct CDownloadManager
{
   bool m_started,m_finished;
   string m_symbols[],m_current;
   int m_index;
};
  • สถานะการดาวน์โหลด (เริ่มต้น/เสร็จสิ้น)
  • รายการสัญลักษณ์ที่ต้องการสแกน
  • สัญลักษณ์ปัจจุบัน
  • ดัชนีของสัญลักษณ์ที่กำลังสแกน

เรายังต้องอ่านและเขียนข้อมูลไปยังฮาร์ดดิสก์ และเนื่องจากเราทำงานกับสัญลักษณ์ เราจึงสร้างฟังก์ชันง่าย ๆ สองฟังก์ชันเพื่อเขียนและอ่านสตริงจากไฟล์ไบนารี

ฟังก์ชันสำหรับบันทึกสตริงลงไฟล์:

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);
     }
}

ฟังก์ชันนี้รับ:

  • handle ของไฟล์ 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);
}

ฟังก์ชันนี้รับ:

  • handle ของไฟล์ f ซึ่งเปิดสำหรับอ่านในรูปแบบไบนารี, ธง FILE_READ|FILE_BIN

การทำงานของระบบนี้ค่อนข้างเข้าใจง่าย:

  • เปิดกราฟหนึ่งกราฟและตั้งเวลา
  • เมื่อเวลาถึงจะทำการตรวจสอบว่ามีการดาวน์โหลดใหม่หรือดาวน์โหลดต่อเนื่อง
  • หากเป็นการดาวน์โหลดใหม่ เราจะจัดเตรียมการโดยการสแกนสัญลักษณ์ทั้งหมด
  • หากเป็นการดาวน์โหลดต่อเนื่อง เราจะดาวน์โหลดข้อมูลสำหรับสัญลักษณ์ปัจจุบัน

นี่คือส่วนของโค้ดที่ทำการดาวน์โหลดข้อมูลเมื่อถึงเวลา:

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;
          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;
            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");
          }
      }
         MANAGER.manage(MANAGER_FOLDER,MANAGER_STATUS_FILE);
      }
      else
         {
            Alert("Please close the terminal \n head over to the ticks folder \n and delete the empty folders");
            ExpertRemove();
      }
     }
    }

นี่คือวิธีการทำงานของระบบนี้:

  • เปิดกราฟและตั้งเวลาสำหรับดาวน์โหลด
  • เมื่อถึงเวลาจะมีการตรวจสอบสถานะการดาวน์โหลด
  • หากเป็นการดาวน์โหลดใหม่ เราจะรวบรวมสัญลักษณ์จากตลาด
  • หากเป็นการดาวน์โหลดต่อเนื่อง เราจะดาวน์โหลดข้อมูลสำหรับสัญลักษณ์ที่กำลังทำการประมวลผล

โพสต์ที่เกี่ยวข้อง

ความคิดเห็น (0)