EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: Jummum on กันยายน 01, 2010, 11:34:56 pm

Title: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 01, 2010, 11:34:56 pm
พอดีผมอ่านจากกระทู้เก่าๆมาเรื่องการเอาค่าจากอินดิเคเตอร์มาใช้ตามนี้เลย
double a,b,c;
if( เส้นแรก == เส้นสอง หรือ คอนดิชั่นที่คิดว่ามันตัดกันหรืออะไรก็ได้ที่เป็น event ของคุณ)
   {
       c=b;
       b=a;
       a=ค่าที่อยากบันทึก อะไรก็ว่ากันไป ;
    }

ใช้ได้กับอะไรก็ได้ที่ส่งค่าออกมา ไม่ได้ส่งค่า null ออกมา

แต่พอเขียนตามแล้วเหมือนมัไม่สามารถอ่านค่าได้ ช่วยอธิบายหน่อยครับ
ขอตัวอย่างด้วยจะขอบคุณมาก
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 02, 2010, 01:24:02 am
ถ้าคุณต้องการ EA ที่เปิดจากการตัดกันของ อินดิเคเตอร์ ลองเอา code เก่าตัวนี้ไปดูครับเป็น EA ที่จะเปิดเมื่อค่าของเส้น MA ตัดกับราคาปัจจุบันครับ



int check (double bidprice ,double sma) // ฟังก์ชั่นตรวจสอบการตัดกัน
{    static int lastway =0;
     static int way     =0;
     
     if(bidprice > sma)
     {
        way=1;
     
     }
   
    if(bidprice < sma)
     {
        way=2;
     
     }
     
     if(way!= lastway)
     {
        lastway = way;
        return (lastway);     
     }
 
       return (0);

}

int start()
  {     
         double ma =iMA(NULL,0,13,0,MODE_SMMA,PRICE_MEDIAN,0);
         
         int kway = check(Bid,ma); // เรียกใช้งานฟังก์ชั่นตรวจสอบ
         
         int total =OrdersTotal();
         int ticket;
         double Lots=0.1;
         
         if(total==0)
         {
             if(kway==1)
             {
                OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Point*20,Ask+Point*10,"smaaa",0,0,Green);
             
             
             
             }
         
             if(kway==2)
             {
             
                 OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Point*20,Bid-Point*10,"smaaa",555,0,Red);
               
             
             }
         
         
         }
         
         
         
         
         
         
         

   return(0);
  }
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 02, 2010, 08:07:45 am
ขอบคุนครับ พอดีเพิ่งศึกษา
ไม่เข้าใจอันนี้
     if(way!= lastway)
     {
        lastway = way;
        return (lastway);     
     }
 
       return (0);
หมายความว่าอะไรครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 02, 2010, 11:39:39 am
 if(way!= lastway)
     {
        lastway = way;
        return (lastway);     
     }
 
       return (0);

เป็นการตรวจสอบการตัดครับ way เป็นตัวแปรที่เราให้บันทึกการตัดครั้งสุดท้ายเอาไว หากเราตรวจสอบได้ว่าปัจจุบัน ราคากับ ma เกิดการเปลี่ยนแปลงจาก way ก็คือมีการตัดกันเกิดขึ้นครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 02, 2010, 11:55:41 am
เข้าใจยากจังครับ!!
ขอรบกวนอีกหน่อยแล้วถ้าจะบันทึกค่าไว้
คือเจตนาอยากได้สามค่าที่ตัดขึ้นล่าสุดน่ะครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 02, 2010, 01:08:09 pm
จะบันทึกค่าใช่ไหมครับ มี 2 วิธีคือ
1.คือใช้ตัวแปร แบบ static  โดยประกาศก่อนฟังก์ชั่น  start()
    static int way;
int start()
{


}

แบบนี้ตัวแปร way จะจำค่าเอาไวจนกว่าเราจะปิด EA หรือมีการเปลี่ยนแปลงค่าครับ

