Open Forex4you Account

Server รัน EA 1000 / ปี

สั่งชื้อคู่มือการโปรแรกม MQL4

Author Topic: อ่านราคา จาก hist  (Read 19385 times)

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
อ่านราคา จาก hist
« 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 เท่าไหร่ รบกวนด้วยครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: อ่านราคา จาก hist
« Reply #1 on: ตุลาคม 11, 2012, 12:15:19 am »
FileOpenHistory มันคือ เป็นคำสั่งที่ใช้เปิดไฟล์ที่ถูกเก็บไวที่ Folder
/HISTORY/<current broker>  ก็เหมือนคำสั่ง fileopen เพื่อเปิดการอ่านไฟล์ครับ


คำสั่ง FileSeek(li_0, 148, SEEK_SET); เพื่อชี้ Pointer ไปยังตำแหน่งในไฟล์ โดยเริ่มจากจุดเริ่มต้นไปสุดที่ 148 byte

แค่ 2 ตัวนี้ก็พอบอกได้แล้วครับว่า เป้นการเขียนไฟลืและการอ่านไฟล์ ที่คุณถามว่าi = 0 คือราคาปัจจุบันเลยหรือป่าว จึงไม่น่าใช้ครับ ราคาปัจจุบันน่าจะอยู่ตำแหน่งไบต์สุดท้ายที่เขียนล่าสุดครับ

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
Re: อ่านราคา จาก hist
« Reply #2 on: ตุลาคม 11, 2012, 10:33:02 pm »
ท่านลอง sample อ่านราคาปัจจุบันให้ผมดู ซักอัน หน่อยครับยังไม่ค่อยเข้าใจเท่าไหร่

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: อ่านราคา จาก hist
« Reply #3 on: ตุลาคม 12, 2012, 02:41:48 pm »
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);
  }

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
Re: อ่านราคา จาก hist
« Reply #4 on: ตุลาคม 12, 2012, 05:36:45 pm »
double  gi_288 = (FileSize(li_0) - 148) / 44;

อันนี้ไม่เข้าใจครับ ทำไมต้อง 148 แล้ว หารด้วย 44 ทำไมครับ

FileSeek(li_0, 148, SEEK_SET); อันนี้คือเลื่อน point ไป 148 จากต้นไฟล์ใช่มั๊ยครับ

ช่วยผมด้วยผมกำลังจะทำสิ่งที่ยิ่งใหญ่ 5555

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: อ่านราคา จาก hist
« Reply #5 on: ตุลาคม 12, 2012, 06:06:07 pm »
double  gi_288 = (FileSize(li_0) - 148) / 44;
เป็นการคำนวณหาตำแหน่งไบต์ครับ การเอ่านไฟลืแบบไบานารี ถ้าเราอ่านไบต์เริ่มไม่ถูกก็จะอ่านข้อมูลออกมาไม่ถูกต้องครับ ที่ถามว่า ทำไม ขนาดไฟลื ลบด้วย 148 แล้วยังต้องหารด้วย 44 ใช่ไหมครับ ตรงนี้เป้นสูตรที่คนที่เขียนฟังก์ชั่นอ่านค่า history ทราบครับว่าไฟล์ binary ของ history มีโครงสร้างข้อมูลอย่างไร ถึงอ่านค่าได้ถูกต้องครับ 

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
Re: อ่านราคา จาก hist
« Reply #6 on: ตุลาคม 12, 2012, 06:10:11 pm »
งั้นถ้าให้ผมเดา  148 ไบต์นี่จะเป็น พวก header ต่างๆของไฟล์ใช่มั๊ยครับ ถึงต้องลบออก และ หนึ่งชุดข้อมูล มี 44 ไบต์ ใช่มั๊ยครับ

แล้วค่าพวกนี้ เอามาจากไหน ผมเปิด help อ่านก็ไม่มีครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: อ่านราคา จาก hist
« Reply #7 on: ตุลาคม 12, 2012, 06:19:44 pm »
ใช่ครับ ลองเปลี่ยนเป็นค่านี้ดูครับ จะเจอ ราคาที่ถูกเก็บอยู่กลางไฟลืครับ

