EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: lancelot on มกราคม 19, 2010, 02:34:09 pm

Title: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: lancelot on มกราคม 19, 2010, 02:34:09 pm
พอดีกำลังหัดเขียนอีเอ  ก็อ่าน ๆ ดูจากเว็บอะครับ ที่แอดมินเขียนอะครับ  ผมก็เลยเอา fistea ของ admin มาแก้ให้เป็นอีเอ ธรรมดาที่ผมจะสามารถเขียนได้ก่อน อยากเขียนตัวแรกให้เป็นเรื่องเป็นราว ก่อนครับ
ใช้แค่ เส้น Moving Average ครับ ตัดขึ้นก็ Buy ตัดลงก็ Sell

    แต่ผมก็ลอกโค๊ดของ admin มาซะส่วนใหญ่เพราะเห็นว่าหลักการคล้ายกัน  แต่ทำไมผม มันไม่เปิดออร์เดอร์ครับ 

โค๊ดครับ ดูให้ที

//+------------------------------------------------------------------+
//|                                                      Ling V1.mq4 |
//|                      Copyright ฉ 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright ฉ 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//---- input parameters

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
      int FastMA15, SlowMA50;
      int Total;
      int idno;
         FastMA15=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,0);
         SlowMA50=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
         
         Total=OrdersTotal();
         if(Total<1)
         {
            if(Ask>FastMA15>SlowMA50)
               {
               idno=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-Point*20,Ask+Point*40,"LingV1",0,0,Green);
               OrderSelect(idno,SELECT_BY_TICKET,MODE_TRADES);
               }
            if(Bid<FastMA15<SlowMA50)
               {
               idno=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask-Point*20,Bid-Point*40,"LingV1",0,0,Blue);
               OrderSelect(idno,SELECT_BY_TICKET,MODE_TRADES);
               }
          }
                     
//----
   return(0);
  }
//+------------------------------------------------------------------+




มันผิดตรงไหนหรอครับ ทำไม มันไม่ส่งออร์เดอร์ 
แล้วมีคำถามอีกนิดครับตรงบรรทัดนี้ครับ
idno=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask-Point*20,Bid-Point*40,"LingV1",0,0,Blue);  ตรง "LingV1"  ของแอดมินใส่เป็น firstea ทำไมเราต้องใส่ชื่ออีเอด้วยครับ  แล้ว ตรงสีอะครับ ผมไม่เห็นมันเป็นสีเขียวกับสีน้ำเงินเลยครับ แล้วผมใส่สีเขียวก็ไม่เป็นสีเขียวด้วยครับ
มันเป็นสีแดง  รบกวนตอบด้วยนะครับ กำลังหัดนะครับ 

ขอบคุณครับ
อยากเขียนเป็นมากกกกกกกก
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: admin on มกราคม 19, 2010, 03:12:17 pm
เอาที่ละคำตอบหละกันนะครับ idno=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask-Point*20,Bid-Point*40,"LingV1",0,0,Blue);  ตรง "LingV1"  ของแอดมินใส่เป็น firstea ทำไมเราต้องใส่ชื่ออีเอด้วยครับ  แล้ว ตรงสีอะครับ ผมไม่เห็นมันเป็นสีเขียวกับสีน้ำเงินเลยครับ แล้วผมใส่สีเขียวก็ไม่เป็นสีเขียวด้วยครับ

ที่ต้องใส่ชื่อเพราะเวลาปิด order ไปแล้วใร account history เราจะรู้ได้ว่า order นี้เปิดจาก ea ตัวไหนครับ ส่วนเรื่องสี จะเป็นสีของลูกศรบนกราฟ ที่เข้าเปิด order ครับ
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: admin on มกราคม 19, 2010, 03:15:53 pm
ต่อครับ ลองแก้เป็นแบบนี้ดูครับ

Total=OrdersTotal();
         if(Total<1)
         {
            if(Ask>FastMA15>SlowMA50)
               {
               OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-Point*20,Ask+Point*40,"LingV1",0,0,Green);
               
               }
            if(Bid<FastMA15<SlowMA50)
               {
               OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask-Point*20,Bid-Point*40,"LingV1",0,0,Blue);
                 }
          }
                     ถ้าเงื่อนไขไม่ผิดก็น่าจะเปิดได้แล้วหละ ลองดูก่อนครับ
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: lancelot on มกราคม 19, 2010, 04:10:32 pm
ไม่ได้ครับ แอดมินครับ ช่วยดูให้อีกที
มันไม่ส่งหง่ะ

//+------------------------------------------------------------------+
//|                                                      Ling V1.mq4 |
//|                      Copyright ฉ 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright ฉ 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//---- input parameters

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
      int FastMA15, SlowMA50;
      int Total;
      int idno;
         FastMA15=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,0);
         SlowMA50=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
         
         Total=OrdersTotal();
         if(Total<1)
         {
            if(Ask>FastMA15>SlowMA50)
               {
               OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-Point*20,Ask+Point*40,"LingV1",0,0,Green);
               }
            if(Bid<FastMA15<SlowMA50)
               {
               OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask-Point*20,Bid-Point*40,"LingV1",0,0,Blue);
               }
          }
                   
