Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: ทำไม EA ไม่เป็นตามที่เขียนครับ  (Read 24685 times)

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #15 on: พฤษภาคม 23, 2010, 07:52:07 pm »
ตามข้างล่างนี้ครับหาค่า zigzag อันข้างบนมีจุดผิดตรงประกาศค่า high low  direct

static double high ;
static double low ;
static int direct=0;
int start()
  {   
       int amount=0;
       int temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                     
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                     
                      }
     
 
   return(0);
  }


TvT

  • Full Member
  • ***
  • Posts: 133
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #16 on: พฤษภาคม 23, 2010, 10:48:55 pm »
ผมแก้ตามที่แนะนำแล้ว แต่ว่าซื้อ แต่ไม่ยอมขายครับ

และผมก็ไม่แน่ใจว่าตำแหน่งที่ซื้อ เป็นตำแหน่งที่ถูกตามคำสั่งจริงหรือไม่

รบกวนอีกครั้งครับ

static double high ;
static double low ;
static int direct=0;


int start()
{
double ticket, total, pc;

pc=iClose(NULL,0,1);   
total=OrdersTotal();

 
       int amount=0;
       int temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                        if(pc<low)
                              {
                                 OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
                                 Print("sale");
                                 return(0);
                              }
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                        if((total<1)&&(pc>high))
                              {
                                 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy",0,0,Green);
                                 OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                 Print("buy");
                              }
                       
                      }
     
 
   return(0);
  }

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #17 on: พฤษภาคม 23, 2010, 11:22:50 pm »
code ผมแก้จนทำงานแล้วให้มัน print ออกมาพบว่าเงื่อนไข  pc> high ไม่มีทางเป็นจริงได้เลยครับเพราะถ้าราคาปิดของแท่งที่แล้วไม่มีทางมากกว่าค่าสูงสุดของ zigzag เพราะ  zigzag มันจะเลื่อนไปที่ค่าสูงสุดกับต่ำ เสมอ ลองเอาไปดูครับ


static double high ;
static double low ;
static int direct=0;


int start()
{
double ticket, total, pc;

pc=iClose(NULL,0,1);   
total=OrdersTotal();

 
       int amount=0;
       double temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                       
                      }
                     
                     
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                       
                       }
                     
                     
                     
                     
                       if((total>0) && (pc<low ))
                              {
                                 OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
                                 Print("sale");
                                 return(0);
                              }
                     
                       if((total==0)&&(pc>high))
                              {
                                 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy",0,0,Green);
                                 OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                 Print("buy");
                              }
                      Print("Pc ",pc);
                      Print("high ",high);
                      Print("Low ",low);
     
 
   return(0);
  }

TvT

  • Full Member
  • ***
  • Posts: 133
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #18 on: พฤษภาคม 24, 2010, 12:13:16 am »
admin เข้าใจไม่ตรงกันนีี่เองมิน่าใช้มะได้  ;D ;D ;D

แนบรูปมาเพื่อชี้แจงที่ต้องการจ้า 1 >> 4 ตามลำดับ โดยต้องการให้ record high-low ล่าสุดตามรูป และให้รู้ว่าอันสุดท้ายเป็น high หรือ low (ที่เคยเขียนไงต้องการค่า zigzag ที่มากกว่า 2 ตำแหน่งข้างๆ เพื่อบอกว่าเป็ยอด - ก้น โดยต้องการเฉพาะยอดล่าสุดพอ)

ดูรูปตามลำดับนะ เรียงเวลามาละ คือ พอเวลาผ่านก็หายอดอันล่าสุดมาใช้ตามรูป

หวังว่าจะเข้าใจตรงกันซะที มิน่าไปคนละทางเลย

ขอบคุณจ้า  ::) :o ::)

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #19 on: พฤษภาคม 24, 2010, 11:40:31 am »
ถ้าต้องการทราบว่าตัวสุดท้ายเป็น low หรือ high ก็ใช่ direct ไงครับ
แบบในตัวอย่าง ยอดสุดท้ายจะเป็น low
แต่ผมอยากให้คุณลองดูตอนตลาดเปิดก่อนนะครับ ดูจากกราฟในอดีตมันจะเห็นจุด break ก็จริงแต่ zigzag ตอนทำงานมันเลื่อนจุดเองได้นะครับหากราคาไปไม่สุดมันก็เลือนขึ้นหรือเลื่อนงต่อได้นะครับผมลองดูแล้ว ราคา pc ไม่มีทางหลุดค่า high สักที เพราะ zigzag มันเลื่อนตำแหน่งเองได้นะครับ

static double high ;
static double low ;
static int direct=0;


