EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: vicvic on พฤศจิกายน 22, 2012, 06:09:39 pm

Title: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: vicvic on พฤศจิกายน 22, 2012, 06:09:39 pm
int lot=0.01;
    if (OrdersTotal()==1)
    {   
         lot=lot+0.01;
         if(OrderType()==OP_SELL)
         {
         OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+20*Point,3,Ask,Ask+20*Point);
         }
          else
         {     
          OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-20*Point,3,Bid,Bid-20*Point);
         }     
     }

คือพอออเด้อทั้งหมดเหลือ1 ออเ้ด้อให้เชคค่าแล้วเปิดออเด้อ แต่ทำไมไม่เปิด ช่วยดูหน่อยคับ

อีกอย่างคับ ถ้าผมใช้เงื่อนไข
 if (OrderProfit()<20) หมายความว่าถ้าออเด้อที่เปิดอยู่ขณะนั้นมีกำไรน้อยกว่า20 ใช่ไหมคับ เขียนอย่างนี้ถูกไหมคับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: admin on พฤศจิกายน 22, 2012, 07:12:38 pm
ไม่มีคำสั่ง OrderSelect() ก่อนเรียกใช้งาน OrderType ครับเลยได้ค่าที่ไม่ถูกต้อง

if (OrderProfit()<20) หมายความว่าถ้าออเด้อที่เปิดอยู่ขณะนั้นมีกำไรน้อยกว่า20 ใช่ไหมคับ เขียนอย่างนี้ถูกไหมคับ

ใช้ครับ แต่ต้องมีคำสั่ง OrderSelect ก่อนเรียกใช้งาน OrderProfit ด้วยครับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: vicvic on พฤศจิกายน 23, 2012, 10:44:12 am
ขอบคุณคับ Admin ถามอีกหน่อยคับ พอดีมือใหม่ อ่านหนังสือแล้วไม่่ค่อยเข้าใจคับ

OrderSelect(int index, int select, int pool=MODE_TRADES)
index=ตำแหน่งของออเด้อ มีวิธีนับตำแหน่งหรือใส่ค่ายังไงบ้างคับ

แล้วถ้าเราจะถามว่า
ถ้าOrder ที่พึ่งปิดไปมีกำไรหรือไม่ จะกำหนดตำแหน่งและตั้งเงื่อนไขยังไงคับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: admin on พฤศจิกายน 23, 2012, 01:55:29 pm
ใช้ loop ในการวนครับ

for(int i=0;i<OrdersTotal();i++)
{
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

   แบบนี้คือมันจะเริ่มตรวจสอบตั้งแต่ Order แรกที่เปิดจนถึง Order สุดท้าย 
}

แต่ถ้าต้องการ Order สุดท้ายที่เปิด Order เดียวก็ใช้แบบนี้เลยครับ
OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: dataxdata on พฤศจิกายน 26, 2012, 05:00:26 pm
ไม่มีคำสั่ง OrderSelect() ก่อนเรียกใช้งาน OrderType ครับเลยได้ค่าที่ไม่ถูกต้อง

if (OrderProfit()<20) หมายความว่าถ้าออเด้อที่เปิดอยู่ขณะนั้นมีกำไรน้อยกว่า20 ใช่ไหมคับ เขียนอย่างนี้ถูกไหมคับ

ใช้ครับ แต่ต้องมีคำสั่ง OrderSelect ก่อนเรียกใช้งาน OrderProfit ด้วยครับ

ขอถามต่อยอดหน่อยครับ สมมติว่าเราเปิด short มากกว่า 1 order พอใช้คำสั่ง orderprofit() > 10 เพื่อให้มันปิด order ค่า order ที่มันเอามาวัดว่า > 10 รึเปล่า ปกติจะเป็น order หลังสุดทุกที
สมมติว่าผมจะให้มันดูเฉพาะ order แต่ละตัวว่า profit > 10 ให้ปิด order ต้องเขียนเพิ่มอย่างไรครับ ต้องวิ่งวน loop for เพื่อหาตำแหน่งแล้วเอามาทำ orderselect รึเปล่าครับ ตอนนี้ผมเขียนไว้แค่นี้ครับ

if(s1count > 0 )
         {
            if(OrderMagicNumber()==MagicNumber1)   
               {
                  if(OrderProfit() > 15)
                     {
                        OrderClose(OrderTicket(),OrderLots(),Bid,10,Green);
                        s1count--;
                     }
               }
         }
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: dataxdata on พฤศจิกายน 26, 2012, 05:26:23 pm
ไม่มีคำสั่ง OrderSelect() ก่อนเรียกใช้งาน OrderType ครับเลยได้ค่าที่ไม่ถูกต้อง

if (OrderProfit()<20) หมายความว่าถ้าออเด้อที่เปิดอยู่ขณะนั้นมีกำไรน้อยกว่า20 ใช่ไหมคับ เขียนอย่างนี้ถูกไหมคับ

ใช้ครับ แต่ต้องมีคำสั่ง OrderSelect ก่อนเรียกใช้งาน OrderProfit ด้วยครับ