2.วิธีที่ 2 คือการเขียนลงไฟล์วิธีการนี้ยุ่งยากครับเพราะต้องมีการอ่านไฟล์ และ เขียนไฟล์ควบคู่กันครับแต่วิธีนี้ค่าที่ได้จะอยู่ถึงแม้เราจะปิด EA ก็ตามก้เหมือนการ save ไฟล์ทั่วไปครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 02, 2010, 10:09:15 pm
คือช่วยแก้ให้ผมหน่อย คือพยายามแล้วแต่ไม่ได้
ยังไงมันก็ไม่จำค่าน่ะครับ
จุดประสงค์คือ Stochistic ตัดขึ้นสามครั้ง ค่าน้อยลงเรื่อยๆ
ให้เปิดสัญญาซื้อ ต่อมาถ้าตัดลงให้เปิดสัญญา
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 02, 2010, 10:56:11 pm
จุดประสงค์คือ Stochistic ตัดขึ้นสามครั้ง ค่าน้อยลงเรื่อยๆ   งง ตรงนี้หละครับช่วยอธิบายให้ละเอียดหน่อยครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 02, 2010, 10:59:45 pm
ก็คือสมุติ ตัดขึ้นครั้งที่ 1 = 30; 2=25; 3=20
ก็จะเปิดสัญญา เลยอยากหาวิธีจำค่าที่ตัดกันไว้เพื่อเอามาเทียบน่ะครับ
แต่stoตอนที่ตัดกันมันไม่มีค่า(ใช้โปรแกรมของแอดมินดู)เลยใช้ก่อนหลังบวกกันหารสองแทน
ขอบคุนที่ตอบ แล้วก็ขอบคุนล่วงหน้าที่ช่วยแก้ให้ครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 02, 2010, 11:37:10 pm
งั้นถามต่อ การตัดนี้เราเริ่มนับ 1 จากตอนที่เปิด EA ใช่ไหมครับ ตัดครั้งแรกก็เก็บค่าไวที่ตัวแปรตัวแรก   ตัวครั้งที่ 2 ก็เก็บค่าไวตัวแปรตัวที่ 2 ตัดครั้งที่ 3 ก็เก็บค่าไวตัวแปรตัวที่ 3 ใช่ไหม
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 03, 2010, 08:27:55 am
ใช่ครับ ช่วยหน่อยนะครับ
พอดีผมอ่านมาจากเวบนอกเรื่องเอาไปใช้
มีทั้งดูไดเวิด ดูค่าอย่างที่บอกหาจุดกลับตัว
แต่ยังไงก็ต้องหาวิธีอ่านค่าที่ตัดกันออกมาก่อน
ก็อยากเอามาพัฒนาต่อ รบกวนด้วยนะครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 04, 2010, 03:23:10 am
ลองเอาไปดูครับ


extern double Lots=0.1;
extern int SL=20;
extern int TP=10;
static double one;
static double two;
static double three;


int check (double stosignal ,double stomain)
{    static int lastway =0;
     static int way     =0;
     
     if(stosignal > stomain)
     {
        way=1;
     
     }
   
    if(stosignal < stomain)
     {
        way=2;
     
     }
     
     if(way!= lastway)
     {
        lastway = way;
       
        if( ( one == 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            one=Bid;
       
           return(0);
       
        }
       
         if( ( one != 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            two=Bid;
           
            return(0);
       
        }
       
          if( ( one != 0) &&   (two != 0)   &&   (three== 0)    )
       
        {
            three=Bid;
           
            return(0);
       
        }
       
         if( ( one != 0) &&   (two != 0)   &&   (three!= 0)    )
       
        {    one=Bid;
             two=0;
             three=0;
           
            return(0);
       
        }
       
           
     }
 
       return (0);

}

int start()
  {     
         double stomain=iStochastic(Symbol(),30,5,5,5,MODE_SMA,1,MODE_MAIN,0);
          double stosignal=iStochastic(Symbol(),30,5,5,5,MODE_SMA,1,MODE_SIGNAL,0);
         
         int kway = check(stosignal,stomain);
         
         int total =OrdersTotal();
     
       
         
         if(total==0)
         {
             if(one > (two > three) )
             {
                OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Point*SL,Ask+Point*TP,"smaaa",0,0,Green);
             
             
             
             }
         
             if(one < (two < three) )
             {
             
                 OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Point*SL,Bid-Point*TP,"smaaa",555,0,Red);
               
             
             }
         
         
         }
         
           
   return(0);
  }
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 04, 2010, 12:12:23 pm
สงสัยครับว่า one=Bid Bid คืออะไร ราคาในตอนนั้นหรือป่่าว
เอาไปรันแล้วมันไม่เห็นจำค่าเลย
ก็ยังเข้าทุกครั้งที่ตัดกันเหมือนเดิมอ่ะ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 04, 2010, 12:28:35 pm
one = Bid คือให้มันจำค่าตอนตัด ที่มันยังเปิดอยู่เพราะเงื่อไขการเปิดนี้ครับ

   if(total==0)
         {
             if(one > (two > three) )
             {
                OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Point*SL,Ask+Point*TP,"smaaa",0,0,Green);
             
             
             
             }
         
             if(one < (two < three) )
             {
             
                 OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Point*SL,Bid-Point*TP,"smaaa",555,0,Red);
               
             
             }
         
         
         }
