MetaTrader5
ดาวน์โหลดประวัติการเคลื่อนไหวของสัญลักษณ์ใน MetaTrader 5
สวัสดีครับเพื่อนนักเทรด! วันนี้เราจะมาพูดถึงการดาวน์โหลดข้อมูลการเคลื่อนไหวของสัญลักษณ์ใน 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(); } } } นี่คือวิธีการทำงานของระบบนี้: เปิดกราฟและตั้งเวลาสำหรับดาวน์โหลด เมื่อถึงเวลาจะมีการตรวจสอบสถานะการดาวน์โหลด หากเป็นการดาวน์โหลดใหม่ เราจะรวบรวมสัญลักษณ์จากตลาด หากเป็นการดาวน์โหลดต่อเนื่อง เราจะดาวน์โหลดข้อมูลสำหรับสัญลักษณ์ที่กำลังทำการประมวลผล
2025.02.22