Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: รบกวนสอบถามครับ  (Read 35586 times)

Redbull

  • Full Member
  • ***
  • Posts: 138
รบกวนสอบถามครับ
« on: พฤศจิกายน 24, 2011, 03:51:43 pm »
รบกวน Admin หรือท่านใดก็ได้ครับ (ท่าน D_Daimond ก็ได้ครับ) ช่วยดูให้ด้วยครับ
ลองเขียนเล่นน่ะครับ แต่มันติดตรงที่ว่า มันเปิด Order เดียวแล้วไม่เปิดอีกเลยครับ พอลองเอา static ออก ทีนี้มันเปิดต่อเนื่องเลยครับ ก็เลยไม่รู้จะแก้ยังไงต่อครับ 
เงื่อนไขง่ายๆ ครับคือ ให้เปิดออเดอร์ใหม่เมื่อเริ่มแท่ง H1 ใหม่ครับ ถ้าถึง tp หรือ sl ก็หยุดแค่นั้นหรือถ้าไม่ถึง tp หรือ sl ก็ปิดออเดอร์ไปเลยเมื่อจบแท่งและรอแท่งใหม่ค่อยเปิดออเดอร์ใหม่

รบกวนนะครับ...ขอบคุณครับ.../'*_*/"......

static int check =0;

int start()
{

double P_Open  = iOpen (NULL,0,1); 
double P_close = iClose(NULL,0,1);

int a = OrdersTotal();

{
int total=OrdersTotal();
if(total==1)
{
check=1;
}
if(total<1 && check==0)
{

if (P_close > P_Open)
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Point*100,Ask+Point*20,"Test Sell",123,0,Green);

else
if (P_close < P_Open)
OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Point*100,Bid-Point*20,"Test Sell",123,0,Red);

}
 
return(1) ;
}

}

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: รบกวนสอบถามครับ
« Reply #1 on: พฤศจิกายน 24, 2011, 04:03:02 pm »
ในกรณีต้องการแค้ทีละ 1 order แล้วรอโดน sl tp ก่อนค่อยเปิดอันใหม่ แก้เป็นแบบนี้ก็พอครับ

int start()
{

double P_Open  = iOpen (NULL,0,1);  
double P_close = iClose(NULL,0,1);


int total=OrdersTotal();

if(total==0)
{

if (P_close > P_Open)
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Point*100,Ask+Point*20,"Test Sell",123,0,Green);

if (P_close < P_Open)
OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Point*100,Bid-Point*20,"Test Sell",123,0,Red);

}
 
return(1) ;


}

ตัวแปร static ใช้ในกรณีที่เราต้องการให้ระบบจำค่าเอาเมื่อ EA จบ loop การทำงานครับมีประโยชน์มากๆๆในบางกรณีครับ
« Last Edit: พฤศจิกายน 24, 2011, 04:06:29 pm by admin »

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: รบกวนสอบถามครับ
« Reply #2 on: พฤศจิกายน 24, 2011, 04:16:16 pm »
ในกรณีต้องการเปิดต่อเนื่องทีละ 1 order ตามขนาดของ timeframe ก็เขียนง่ายๆๆแบบนี้ก็ได้

int start()
{

double P_Open  = iOpen (NULL,0,1);  
double P_close = iClose(NULL,0,1);


int total=OrdersTotal();


if (P_close > P_Open)
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Point*100,Ask+Point*20,"Test Sell",123,0,Green);

if (P_close < P_Open)
OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Point*100,Bid-Point*20,"Test Sell",123,0,Red);


 Sleep(60000*Period( ) ); // ใฟ้มันหลับไปเท่ากับ ขนาดของ timeframe เช่น กราฟ h1 ก็จะนอนไป 1 ขั่วโมงครบกำหนดก็จะเริ่มทำงานใหม่ ใช้ใน backtest ไม่ได้นะครับ