int start()
{
double ticket, total, pc;

pc=iClose(NULL,0,1);   
total=OrdersTotal();

 
       int amount=0;
       double temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                       
                      }
                     
                     
                     
                          if(temp[0]<temp[1])
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                       
                       }
                     
                     
                     
                      if(direct==1)
                      {
                       if((total>0) && (pc<low ))
                              {
                                 OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);
                                 Print("sale");
                                 return(0);
                              }
                     
                       if((total==0)&&(pc>high))
                              {
                                 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,0,0,"buy",0,0,Green);
                                 OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                 Print("buy");
                              }
                             
                      }
                      Print("Pc ",pc);
                      Print("high ",high);
                      Print("Low ",low);
     
 
   return(0);
  }

TvT

  • Full Member
  • ***
  • Posts: 133
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #20 on: พฤษภาคม 25, 2010, 06:02:34 am »
อันนี้ขอถามเพื่อความเข้าใจใน EA  นะครับ ตอบไรได้ก็ตอบที

static double high ;
static double low ;
static int direct=0;
static นี่คือตัวแปรประเภทไหน และค่าที่ได้จะเป็นค่าล่าสุดจากสูตรเสมอใช่หรือไม่
คือตัวแปรที่เราประกาศให้มันจำค่าเดิมเอาไวถึงการทำงานของ ea จะจบลงตราบใดที่เรายังไม่ปิด ea ค่านั่นก็ยังอยู่ในระบบ
int start()
{
double ticket, total, pc;

pc=iClose(NULL,0,1);    
total=OrdersTotal();

 
       int amount=0;

       double temp[3];
       double tem;
                       for(int i=0 ;i<5000;i++)
ตรงนี้เราเพิ่มเงื่อนไขว่า i>10 หรือถ้า i=จะเริ่มนับจาก 10 แล้วบวกไปทีละ 1 ??? ได้หรือไม่ ให้ไปเริ่ม จากแท่งที่ 10 แล้ว + ไปทีละ 1
ตรงนี้ต้องทำความเข้าใจอย่างมากเลยนะครับ อินดิเคเตอรื zigzag ไม่เหมือนอินดิเคเตอร์ตัวอื่นๆ zigzag จะส่งค่าออกมาก็ต่อเมื่อเกิดยอดสูงต่ำเท่านั่น ในระหว่างที่ไม่เกิดยอดสูงต่ำจะส่งค่าออกมาเป็น 0 ตลอด
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
ตรงนี้ก็ต้องเข้าใจการทำงานของ icustom ก่อนนะครับ ค่า i เป็นค่าของอินดิเคเตอรืในแต่ละแท่งเทียนของกราฟ จากที่ผมอธิบายไปแล้วว่า zigzag มันจะส่งค่าออกมาก็ต่อเมื่อว่าเกิดยอดสูงต่ำเท่านั่น ในช่วงที่ยังไม่เกิดค่าสูงต่ำมันจะส่งค่า 0 ออกมาทุกแท่งเทียน และเราก็ไม่สามารถทราบได้ว่าเมื่อไรมันจะเกิดยอดสูงต่ำ ผมจึงกำหนดให้เป็นตัวเลขมากๆๆเพื่อให้โปรแกรมย้อนกลับไปอ่านค่า ของ zigzag ให้มากที่สุดเพื่อหาค่าสูงต่ำ
ตรงนีผมเพิ่มตัวแปร tem เพิ่ม เป็นราคา zigzag 2 แท่งก่อนหน้า และสองแท่งหลังจะได้ยอดที่เป็นยอดคว่ำล่าสุดไหมโดย
                               tem1=iCustom(NULL, 0, "ZigZag",13,0,i+2);
                               tem2=iCustom(NULL, 0, "ZigZag",13,0,i-2);
                               if((tem>tem1)&&(tem>tem2))
ค่า tem น่าจะได้เป็นยอดล่าสุดที่มีระยะห่างไปไม่น้อยกว่า 5 และเป็นรูปยอดคว่ำ

ตรงนี้เพิ่มไปก้ไม่ได้ค่าสูงต่ำครับการเพิ่มลักษณะนี้เป็นแค่การเลื่อนแท่งเทียนเท่านั่นเองครับ
                               if(tem>0)
                               {
                                  temp[amount]=tem;
amount นี่ค่าไรอะคือดัชนีของ array ครับผมสร้างตัวแปร double temp[3]; เอาไวเพื่อเก็บค่าจาก loop ที่หาค่าของ zigzag ครับ
                                  amount++;
                                  if(amount>1)
                                  {
                                   i=5001;
                                  }
                               }                    
                                                      
                            }
                    
                      if(temp[0]>temp[1])
