EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: linconz on ตุลาคม 10, 2012, 11:02:52 pm
-
ท่าน Admin ผมได้โค๊ด อ่านราคาจากไฟล์ hist มาตามนี้
int f0_2() {
double ld_8;
double ld_16;
double ld_24;
int li_0 = FileOpenHistory(gs_328, FILE_BIN|FILE_READ);
gi_288 = (FileSize(li_0) - 148) / 44;
ArrayResize(gia_308, gi_288);
ArrayResize(gda_320, gi_288);
ArrayResize(gda_324, gi_288);
FileSeek(li_0, 148, SEEK_SET);
for (int li_4 = 0; li_4 < gi_288; li_4++) {
gia_308[li_4] = FileReadInteger(li_0, LONG_VALUE);
ld_8 = FileReadDouble(li_0, DOUBLE_VALUE);
gda_324[li_4] = FileReadDouble(li_0, DOUBLE_VALUE);
gda_320[li_4] = FileReadDouble(li_0, DOUBLE_VALUE);
ld_16 = FileReadDouble(li_0, DOUBLE_VALUE);
ld_24 = FileReadDouble(li_0, DOUBLE_VALUE);
if (GetLastError() == 4099/* END_OF_FILE */) break;
}
FileClose(li_0);
return (0);
}
ทีนี้ผมอยากทราบว่า array ที่เรียงไว้จะเป็นราคา i = 0 คือราคาปัจจุบันเลยหรือป่าว
ผมอยากทราบว่า ถ้าผมเทสที่ 5 นาที ผมจะต้องอ่านไฟล์ 5 นาทีด้วยใช่มั๊ย ครับ
แล้วค่าที่อ่านได้มีอะไรบ้าง ผมค่อนข้างงง ผมจะพยายามเทสทีละ หลายๆคู่ครับ
integer ในแถวแรกหมายถึงอะไร ผมไปเปิดดูโดยเป็น binary เหมือนปันเป็น address แล้วเราจะทราบได้อย่างไรว่า
ที่ราคาปัจจุบัน address เท่าไหร่ รบกวนด้วยครับ
-
FileOpenHistory มันคือ เป็นคำสั่งที่ใช้เปิดไฟล์ที่ถูกเก็บไวที่ Folder
/HISTORY/<current broker> ก็เหมือนคำสั่ง fileopen เพื่อเปิดการอ่านไฟล์ครับ
คำสั่ง FileSeek(li_0, 148, SEEK_SET); เพื่อชี้ Pointer ไปยังตำแหน่งในไฟล์ โดยเริ่มจากจุดเริ่มต้นไปสุดที่ 148 byte
แค่ 2 ตัวนี้ก็พอบอกได้แล้วครับว่า เป้นการเขียนไฟลืและการอ่านไฟล์ ที่คุณถามว่าi = 0 คือราคาปัจจุบันเลยหรือป่าว จึงไม่น่าใช้ครับ ราคาปัจจุบันน่าจะอยู่ตำแหน่งไบต์สุดท้ายที่เขียนล่าสุดครับ
-
ท่านลอง sample อ่านราคาปัจจุบันให้ผมดู ซักอัน หน่อยครับยังไม่ค่อยเข้าใจเท่าไหร่
-
int start()
{
int time;
double open;
double close;
double volume;
double high;
double low;
int li_0 = FileOpenHistory("EURUSD240.hst", FILE_BIN|FILE_READ);
double gi_288 = (FileSize(li_0) - 148) / 44;
int li_4;
FileSeek(li_0, 148, SEEK_SET);
for (li_4 = 0; li_4 < gi_288; li_4++) {
time = FileReadInteger(li_0, LONG_VALUE);
open = FileReadDouble(li_0, DOUBLE_VALUE);
low = FileReadDouble(li_0, DOUBLE_VALUE);
high = FileReadDouble(li_0, DOUBLE_VALUE);
close = FileReadDouble(li_0, DOUBLE_VALUE);
volume = FileReadDouble(li_0, DOUBLE_VALUE);
}
FileClose(li_0);
Print ("Time : ",time);
Print ("Open : ",open);
Print ("High :",high);
Print ("low : ",low);
Print ("close :",close);
Print ("volume :",volume);
return(0);
}
-
double gi_288 = (FileSize(li_0) - 148) / 44;
อันนี้ไม่เข้าใจครับ ทำไมต้อง 148 แล้ว หารด้วย 44 ทำไมครับ
FileSeek(li_0, 148, SEEK_SET); อันนี้คือเลื่อน point ไป 148 จากต้นไฟล์ใช่มั๊ยครับ
ช่วยผมด้วยผมกำลังจะทำสิ่งที่ยิ่งใหญ่ 5555
-
double gi_288 = (FileSize(li_0) - 148) / 44;
เป็นการคำนวณหาตำแหน่งไบต์ครับ การเอ่านไฟลืแบบไบานารี ถ้าเราอ่านไบต์เริ่มไม่ถูกก็จะอ่านข้อมูลออกมาไม่ถูกต้องครับ ที่ถามว่า ทำไม ขนาดไฟลื ลบด้วย 148 แล้วยังต้องหารด้วย 44 ใช่ไหมครับ ตรงนี้เป้นสูตรที่คนที่เขียนฟังก์ชั่นอ่านค่า history ทราบครับว่าไฟล์ binary ของ history มีโครงสร้างข้อมูลอย่างไร ถึงอ่านค่าได้ถูกต้องครับ
-
งั้นถ้าให้ผมเดา 148 ไบต์นี่จะเป็น พวก header ต่างๆของไฟล์ใช่มั๊ยครับ ถึงต้องลบออก และ หนึ่งชุดข้อมูล มี 44 ไบต์ ใช่มั๊ยครับ
แล้วค่าพวกนี้ เอามาจากไหน ผมเปิด help อ่านก็ไม่มีครับ
-
ใช่ครับ ลองเปลี่ยนเป็นค่านี้ดูครับ จะเจอ ราคาที่ถูกเก็บอยู่กลางไฟลืครับ
double gi_288 = (FileSize(li_0) - 148) / 88;
ส่วนค่าพวกนี้ใน help ไม่มีหรอกครับ คนที่รู้เค้าต้องลองผิดลองถูกมาเองครับ
-
ใช่ครับ ลองเปลี่ยนเป็นค่านี้ดูครับ จะเจอ ราคาที่ถูกเก็บอยู่กลางไฟลืครับ
double gi_288 = (FileSize(li_0) - 148) / 88;
ส่วนค่าพวกนี้ใน help ไม่มีหรอกครับ คนที่รู้เค้าต้องลองผิดลองถูกมาเองครับ
หลังจากงมอยู่ซักพัก ก็เจอแสงสว่างเล็กๆ
สำหรับการอ่านค่า ไม่ต้องใช้ for ครับ ผมก็งงตั้งนานทำไมท่านใช้ for
int li_4;
FileSeek(li_0, 148, SEEK_SET);
for (li_4 = 0; li_4 < gi_288; li_4++) {
time = FileReadInteger(li_0, LONG_VALUE);
open = FileReadDouble(li_0, DOUBLE_VALUE);
low = FileReadDouble(li_0, DOUBLE_VALUE);
high = FileReadDouble(li_0, DOUBLE_VALUE);
close = FileReadDouble(li_0, DOUBLE_VALUE);
volume = FileReadDouble(li_0, DOUBLE_VALUE);
}
ใน 1 ชุดข้อมูล จะเก็บตัวแปรได้ 44 ไบต์ ซึ่งอันนี้ยังไม่รู้ว่าเก็บอะไรบ้าง เวลาอ่านอ่านตามนี้เลย ตัว pointer จะ shift ไปข้อมูลตัวต่อไปเอง(ภายในชุดเดียวกัน)
แต่ถ้าต้องการจะใช้ข้อมูลชุดต่อไป(แท่งเทียนอื่น) ต้องเลื่อนที่ fileseek ไปทีละ 44 ไบต์
เป็น FileSeek(li_0, 148+(n*44), SEEK_SET);
การเก็บข้อมูลของ binary จะเป็นประมาณนี้
148 byte ---------------> header of file
44 byte ----------------> ข้อมูลชุดที่ 1
44 2
44 3
44
44
.
.
. byte ----------------> ข้อมูลชุดที่ n
ไม่มี byet ปิดท้าย เป็น end of file เลย
หวังว่าคงมีประโยชน์กับหลายๆคนน๊ะครับ
ใกล้ความจริงแล้ว เมกะโปรเจคพันล้านใหญ่สุดในเจ็ดโลก 555
-
เจอทางตันอีกแล้วท่านนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนน
ส่งออร์เดอร์ข้าม pair ไม่ได้ ???
-
44 มาจากขนาดของ ตัวแปร ครับ ที่มี double 5 ตัว int 1 ตัวครับ เท่ากับ 8*5 + 4*1 = 44 byte ส่วน for มาจากต้นแบบครับผมเอา code ต้นแบบที่คุณให้ไวมาแก ไม่ได้ลบออกตอนแรกเค้าใช่ for เพื่อนำค่ามาเก็บใน array แล้วการส่ง order ข้าม pair ไม่ได้คืออะไรครับ งงง
-
คือ เทส eu อยู่ ผมอ่านราคา uj แล้วจะส่งออร์เดอร์ uj ครับ
มัน unknow symbol
555 สงสัยต้องไปค้นหนังสือ vba จากลังเอามาเขียนเทสใน excel ซะแล้วซิ
เฮ้อโปรเจคพันล้าน คงปวดหัวอีกหลายอาทิตย์
-
อืมมมม นึกออกแล้ว อีกวิธีคือ มีโปรแกรมพวก server emulator มั๊ยท่าน เอามาลงในเครื่องเรา แล้วอ่าน tick จากไฟล์ hst เอาน่ะ
เคยได้ยินได้เห็นผ่านๆมาบ้างมั๊ยท่าน
-
โปรเจคอะไรหว่าลึกลับจัง
ทำไมถึงไม่อ่านราคาบนกราฟ ต้องไปอ่านเอาจากไฟล์แทนละครับ
-
โปรเจคอะไรหว่าลึกลับจัง
ทำไมถึงไม่อ่านราคาบนกราฟ ต้องไปอ่านเอาจากไฟล์แทนละครับ
อ่อ ไม่มีอะไรหรอกครับ แค่เบื่อการนั่งเฝ้ากราฟ รอการจุดฟลุ เลยจะหาโปรเจคทำ money generator แค่นั้นแหละ
strategy ที่มีอยู่ในตอนนี้มันก็เดิมๆ ตามตลาดเลยอยากหา strategyอื่นๆที่ยั่งยืนแบบไม่ล้างและได้สม่ำเสมอ แบบเปิดทิ้งได้เลย
แค่แบ๊คเทสทีละหลายๆคู่พร้อมกันน่ะครับ ก็เลยต้องอ่านค่าของคู่อื่นด้วย
เคยอ่านเจอแว๊บๆ ที่ไหนไม่รู้ ว่า mt5 สามารถ multipair backtest ได้
-
แบคเทสทีละหลายคู่พร้อมกัน โอ้โปรเจคนี้สุดยอดครับ
ทำได้แล้วโปรดแชร์ด้วย อิอิ