return(1) ;


}
« Last Edit: พฤศจิกายน 24, 2011, 04:39:14 pm by admin »

Redbull

  • Full Member
  • ***
  • Posts: 138
Re: รบกวนสอบถามครับ
« Reply #3 on: พฤศจิกายน 24, 2011, 04:40:45 pm »
ขอบคุณมากมายครับท่าน Admin.....
รวดเร็วจริงๆ เลย.....
เดี๋ยวผมขอลองก่อนครับ....
ได้ผลยังไงคงต้องรบกวนท่าน Admin อีกครั้งครับ......

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนสอบถามครับ
« Reply #4 on: พฤศจิกายน 24, 2011, 05:39:40 pm »
ขอถามบ้างครับ

 -> Sleep(60000*Period( ) ); // ใฟ้มันหลับไปเท่ากับ ขนาดของ timeframe เช่น กราฟ h1 ก็จะนอนไป 1 ขั่วโมงครบกำหนดก็จะเริ่มทำงานใหม่ ใช้ใน backtest ไม่ได้นะครับ

แบบนี้ถ้าเราเปิดโปรแกรมมาตอน 4:40 มันก็จะหลับไป 1 ชม. ตื่นมาอีกที 5:40 ถึงจะเทรดต่อหรือเปล่าครับ


อีกข้อ อยากให้ท่าน admin ช่วยยกตัวอย่างการใช้งานที่จำเป็นต้องใช้ static หน่อยครับ ผมไม่รู้จักเลย เคยถามแล้วก็ยังไม่เข้าใจ

Redbull

  • Full Member
  • ***
  • Posts: 138
Re: รบกวนสอบถามครับ
« Reply #5 on: พฤศจิกายน 24, 2011, 05:44:14 pm »
รบกวนท่าน Admin อีกครั้งครับ....
เงื่อนไขแรกที่ท่าน Admin แนะนำครับ คือโดน sl tp ก่อนค่อยเปิดอันใหม่ (ข้อนี้ OK ครับ)
เงื่อนไขที่สองไม่ทำงานครับ (forward test) รบกวนถามเป็นข้อๆ ครับ
1. Sleep(60000*Period( ) ); ตัวเลข 60000 คือหน่วยอะไรครับ และในวงเล็บหลังPeriod ต้องใส่อะไรไหมครับ (เดาว่า 60000 คือ 60 นาที)
2. เพื่อความรวดเร็ว ผม forward test ใน timeframe 5 นาที ก็เลยแก้เป็น
Sleep(5000*Period( ) ); ไม่รู้ถูกไหมครับ แต่ก็ยังไม่ทำงานครับ
3. ที่ท่าน Admin แนะนำว่า Sleep(60000*Period( ) ); มันจะนอนไป 1 ชั่วโมง ไม่ทราบว่ามันจะเริ่มนับจากไหนครับ เมื่อโดน sl tp หรือไม่ หรือเมื่อเริ่มเปิดออเดอร์ครับ ที่ถามเพราะผมเกรงวามันจะไม่ตรงตามเงื่อนไขในแท่งถัดไปครับ คือผมต้องการให้มันเปิดออเดอร์พร้อมกับราคาเปิดของแท่งนั้นๆ ครับ ยกตัวอย่างถ้ามันหลับหลังโดน sl เช่น เปิดออเดอร์เวลา 01.00 น._โดน sl เวลา 01.10 น._ถ้ามันหลับที่ 01.10 น. มันจะไปทำงานอีกทีที่ 02.10 น. ใช่ไหมครับ แต่ผมต้องการให้มันเปิดออเดอร์ทุก 01.00 น. 02.00 น. 03.00 น..............00.00 น. ปรมาณนี้ครับ (งง อธิบายเองงงเอง)