อันนี้เปลี่ยนเหมือนข้างบนได้ไหมเราไม่ค่าเอาค่าโดยดูจากแท่งล่าสุดแต่ต้องการยอดคว่ำล่าสุด
เงื่อนไขอันนี้กับข้างล่างผมเอาไวตรวจสอบว่าว่าค่า สูงต่ำคืออะไรครับ แล้วผมก็ใช้ตัวแปร direct เพื่อบอกว่ายอดล่างสุดเป็น bottom หรือ top โดยสังเกตจาก      if(temp[0]>temp[1]) ตรงนี้ก็คือการเปรียบเทียบครับ  temp[0] คือยอดล่าสุด  temp[1] คือยอดก่อนน่า ถ้ายอดล่าสุดมากกว่ายอดก่อนหน้าแล้วก็คือค่า ล่าสุดคือ top ครับ ผมก็กำหนดตัวแปร direct = 1 เพื้อที่จะนำตรงนี้ไปเปรียบเทียบหาเราต้องการทำอะไรต่อถ้าเกิดยอดสุดท้ายเป็น top ที่นี้เงื่อขไขข้างล่างก็กลับกันครับ  ส่วนค่า  high กับ low ในเงื่อนไขก็คือค่า สูงสุดต่ำสุด ล่าสุดที่ zigzag มัน  show 2 ยอดสุดท้ายครับ                      {
                        high=temp[0];
                        low=temp[1];
                        direct=1;
                      
                      }
                    
                      
                    
                          if(temp[0]<temp[1])
อันนี้ก็ยอดหงายล่าสุดไม่ใช่ค่าล่าสุด
                      {
                        high=temp[1];
                        low=temp[0];
                        direct=2;
                      
                       }





ดูเหมือน admin เข้าใจวัตถุประสงค์ไม่ตรงกันเรื่องค่าที่จะเลื่อนมาล่าสุดเข้าใจครับแต่นั่นคือถ้าเราตั้งให้มากกว่าแท่งก่อนหน้าอย่างเดียว ถ้าเราตั้งให้มากกว่าแท่งหลังจากมันซักสองแท่งด้วยค่า zigzag จะยังไม่เกิดเพราะยังไม่เป็นรูปยอดทั้งนี้โดยให้ i เริ่มทีมากกว่า 10 ก็จะไม่โดนหลอกครับ

ผมเข้าใจตามนี้แต่เรื่องภาษาและระบบคงต้องฝาก admin ดูอีกที

ขอบคุณจ้า                      
                      







« Last Edit: พฤษภาคม 25, 2010, 12:24:04 pm by admin »

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #21 on: พฤษภาคม 25, 2010, 12:24:35 pm »
ผมตอบไปแล้วครับลองดูครับว่าไม่เข้าใจตรงไหน

TvT

  • Full Member
  • ***
  • Posts: 133
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #22 on: พฤษภาคม 26, 2010, 02:47:28 pm »
ช่วงนี้งานยุ่งนิดนึง เดี๋ยวอีก 2-3 วัน จะลองใหม่ แล้วแจ้งข่าวอีกทีนะ

TvT

  • Full Member
  • ***
  • Posts: 133
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #23 on: พฤษภาคม 30, 2010, 11:05:46 am »
ผมยัง งงงง ครับ ขอถามท่าน ADMIN แบบนี้ละกัน

จะเป็นไปได้มั้ยครับถ้าเราจะบันทึกค่า Top ของ Zigzag 2 ค่าล่าสุด (A&B)  และ Bottom ของ Zigzag 2 ค่าล่าสุด (C&D)

ตามรูปครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #24 on: พฤษภาคม 30, 2010, 02:42:13 pm »
ทำได้ครับ

TvT

  • Full Member
  • ***
  • Posts: 133
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #25 on: พฤษภาคม 30, 2010, 03:50:21 pm »
รบกวนชวยเหลือด้วยครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
Re: ทำไม EA ไม่เป็นตามที่เขียนครับ
« Reply #26 on: พฤษภาคม 30, 2010, 06:44:24 pm »
ตาม code ข้างล่าง  D=lastlow   A=lasthigh     C=low    B=high

static double high ;
static double low ;
static double lasthigh;
static double lastlow;

int start()
  {   
       int amount=0;
       int temp[4];
       double tem;
                       for(int i=0 ;i<5000;i++)
                           {
                               tem=iCustom(NULL, 0, "ZigZag",13,0,i);
                               if(tem>0)
                               {
                                  temp[amount]=tem;
                                  amount++;
                                  if(amount>3)
                                  {
                                   i=5001;
                                  }
                               }                   
                                                     
                            }
                     
                      if(temp[0]>temp[1])
                      {
                        lasthigh=temp[0];
                        lastlow=temp[1];
                       
                     
                      }
                     
                          if(temp[0]<temp[1])
                      {
                        lasthigh=temp[1];
                        lastlow=temp[0];
                           
                      }
                     
                     
                         if(temp[2]>temp[3])
                      {
                        high=temp[2];
                        low=temp[3];
                       
                     
                      }
                     
                          if(temp[2]<temp[3])
                      {
                        high=temp[3];
                        low=temp[2];
                           
                      }
                     
                     
                     
     
 
   return(0);
  }