//----
   return(0);
  }
//+------------------------------------------------------------------+
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: admin on มกราคม 19, 2010, 04:42:53 pm
int start()
  {

      int FastMA15, SlowMA50;
      int Total;
      int idno;
         FastMA15=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,0);
         SlowMA50=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
         
         Total=OrdersTotal();
         if(Total<1)
         {
            if(Ask>FastMA15>SlowMA50)
               {
               OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-Point*20,Ask+Point*40,"LingV1",0,0,Green);
               }
            if(Bid<FastMA15<SlowMA50)
               {
               OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+Point*20,Bid-Point*40,"LingV1",0,0,Blue);
               }
          }
                   

   return(0);
  }
ที่ไม่รันเพราะผิดตรงค่า sl กับ tp ครับ
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: lancelot on มกราคม 19, 2010, 04:53:03 pm
ขอบคุณคร๊าบ   รัก admin มากที่สุดในโลกเวย
จะพยายามศึกษาต่อไปครับ  ถ้าอีเอของผมเองเสร็จเมื่อไหร่จะเอามารันกับแอดมิน

ขอบคุณคร๊าบ  คงได้กวนท่านอีกยาว 
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: lancelot on มกราคม 20, 2010, 03:39:42 pm
ท่าน admin จะได้มาอ่านรึป่าวคับ คือผมพยายามศึกษาการเขียนอีเอมาสามสี่วันนี้ วันละนิด

มีคำถามหน่ะครับ
   - จะหาความหมายของคำสั่งชนิดต่าง ๆ ได้จากไหน ที่ใน Reference รึป่าวคับ? เพราะมันจำกัดมากเลยคับ เพราะว่า ไม่รู้ว่ามันคืออะไร และใช้ยังไง  จากไฟล์ที่ แอดมินทำขึ้น  ก็มีนะครับ แต่ติดว่า ไม่มีตัวอย่างการใช้ครับ

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

  ผมหาคู่มือ พวกนี้ที่เป็นภาษาไทยได้จากไหนครับ ซึ้อก็ได้ครับ ที่สมบูรณ์หน่อยหน่ะคับ  เสียตังค์เท่าไหร่ไม่ว่ากัน ถ้าคุ้มค่าคับ

ตอบหน่อยนะครับท่านแอดมิน
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: admin on มกราคม 20, 2010, 04:04:34 pm
ใน reference ที่มากับ Meta Editor ก็มีนะครับ ลองดูตามรูปที่ผมแนบให้ครับ
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: lancelot on มกราคม 20, 2010, 04:32:13 pm
Admin ครับ มีเรื่องให้ช่วยอีกแล้วครับ

int start()
  {
//----
      int FastMA15, SlowMA50;
      int Total;
         
         FastMA15=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,0);
         SlowMA50=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
         
         Total=OrdersTotal();
         if(Total<1)
         {
           
            if(Bid>FastMA15>SlowMA50)
               {
               OrderSend(Symbol(),OP_BUY,1,Bid,3,"LingV1",0,0,Blue);
               }
         
         }
                   

   return(0);
  }
 
มันไม่เปิด ออร์เดอร์ครับ  แต่ถ้าผมใส่ Bid <FastMA<SlowMA มันกลับเปิดออรืเดอร์ให้ แต่ว่า มันผิดหลักการที่ผมตั้งใจจะให้มันเป็นครับ

แล้วพอถ้าเราทำเป็นออร์เดอร์ sell ขึ้นมา ปรากฏว่า มันก็เซลล์นะครับ แต่ว่า มันก็ เซลบนเส้น MA อยู่ดี เป็นเพราะอะไรหรอครับ

ขอบคุณครับ
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: admin on มกราคม 20, 2010, 04:40:20 pm
OrderSend(Symbol(),OP_BUY,1,Bid,3,"LingV1",0,0,Blue);
พารามิเตอร์มันไมครบ sl tp หายไปถ้าไม่ต้องการให้ใส่ 0 ลงไป  OrderSend(Symbol(),OP_BUY,1,Bid,3,0,0,"LingV1",0,0,Blue);
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: lancelot on มกราคม 20, 2010, 04:49:58 pm
ไม่ได้เหมือนเคยครับ ท่านแอดมิน

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

  รบกวนอีกครั้งนะครับ 
int start()
  {
//----
      int FastMA15, SlowMA50;
      int Total;
         
         FastMA15=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,0);
         SlowMA50=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
         
         Total=OrdersTotal();
         if(Total<1)
         {
           
            if(Bid>FastMA15>SlowMA50)
               {
               OrderSend(Symbol(),OP_BUY,1,Bid,3,0,0,"LingV1",0,0,Blue);
               }
         
         }
                   

   return(0);

อ้อ  แต่ถ้าผมหรับลูกศร เป็นแบบนี้ มันส่งอะครับ Bid<FastMa<SlowMa  หรือว่า จริง ๆ แล้วมันต้องเป็นอย่างนั้นจริง ๆ หรือครับ