double  gi_288 = (FileSize(li_0) - 148) / 88;

ส่วนค่าพวกนี้ใน help ไม่มีหรอกครับ คนที่รู้เค้าต้องลองผิดลองถูกมาเองครับ

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
Re: อ่านราคา จาก hist
« Reply #8 on: ตุลาคม 13, 2012, 01:43:53 pm »
ใช่ครับ ลองเปลี่ยนเป็นค่านี้ดูครับ จะเจอ ราคาที่ถูกเก็บอยู่กลางไฟลืครับ

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

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
Re: อ่านราคา จาก hist
« Reply #9 on: ตุลาคม 13, 2012, 02:38:22 pm »
เจอทางตันอีกแล้วท่านนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนนน

ส่งออร์เดอร์ข้าม pair ไม่ได้ ???

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: อ่านราคา จาก hist
« Reply #10 on: ตุลาคม 13, 2012, 05:43:33 pm »
44 มาจากขนาดของ ตัวแปร ครับ ที่มี double 5  ตัว int 1 ตัวครับ เท่ากับ 8*5 + 4*1 = 44 byte  ส่วน for มาจากต้นแบบครับผมเอา code ต้นแบบที่คุณให้ไวมาแก ไม่ได้ลบออกตอนแรกเค้าใช่ for เพื่อนำค่ามาเก็บใน array  แล้วการส่ง order ข้าม pair ไม่ได้คืออะไรครับ งงง

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
Re: อ่านราคา จาก hist
« Reply #11 on: ตุลาคม 13, 2012, 07:14:12 pm »
คือ เทส eu อยู่ ผมอ่านราคา uj แล้วจะส่งออร์เดอร์ uj ครับ
มัน unknow symbol

555 สงสัยต้องไปค้นหนังสือ vba จากลังเอามาเขียนเทสใน excel ซะแล้วซิ

เฮ้อโปรเจคพันล้าน คงปวดหัวอีกหลายอาทิตย์

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
Re: อ่านราคา จาก hist
« Reply #12 on: ตุลาคม 13, 2012, 07:18:13 pm »
อืมมมม นึกออกแล้ว อีกวิธีคือ   มีโปรแกรมพวก  server emulator มั๊ยท่าน เอามาลงในเครื่องเรา แล้วอ่าน tick จากไฟล์ hst เอาน่ะ

เคยได้ยินได้เห็นผ่านๆมาบ้างมั๊ยท่าน   

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: อ่านราคา จาก hist
« Reply #13 on: ตุลาคม 13, 2012, 08:25:35 pm »
โปรเจคอะไรหว่าลึกลับจัง

ทำไมถึงไม่อ่านราคาบนกราฟ ต้องไปอ่านเอาจากไฟล์แทนละครับ

linconz

  • VIP
  • Sr. Member
  • *
  • Posts: 357
Re: อ่านราคา จาก hist
« Reply #14 on: ตุลาคม 14, 2012, 12:21:09 am »
โปรเจคอะไรหว่าลึกลับจัง

ทำไมถึงไม่อ่านราคาบนกราฟ ต้องไปอ่านเอาจากไฟล์แทนละครับ

อ่อ ไม่มีอะไรหรอกครับ แค่เบื่อการนั่งเฝ้ากราฟ รอการจุดฟลุ เลยจะหาโปรเจคทำ money generator แค่นั้นแหละ
strategy ที่มีอยู่ในตอนนี้มันก็เดิมๆ ตามตลาดเลยอยากหา strategyอื่นๆที่ยั่งยืนแบบไม่ล้างและได้สม่ำเสมอ แบบเปิดทิ้งได้เลย
แค่แบ๊คเทสทีละหลายๆคู่พร้อมกันน่ะครับ ก็เลยต้องอ่านค่าของคู่อื่นด้วย

เคยอ่านเจอแว๊บๆ ที่ไหนไม่รู้ ว่า mt5 สามารถ multipair backtest ได้