ขอถามต่อยอดหน่อยครับ สมมติว่าเราเปิด short มากกว่า 1 order พอใช้คำสั่ง orderprofit() > 10 เพื่อให้มันปิด order ค่า order ที่มันเอามาวัดว่า > 10 รึเปล่า ปกติจะเป็น order หลังสุดทุกที
สมมติว่าผมจะให้มันดูเฉพาะ order แต่ละตัวว่า profit > 10 ให้ปิด order ต้องเขียนเพิ่มอย่างไรครับ ต้องวิ่งวน loop for เพื่อหาตำแหน่งแล้วเอามาทำ orderselect รึเปล่าครับ ตอนนี้ผมเขียนไว้แค่นี้ครับ

if(s1count > 0 )
         {
            if(OrderMagicNumber()==MagicNumber1)   
               {
                  if(OrderProfit() > 15)
                     {
                        OrderClose(OrderTicket(),OrderLots(),Bid,10,Green);
                        s1count--;
                     }
               }
         }


เพิ่มโค้ดเป็นอย่างนี้จะถูกรึยังครับ?

for(int j=0;j<OrdersTotal();j++)
         {
            if(s1count > 0 )
               {
                  OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
                  if(OrderMagicNumber()==MagicNumber1)   
                     {
                        if(PlusADX < CurBaseADX && OrderProfit() > 15)
                           {
                              OrderClose(OrderTicket(),OrderLots(),Bid,10,Green);
                              s1count--;
                           }
                     }
               }

ไม่รู้ว่าทำแบบนี้จะได้ค่า orderprofit() ของแต่ละ order อย่างถูกต้องรึยังครับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: admin on พฤศจิกายน 26, 2012, 10:05:46 pm
จะเรียกดู profit ของ order โดยใช้ Magic number เป็นตัวหรอกหรือว่าต้องการอะไรครับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: dataxdata on พฤศจิกายน 27, 2012, 04:19:10 pm
จะเรียกดู profit ของ order โดยใช้ Magic number เป็นตัวหรอกหรือว่าต้องการอะไรครับ

คือที่จริงผมอยากรู้ว่า order ที่เปิดค้างไว้แต่ละใบมี profit เท่าไหร่บ้างอยากเลยอยากให้มันโชว์ให้เห็นครับ แล้วพอ profit ได้ถึงระดับนึงแล้วจะสั่งให้มันปิด order ให้ครับ

ถ้าผมใช้แค่ code ที่เขียนแบบไม่วน loop for มันจะได้ค่า orderprofit ของตั๋วใบล่าสุดเท่านั้น พอใส่ loop เข้าไปก็ไม่แน่ใจอีกว่ามันถูกรึยังครับท่าน

ปล. หนังสือที่ท่าน admin เขียนนี่มีขายที่ไหนบ้างครับ? หนังสือชื่ออะไรเอ่ย? กะว่าจะเอามาอ่านเป็นความรู้หน่อยครับ ^^
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: admin on พฤศจิกายน 27, 2012, 06:22:25 pm
double temp[100];
 
        for(int j=0;j<OrdersTotal();j++)
         {
               OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
                temp[j] = OrdersTotal();
                 Print("Order : ",j+1," Profit is  " ,OrderProfit() );
                       
         }

ส่วนหนังสือสั่งได้ที่นี้เลยครับ http://www.serv4fx.com/mtbook/orderbook.php  ไม่ได้วางขายตามท้องตลาด ครับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: vicvic on พฤศจิกายน 28, 2012, 12:24:40 am
แล้วถ้า อีเอเราทำงานจนกระทั่งวันนี้มีกำไรแล้วจะหยุดแล้วค่อยไปเริ่มทำตามสูตรใหม่ในวันพรุ่งนี้ มีคำสั้งเงื่อนไขไหนให้ใช้บ้างอะคับ
อีกอย่างคับเผลอไปกดอะไรไม่รู้คับเวลาพิมพ์ไทยจะเป็นภาษาต่างดาวแต่ภาษาอังกฤษปกติ ลองเปลี่ยน font ใน option เป็น fixedsys  thai  ก็จะพิมพ์ไทยได้แต่ไม่ค่อยตรงเท่าไหร่ตัวหนังสือก็แปลกๆคับ ท่านใดพอรู้บ้างคับ ผมแก้ไม่ได้สักที
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: admin on พฤศจิกายน 29, 2012, 12:45:11 am
แล้วถ้า อีเอเราทำงานจนกระทั่งวันนี้มีกำไรแล้วจะหยุดแล้วค่อยไปเริ่มทำตามสูตรใหม่ในวันพรุ่งนี้ มีคำสั้งเงื่อนไขไหนให้ใช้บ้างอะคับ
อีกอย่างคับเผลอไปกดอะไรไม่รู้คับเวลาพิมพ์ไทยจะเป็นภาษาต่างดาวแต่ภาษาอังกฤษปกติ ลองเปลี่ยน font ใน option เป็น fixedsys  thai  ก็จะพิมพ์ไทยได้แต่ไม่ค่อยตรงเท่าไหร่ตัวหนังสือก็แปลกๆคับ ท่านใดพอรู้บ้างคับ ผมแก้ไม่ได้สักที
ฟังก์ชั่นให้หยุดอัตโนมัติไม่มีครับ ต้องเขียนให้ EA ไปอ่านข้อมูลที่ Orderhistory โดยการรวม Profit ของ order ที่ถูกปิดไปในวันนี้ครับ ถ้าหากผลรวมเป็นบวกก็หยุดการทำงานครับ หากไม่ใช่ก็ให้ทำงานต่อ ส่วนภาษาไทยใน Metadeitor ก็ได้เต็มที่แบบที่คุณเห็นครับโชว์รูปแบบอักษรแปลกๆเพราะมันไม่ได้รองรับภาษาไทย 100 % ครับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: vicvic on พฤศจิกายน 29, 2012, 05:37:01 am
ถ้าผลรวมเป็นบวกก็ให้หยุดการทำงาน
ใช้ฟังชั่นไหนหรอคับ หรือช่วยยกตัวอย่างหน่อยคับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: D_Diamond on พฤศจิกายน 29, 2012, 09:42:17 am
หยุดทำงานใช้คำสั่ง  return (0); ครับ
อยากให้หยุดตรงไหนก็ไปวางไปตรงนั้น
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: vicvic on พฤศจิกายน 30, 2012, 05:11:42 am
ขอบคุณคับ คุณ D_Diamond
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: vicvic on ธันวาคม 01, 2012, 08:14:45 am
if  ((Ask-Bid) > 0.0005 ) return(0);
ผมเขียนเงื่อนไขเชคเสปรดอย่างนี้ได้เปล่าคับ หรือเขียนแบบไหนได้บ้างคับ

อีกข้อคับ คือผมลองเขียนอีเอ buystop กับ sellstop ทั้งสองฝั่งกำไร 20 พอยค์ตัด ขาดทุน10 ตัด วนไปเรื่อยๆ ทำำไมเวลาเทส ใช้ m1 ก็ออกมาอย่าง ใช้ m15 m30 ก็ออกมาไม่เหมือนกัน ผมไม่ได้ใช้ indy อะไรเลย จริงๆแล้วราคาติ๊กมันเหมือนกันหมดไม่ใช้หรอคับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: D_Diamond on ธันวาคม 01, 2012, 11:12:48 am
๑. ได้ครับ  เขียนแบบนั้นใช้ได้ที้ง ๔ และ ๕ หลัก แต่ใช้กับ ๒ และ ๓ หลัก อย่างเงินเยนหรือทองไม่ได้

๒. นอกจากอินดิเคเตอร์  ยังมี open high low close ด้วยครับ  ถ้าไม่ได้ใช้เลย  แล้วเทสแบบ everytick ผลควรเหมือนกันเป๊ะ  ถ้าไม่เหมือนคือดาต้าไม่สมบูรณ์ครับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: admin on ธันวาคม 01, 2012, 07:01:11 pm
if  ((Ask-Bid) > Point *5 ) return(0); แบบนี้จะใช้ได้กับทุกค่าเงิน ทุกโบรเกอร์ไม่ว่าจะ 4 จุด หรือ 5 จุด แต่ถ้าเปลี่ยนเลข 5 เป้นตัวแปรจะทำให้ปรับค่าได้ตรง input อีกครับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: vicvic on ธันวาคม 03, 2012, 09:10:02 am
อยากจะขอ data หน่อยคับ eurusd1 และำ eurusd30 ใครมีช่วยup ให้หน่อยคับ ผมลองโหลดจากเวปนอก พอมาเทสแล้วมันได้ผลไม่เหมือนกันเลยงง งง คับพอมาเชค data ก็ไม่ตรงกัน วันเดียวกัน m1 กับ m30 ดันไม่เหมือนกัน จริงก็ควรจะมีไว้ปักมุดหลายสกุลเงินเลยนะคับ เพราะมันก็เป็นส่วนหนึ่งที่จำเป็นของคนเขียนอีเอแล้วเทส จะได้มีข้อมูลที่แน่นอนและเหมือนกันไม่ต้องไปหาโหลดจากที่อื่นแล้วทดลองกันผิดผิดถูกถูก ขอบคุณคับสำหรับทุกคำตอบ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: llkeell on ธันวาคม 03, 2012, 02:37:36 pm
เหมือนเค้าจะว่าไว้ว่า จะเล่นโบรกไหนก็ต้องใช้ data ของโบรกนั้นนะครับ
เพราะ data ของแต่ละโบรกก็ไม่เหมือนกัน ทั้งในส่วนของ spread, ask-bid, high-low

ผมว่า ปักหมุดเรื่อง " วิธีการโหลด data เพื่อทำ back test ของ EA " น่าจะดีกว่าครับ
ใครเป๊ะเรื่องนี้ รบกวนช่วยเขียนขั้นตอนให้ด้วยครับ
Title: Re: ช่วยดูหน่อยคับ ทำไมมันไม่เปิดorder
Post by: vicvic on ธันวาคม 04, 2012, 02:09:18 pm
ผมใช้ของ fxclearing สเปรด 1จุด ใครพอมีบ้างคับ ช่วยโพสหน่อยคับ