รบกวน Admin ด้วยครับ...อีกนิดเดียวครับ.../-_-''/????
....ขอบคุณมากมายครับ....

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: รบกวนสอบถามครับ
« Reply #6 on: พฤศจิกายน 24, 2011, 06:09:43 pm »
60000 มาจาก 1 นาทีครับเพราะตามปกติ ถ้าจะให้มันหยุด 1 วินาทีจะเท่ากับ Sleep(1000) ; ครับ ที่ผมเขียน Sleep(60000*Period( ) );  Period() มันจะส่งค่ากราฟที่เป็นนาทีออกมาเองครับเช่น 1 นาทีก็ส่ง 1 ออกมา กราฟชั่วโมงมันจะส่ง 60 ออกมา ที่ถามว่ามันนอนไป 1 ชั่วโมงนับตอนไหนมันนับหลังเปิด order ครับเพระผมดูเงื่อนไขมี 2 ตัวแปรมันไม่โดนอันใดก็อันหนึ่งครับ  ถึงมันโดน sl tp ก็ไม่สนใจครับเพราะมันยังหลับอยู่ครับ แต่ถ้าต้องการเขียน code ที่ละเอียดกว่านี้มันต้องใช้ฟังก์ชั่นในการเทียบเวลามาเพิ่มแล้ว code จะยาวกว่านี้มากครับ เลยเอาสั่นๆๆง่ายๆๆไวก่อน

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: รบกวนสอบถามครับ
« Reply #7 on: พฤศจิกายน 24, 2011, 06:11:59 pm »
ขอถามบ้างครับ

 -> Sleep(60000*Period( ) ); // ใฟ้มันหลับไปเท่ากับ ขนาดของ timeframe เช่น กราฟ h1 ก็จะนอนไป 1 ขั่วโมงครบกำหนดก็จะเริ่มทำงานใหม่ ใช้ใน backtest ไม่ได้นะครับ

แบบนี้ถ้าเราเปิดโปรแกรมมาตอน 4:40 มันก็จะหลับไป 1 ชม. ตื่นมาอีกที 5:40 ถึงจะเทรดต่อหรือเปล่าครับ


อีกข้อ อยากให้ท่าน admin ช่วยยกตัวอย่างการใช้งานที่จำเป็นต้องใช้ static หน่อยครับ ผมไม่รู้จักเลย เคยถามแล้วก็ยังไม่เข้าใจ
หลังจากเปิด order มันก็จะรอจนครบเวลาถึงทำงานต่อครับ เปิด order เสร็จ 4.40 ก็รอจนกว่า 5.40 ถึงทำงานต่อครับ
เรื่อง static ก็ดูตัวอย่าง 2 อันนี้ดูค่าที่มัน print ออกมานะครับ

//คำว่า static คือคงที่ หมายความว่าตัวแปรนี้จะไม่โดยทำลายแม่งแต่ฟังก์ชั่นที่สร้างมันโดนระบบ delete ไปแล้วครับ
ลองดูตัวอย่างนี้ก่อนครับ ตัวแรก ตัวแปรธรรมดา แบบที่ 2 คือ static แล้วลองสังเกตค่าที่ออกมานะครับ ว่ามันต่างกันยังไง
int start()
  { 
     show();
    return(0);
  }

int show()
{   int a;
     Print("A :",a);
     a=a+1;
   return (a);

}


//////////////////////////////////////////////

int start()
  { 
     show();
    return(0);
  }

int show()
{   static int a;
     Print("A :",a);
     a=a+1;
   return (a);

}


Redbull

  • Full Member
  • ***
  • Posts: 138
Re: รบกวนสอบถามครับ
« Reply #8 on: พฤศจิกายน 24, 2011, 06:56:10 pm »
ท่าน Admin ครับ...
รบกวนอีกนิดส์ครับ ผมเข้าใจเรื่อง sleep แล้วครับ ก็เลยลองเขียนให้มันหลับ 5 นาที และ forward test ที่ 5 นาที แต่มันก็ยังไม่เปิดออเดอร์เลยครับ รบกวนตรวจสอบ code ให้ด้วยครับ ว่าทำไมไม่เทรด (โบรก ThinkForex ครับ) หรือถ้าไม่รบกวนเวลาจนเกินไปจะ Test ให้ด้วยก็ดีขอรับท่าน...