สุดท้ายนี้ ก็ครั้งสุดท้ายของวันนี้แล้วหล่ะครับ กวนมาเยอะแล้ว ผมก็นั่งมาทั้งวัน ไม่เข้าใจตรงนี้ซะที  วันนี้ ไม่ได้อะไรก็จะยังไม่หยุด พรุ่งนี้ค่อยว่ากัน  ยังไงรบกวนตอบด้วยครับ ขอบคุณครับ
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: linconz on มกราคม 20, 2010, 05:55:09 pm
op_buy  ต้องใช้  ask  ครับ     op_sell  ถึงใช้ bid
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: lancelot on มกราคม 21, 2010, 12:06:19 pm
ขอบคุณ คุณ linconz ที่ช่วยมาชี้แนะ ในที่สุดก็เข้าใจซะทีครับ  ส่ง Buy ได้แล้ว แต่ทีนี้  ส่ง sell อีกแล้วครับ 
คือผม อยากส่งปิดแบบอีเอเป็น  โดยไม่ต้องตั้ง stoploss TakeProfit ปิดให้
ผมก็เขียนโค๊ตขึ้นมา เรียงตามพารามิเตอร์ ใน Reference ครับ  แต่อีกแล้วครับท่าน มันไม่ปิดครับ

มันเปิดได้แต่ไม่ปิดให้ครับ  มาส่งการบ้านคุณครูคนไหนช่วยตรวจทีครับ

int start()
  {
//----
      double FastMA15, SlowMA50;
      int Total;
      int idno;
         
         FastMA15=iMA(NULL,0,15,0,MODE_SMA,PRICE_CLOSE,0);
         SlowMA50=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
         
         Total=OrdersTotal();
         if(Total<1)
         {
            if(Ask>FastMA15&&FastMA15>SlowMA50)
               {
               idno=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"LingV1",0,0,Blue);
               }
            if(Ask<FastMA15&&FastMA15<SlowMA50)
               {
               OrderClose(idno,1,Ask,3,Red);
               }       
         } 
                   

   return(0);
  }


เท่าที่ผมเดา  น่าจะผิดเงื่อนไขรึป่าวครับ แต่ ที่ต้องการก็คือ ถ้า Ask ตัด FastMA15 และ FastMA15 ตัด Slow MA 50 ลง ก็ให้ปิดครับ ผมก็ว่าน่าจะสร้างเงื่อนไขถูกแล้วนะครับ แต่มันก็ไม่ปิดครับ

รบกวนท่านอาจารย์ Admin และอื่น ๆ หน่อยนะครับ

ชี้แนะเด็กใหม่ด้วยครับ

Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: admin on มกราคม 21, 2010, 12:20:04 pm
ผิดที่ คำสั่ง OrderClose ครับ
ถ้าเป็น buy order ต้องปิดแบบนี้ครับ OrderClose(OrderTicket(),OrderLots(),Bid,3,RED);
ถ้าเป็น sell order ต้องปิดแบบนี้ครับ OrderClose(OrderTicket(),OrderLots(),Ask,3,RED);
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: lancelot on มกราคม 21, 2010, 02:58:41 pm
Admin คร๊าบบบบบบบบบ
    ผมอยากเปิดออร์เดอร์หลาย ๆ ออร์เดอร์ครับ เช่น เปิด ออร์เดอร์ใหม่ ทุก ๆ สิบจุดอะไรประมาณนี้  ผมต้องทำไงหรอครับ เพราะคราวที่แล้ว ใช้ total<1 แปลว่าเปิดได้ออร์เดอร์เดียว  เช่น

ถ้า ask>FastMA>SlowMA  ให้เปิดออร์เดอร์ และเปิดจากออร์เดอร์แรก ทุก ๆ 10 จุดอะไรประมาณนี้ครับ

ผมลองใช้ for แต่มัน ไม่ได้อะครับ งงครับ

for(int i=0;i<0;i++)

ใช้ยังไงครับ

Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: admin on มกราคม 21, 2010, 06:37:07 pm
ใช้แบบนี้ 

if(total>=1)

       
      OrderSelect(total-1,SELECT_BY_POS,MODE_TRADES);
     double price = OrderOpenPrice();
     
     if( ask>FastMA>SlowMA  && Ask -price >Point*10)
      {

           OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"LingV1",0,0,Blue);

      }




}
Title: Re: ช่วยดูให้หน่อยครับกำลังหัดเขียน
Post by: linconz on มกราคม 21, 2010, 11:42:51 pm
สมมุติ เปิด buy ที่ OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"LingV1",0,0,Blue);

แล้วอยากให้เปิดที่ 10 จุดข้างล่างก็

OrderSend(Symbol(),OP_BUYLIMIT,1,Ask-10*point,3,0,0,"LingV1",0,0,Blue);

แล้วถ้าอยากได้อีก 10 จุดก็

OrderSend(Symbol(),OP_BUYLIMIT,1,Ask-20*point,3,0,0,"LingV1",0,0,Blue);

 ;)