สวัสดีครับเพื่อนนักเทรด! วันนี้เราจะมาพูดถึงการดาวน์โหลดข้อมูลการเคลื่อนไหวของสัญลักษณ์ใน 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();
}
}
}
นี่คือวิธีการทำงานของระบบนี้:
- เปิดกราฟและตั้งเวลาสำหรับดาวน์โหลด
- เมื่อถึงเวลาจะมีการตรวจสอบสถานะการดาวน์โหลด
- หากเป็นการดาวน์โหลดใหม่ เราจะรวบรวมสัญลักษณ์จากตลาด
- หากเป็นการดาวน์โหลดต่อเนื่อง เราจะดาวน์โหลดข้อมูลสำหรับสัญลักษณ์ที่กำลังทำการประมวลผล
โพสต์ที่เกี่ยวข้อง
- JS-Chaos: ระบบเทรดอัจฉริยะสำหรับ MetaTrader 5
- Dematus: ระบบเทรดอัจฉริยะสำหรับ MetaTrader 5
- สร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณซื้อขายจาก Morning/Evening Stars + MFI
- สร้างสัญญาณการซื้อขายด้วย MQL5 Wizard: เทคนิค Hammer/Hanging Man และ CCI
- ใช้ MQL5 Wizard สร้าง Expert Advisor ด้วยสัญญาณเทรด Morning/Evening Stars + Stochastic