....อีกนิดส์ครับท่าน ไม่งั้นนอนไม่หลับแน่..../"_"/???
....ขอบคุณมากมายครับ...

int start()
{

double P_Open  = iOpen (NULL,0,1); 
double P_close = iClose(NULL,0,1);

int total=OrdersTotal();

if (P_close > P_Open)
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Point*200,Ask+Point*100,"Test Sell",123,0,Green);

if (P_close < P_Open)
OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Point*200,Bid-Point*100,"Test Sell",123,0,Red);

Sleep(300000*Period( ) ); //ถูกไหมครับเนี่ย 5 นาที
return(1) ;

}

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: รบกวนสอบถามครับ
« Reply #9 on: พฤศจิกายน 24, 2011, 07:03:15 pm »
Sleep(300000*Period( ) ); //ถูกไหมครับเนี่ย 5 นาที

นี้ใส่กราฟกี่นาทีครับ แบบนี้ถ้าใสกราฟ 5 นาที จะเท่ากับ หลับไป 25 นาทีนะครับ 300000 แก้เป็น 60000 แบบเดิมครับ ส่วนเรื่องไม่เปิดผมลองเอาไป test ดูมันก็ชื้อ order แรกนะครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนสอบถามครับ
« Reply #10 on: พฤศจิกายน 24, 2011, 07:05:18 pm »
ขอถามบ้างครับ

 -> Sleep(60000*Period( ) ); // ใฟ้มันหลับไปเท่ากับ ขนาดของ timeframe เช่น กราฟ h1 ก็จะนอนไป 1 ขั่วโมงครบกำหนดก็จะเริ่มทำงานใหม่ ใช้ใน backtest ไม่ได้นะครับ

แบบนี้ถ้าเราเปิดโปรแกรมมาตอน 4:40 มันก็จะหลับไป 1 ชม. ตื่นมาอีกที 5:40 ถึงจะเทรดต่อหรือเปล่าครับ


อีกข้อ อยากให้ท่าน admin ช่วยยกตัวอย่างการใช้งานที่จำเป็นต้องใช้ static หน่อยครับ ผมไม่รู้จักเลย เคยถามแล้วก็ยังไม่เข้าใจ
หลังจากเปิด order มันก็จะรอจนครบเวลาถึงทำงานต่อครับ เปิด order เสร็จ 4.40 ก็รอจนกว่า 5.40 ถึงทำงานต่อครับ
เรื่อง static ก็ดูตัวอย่าง 2 อันนี้ดูค่าที่มัน print ออกมานะครับ

//คำว่า static คือคงที่ หมายความว่าตัวแปรนี้จะไม่โดยทำลายแม่งแต่ฟังก์ชั่นที่สร้างมันโดนระบบ delete ไปแล้วครับ
ลองดูตัวอย่างนี้ก่อนครับ ตัวแรก ตัวแปรธรรมดา แบบที่ 2 คือ static แล้วลองสังเกตค่าที่ออกมานะครับ ว่ามันต่างกันยังไง
int start()
  { 
     show();
    return(0);
  }

int show()
{   int a;
     Print("A :",a);
     a=a+1;
   return (a);

}


//////////////////////////////////////////////

int start()
  { 
     show();
    return(0);
  }

int show()
{   static int a;
     Print("A :",a);
     a=a+1;
   return (a);

}