คุณต้องเอาไปเขียนต่อเองครับว่าจะให้มันทำงานยังไง ค่าจะถูกจำอยู่ใน ตัวแปร one two three ครับ ลอง print ออกมาดูครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 04, 2010, 04:01:32 pm
ผมคงอธิบายงง..
คือเอาแบบในรูปอ่ะครับ คงเข้าใจง่ายผมอธิบาย
ตัดขึ้นแต่ละครั้งค่าจุดตัดของStoมากขึ้นเรื่อยๆ
ดูเหมือนง่ายแต่พยายามเท่าไหร่ก็เขียนไม่ได้
เอาค่าจุดตัดออกมาไม่ได้ ช่วยทีนะครับ
ขอบคุณอีกครั้ง แล้วก็ขอโทดที่ทำให้เสียเวลาหลายรอบ ;D
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 04, 2010, 06:06:54 pm
ลอง copy ไปแล้ว backtest ดู ค่าผมสั่งให้ print ออกมาดูแล้วครับ แต่ถ้าจะให้ sure รวันจันทร์ตลาดเปิดแล้วค่อยดูอีกทีเพราะ backtest ไม่แน่นอน
extern double Lots=0.1;
extern int SL=20;
extern int TP=10;
static double one =0;
static double two = 0;
static double three = 0;
static int lastway =0;