ลองแล้วครับ  บางทีมันก็ค้าง  บางทีมันก็เพิ่ม  
ไม่รู้ว่าเมื่อไรมันจะค้าง เมื่อไรมันจะไม่ค้าง จะเอาไปใช้จริงได้ยังไง งงครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: รบกวนสอบถามครับ
« Reply #11 on: พฤศจิกายน 24, 2011, 07:16:03 pm »
ถ้าเป็นตัว static ที่เขียนให้ดูของผมจะบวก 1 ตลอดนะครับ แต่ถ้าดูที่ช่อง expert มันจะบวกค่าทีละ 1 เมื่อกราฟกระดิกเท่านั่นครับ ประโยชน์ก็คือ เวลาเขียนฟังก์ชั่นที่ให้คำนวณหรือว่าอะไรก็แล้วต้องการให้มันเก็บค่าที่คำนวณได้เอาไวใช้ในการทำงานของ EA รอบต่อไปไงครับ ที่เขียนเป็น static ในฟังก์ชั่นก็เพื่อประกาศให้ ตัวแปรนี้เป็นตัวแปรแบบ global แต่มีเฉพาะฟังก์ชั่นที่ประกาศมันขึ้นมาเท่านั่นที่เรียกใช้ได้ ต่างจากการที่เราประกาศตัวแปร global เอาไวก่อน start() แบบนั่นทุกๆๆฟังก์ชั่นจะสามารถใช้งานและแก้ไขตัวแปรได้ครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนสอบถามครับ
« Reply #12 on: พฤศจิกายน 24, 2011, 07:27:48 pm »
ถ้าเป็นตัว static ที่เขียนให้ดูของผมจะบวก 1 ตลอดนะครับ แต่ถ้าดูที่ช่อง expert มันจะบวกค่าทีละ 1 เมื่อกราฟกระดิกเท่านั่นครับ ประโยชน์ก็คือ เวลาเขียนฟังก์ชั่นที่ให้คำนวณหรือว่าอะไรก็แล้วต้องการให้มันเก็บค่าที่คำนวณได้เอาไวใช้ในการทำงานของ EA รอบต่อไปไงครับ ที่เขียนเป็น static ในฟังก์ชั่นก็เพื่อประกาศให้ ตัวแปรนี้เป็นตัวแปรแบบ global แต่มีเฉพาะฟังก์ชั่นที่ประกาศมันขึ้นมาเท่านั่นที่เรียกใช้ได้ ต่างจากการที่เราประกาศตัวแปร global เอาไวก่อน start() แบบนั่นทุกๆๆฟังก์ชั่นจะสามารถใช้งานและแก้ไขตัวแปรได้ครับ

อ๋อ  ขอบคุณครับ

Redbull

  • Full Member
  • ***
  • Posts: 138
Re: รบกวนสอบถามครับ
« Reply #13 on: พฤศจิกายน 24, 2011, 07:54:41 pm »
ท่าน Admin.....
เรื่อง Sleep เขกกะโหลกตัวเองไปแล้วครับ โอเคครับเคลียร์...ส่วนเรื่องไม่เปิดออเดอร์ ผมลองไป Run ในโบรก 4 ตำแหน่ง สามารถเปิดออเดอร์ได้แล้วครับ....
Case นี้จบครับ (นอนหลับหล่ะ) ขอปิดกระทู้เลยแล้วกับ...เดี๋ยวจะมีมาอีกหลายกระทู้ครับ..ปัญหาเยอะครับ...แต่กระทู้นี้ท่าน D_Daimond แย่งซีนผมซะงั้น..อะล้อเล่นครับ..ขอบคุณครับที่ช่วยถามให้ความรู้เพิ่ม...
....ขอบคุณมากมายครับ.../^_^/ ;D

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
Re: รบกวนสอบถามครับ
« Reply #14 on: พฤศจิกายน 24, 2011, 08:24:56 pm »
ขอโทษท่าน Redbull ด้วยครับผมคาใจมานานเป็นปีๆ อิอิ

เรื่องที่ไม่เปิดออเดอร์นี่เป็นเพราะว่า Thinkforex มันเป็น ECN ครับ  ตั้ง SL TP ไม่ได้ จึงเทรดไม่ได้
ลองกดปุ่ม New Order ดูครับ