int check (double stosignal ,double stomain)
{   
     static int way     =0;
     
 
     
     if(stosignal > stomain)
     {
        way=1;
     
     }
   
    if(stosignal < stomain)
     {
        way=2;
     
     }
     if(way==2)
     {
        lastway=2;
     
     }
     
     if(way == 1 && lastway!= way)
     {
        lastway = 1;
       
        if( ( one == 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            one=Bid;
       
           return(0);
       
        }
       
       if( ( one != 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            two=Bid;
           
            return(0);
       
        }
       
         if( ( one != 0) &&   (two != 0)   &&   (three== 0)    )
       
        {
            three=Bid;
           
            return(0);
       
        }
       
     
       
           
     }
 
       return (0);

}

int start()
  {     
         double stomain=iStochastic(Symbol(),30,5,5,5,MODE_SMA,1,MODE_MAIN,0);
         double stosignal=iStochastic(Symbol(),30,5,5,5,MODE_SMA,1,MODE_SIGNAL,0);
         
          check(stosignal,stomain);
         
         
            Print("A :",one);
            Print("B :",two);
            Print("C :",three);
            Print(".....");
           
       // ถ้าจะเอาไปใช้งานจริงๆๆให้เอา /*   */  ออกไม่งั้นค่าจะไม่ถูกล้าง
   /*     if( ( one != 0) &&   (two != 0)   &&   (three!= 0)    )
       
        { one=0;
          two=0;
          three=0;
          }
*/
           
   return(0);
  }
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 04, 2010, 08:59:25 pm
เอาไปรันแล้วครับ แต่...
คือค่าที่ได้เป็นค่า ราคา ไม่ใช่ค่าของ Stochastic อ่ะครับ
ตอนแรกพยายามทำเองอ่ะก็เอามาได้แต่ราคานี่ล่ะครับ แต่ค่าStoนี่จนปัญญาจริงๆ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 04, 2010, 09:59:34 pm
สรูปคือ ต้องการค่าของ Sto ที่มันตัดกันใช่ไหมไม่ใช่ราคา ผมเห็นรูปที่คุณโพส มีลูกศรชี้ไปที่กราฟราคาอ่ะ  ถ้าอยากได้ค่า ณ จุดตัดเลยคงเป็นไปไม่เพราะ sto มันคำนวณจากหน้ากลับไปหลังมันเกิดการตัดกันแล้ว อินมันถึงแสดงจุดตัดให้เราเห็น แต่หาค่าได้ใกล้เคียงที่จุดคือ การเอาค่าที่มันตัดกันแล้ว ณ จุดแรกมาเฉลี่ย ครับ

int check (double stosignal ,double stomain)
{   
     static int way     =0;
     
 
     
     if(stosignal > stomain)
     {
        way=1;
     
     }
   
    if(stosignal < stomain)
     {
        way=2;
     
     }
     if(way==2)
     {
        lastway=2;
     
     }
     
     if(way == 1 && lastway!= way)
     {
        lastway = 1;
       
        if( ( one == 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            one=(stosignal+stomain)/2;
       
           return(0);
       
        }
       
       if( ( one != 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            two=(stosignal+stomain)/2;
           
            return(0);
       
        }
       
         if( ( one != 0) &&   (two != 0)   &&   (three== 0)    )
       
        {
            three=(stosignal+stomain)/2;
           
            return(0);
       
        }
       
     
       
           
     }
 
       return (0);

}
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 05, 2010, 12:55:14 pm
ขอบคุณครับ ได้แล้วๆแต่ไม่ค่อยดีเลยครับ
จะลองเอาค่าตัดลงมาคิดด้วยดู
ผมเขียนแบบนี้ดูปรากดว่าจำแต่ค่าตัดขึ้น
คิดเองนะครับไม่รู้ถูกรึป่าวครับ(คิดว่าผิดเพราะไม่อ่านค่า)

int check (double stosignal ,double stomain)
{   
     static int way     =0;
     if(stosignal < stomain)
     {
        way=1;
     }
     if(way==1)
     {
        lastway2=1;
     }
     if(stosignal > stomain)
     {
        way=2;
     }

//-----------------four five six-----------------------------------
     if(way == 2 && lastway2!= way)
     {
        lastway2 = 1;
        if( ( four == 0) &&   (five == 0)   &&   (six== 0)    )
        {
            four=stosignal;
           return(0);
        }
       if( ( four != 0) &&   (five == 0)   &&   (six== 0)    )
       
        {
            five=stosignal;
            return(0);
        }
         if( ( four != 0) &&   (five != 0)   &&   (six== 0)    )
       
        {
            six=stosignal;
            return(0);
        }
     }
//-----------------one two three-----------------------------------

     if(way==2)
     {
        lastway=2;
     }
     if(way == 1 && lastway!= way)
     {
        lastway = 1;
        if( ( one == 0) &&   (two == 0)   &&   (three== 0)    )
        {
            one=stosignal;
           return(0);
        }
       if( ( one != 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            two=stosignal;
            return(0);
        }
         if( ( one != 0) &&   (two != 0)   &&   (three== 0)    )
       
        {
            three=stosignal;
            return(0);
        }
     }
       return (0);

}

ขอรบกวนอีกครั้ง นะครับพยายาาทำเองตั้งแต่เมื่อคืนไม่เป็นผลเลย
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 05, 2010, 01:03:55 pm
จำแต่ตัดขึ้นทุกต้องครับ เพราะตัวนี้ผมเขียนตามรูปที่คุณโพสไว  ขึ้น 3 ครั้งเปิด buy ผมว่าต้องรอการทำงานในตลาดจริงค่อยพัฒนาต่อครับ  จากที่ดู code มันน่าจะผิดตรงเงื่อนไขการแยกตัดขึ้นหรือตัดลงครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 05, 2010, 01:23:51 pm
คือที่คุณAdmin เขียนให้ก็ได้ค่าตัดขึ้นแล้ว
แต่อยากจำค่าตัดลงด้วยพอทำได้มั๊ยครับ
พยายามเขียนเพิ่มเองให้จำค่าตัดลง
แต่มันไม่ยอมจำเลยเอามาโพสขอคำแนะนำว่าเขียนผิดยังไง
หรือต้องแก้ยังไงให้รบกวนด้วยครับ
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: admin on กันยายน 05, 2010, 10:52:56 pm
แบบนี้น่าจะได้แล้วนะลองเอาทดสอบดูครับ


static double one =0;
static double two = 0;
static double three = 0;
static int lastway =0;
static double four =0;
static double five = 0;
static double six = 0;
static int lastway2 =0;

int check (double stosignal ,double stomain)
{   
     static int way     =0;
     
 
     
     if(stosignal > stomain)
     {
        way=1;
     
     }
   
    if(stosignal < stomain)
     {
        way=2;
     
     }
     if(way==2)
     {
        lastway=2;
     
     }
        if(way==1)
     {
        lastway2=1;
     
     }
     
     if(way == 1 && lastway!= way)
     {
        lastway = 1;
       
        if( ( one == 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            one=(stosignal+stomain)/2;
       
           return(0);
       
        }
       
       if( ( one != 0) &&   (two == 0)   &&   (three== 0)    )
       
        {
            two=(stosignal+stomain)/2;
           
            return(0);
       
        }
       
         if( ( one != 0) &&   (two != 0)   &&   (three== 0)    )
       
        {
            three=(stosignal+stomain)/2;
           
            return(0);
       
        }
           
           
     }
     
     
     if(way == 2 && lastway2!= way)
     {
        lastway2 = 2;
       
        if( ( four == 0) &&   (five == 0)   &&   (six== 0)    )
       
        {
            four=(stosignal+stomain)/2;
       
           return(0);
       
        }
       
       if( ( four != 0) &&   (five == 0)   &&   (six== 0)    )
       
        {
            five=(stosignal+stomain)/2;
           
            return(0);
       
        }
       
         if( ( four != 0) &&   (five != 0)   &&   (six== 0)    )
       
        {
            six=(stosignal+stomain)/2;
           
            return(0);
       
        }
           
           
     }
     
     
 
       return (0);

}
Title: Re: รบกวนแอดมินหน่อยครับ
Post by: Jummum on กันยายน 08, 2010, 10:06:40 pm
ขอบคุณมากเลยครับ