กองทุน SPDR GOLD SHARES
ถือทองก่อนหน้า
ถือทองล่าสุด
0.00
*หน่วยตัน / ราคาอ้างอิงล่าสุดจากสมาคมค้าทองคำ
สถิติกองทุน SPDR
ราคาทองคำแท่ง 96.5%
ราคาอ้างอิงล่าสุดจากสมาคมค้าทองคำ
ครั้งที่
ราคาก่อนหน้า
ราคาล่าสุด
0
(หน่วย บาท*) / อัปเดตล่าสุดเมื่อวันที่ 13 ก.ค. 2566 เวลา 13:04 น.
สถิติราคาทองคำ ไทย

กรณีเมื่อเข้าออร์เดอร์แรกในแท่งเทียนอันแรกแล้ว ต่อมาเราอยากจะให้เข้าออร์เดอร์ที่สองในแท่งเทียนถัดไป

  • 11 replies
  • 2,705 views
*

arteefengfu

สวัสดีครับ รบกวนขอความช่วยเหลือ พอมีตัวอย่างโค๊ต กรณีเมื่อเข้าออร์เดอร์แรกในแท่งเทียนอันแรกแล้ว ต่อมาเราอยากจะให้เข้าออร์เดอร์ที่สองในแท่งเทียนถัดไป แบบนี้ต้องเขียนโค๊ตอย่างไรครับ

รบกวนขอความช่วยเหลือด้วยครับ ขอบคุณครับ (TH)**

*

admin

  • 80,404
"เอาชนะใจตัวเองให้ได้ ก่อนที่จะไปเอาชนะตลาด"

*

iRuler

  • 1,282
อ้างจาก: arteefengfu ที่ 23, กันยายน  2018, 10:11:05 PM
สวัสดีครับ รบกวนขอความช่วยเหลือ พอมีตัวอย่างโค๊ต กรณีเมื่อเข้าออร์เดอร์แรกในแท่งเทียนอันแรกแล้ว ต่อมาเราอยากจะให้เข้าออร์เดอร์ที่สองในแท่งเทียนถัดไป แบบนี้ต้องเขียนโค๊ตอย่างไรครับ

รบกวนขอความช่วยเหลือด้วยครับ ขอบคุณครับ (TH)**

ปกติผมทำแบบนี้ครับ

int bar=-1;

void OnTick()
  {
    //code ส่วนนี้จะทำงานทุกๆ tick
   ...
   ...

  if(bar==Bars)
    return;
  bar=Bars;

  //code หลังจากบันทัดนี้ จะทำงานเฉพาะเกิดแท่งใหม่
  ...
  ...

  }

*

arteefengfu

ขอบคุณครับ
อ้างจาก: iRuler ที่ 24, กันยายน  2018, 07:07:43 AM
อ้างจาก: arteefengfu ที่ 23, กันยายน  2018, 10:11:05 PM
สวัสดีครับ รบกวนขอความช่วยเหลือ พอมีตัวอย่างโค๊ต กรณีเมื่อเข้าออร์เดอร์แรกในแท่งเทียนอันแรกแล้ว ต่อมาเราอยากจะให้เข้าออร์เดอร์ที่สองในแท่งเทียนถัดไป แบบนี้ต้องเขียนโค๊ตอย่างไรครับ

รบกวนขอความช่วยเหลือด้วยครับ ขอบคุณครับ (TH)**

ปกติผมทำแบบนี้ครับ

int bar=-1;

void OnTick()
  {
    //code ส่วนนี้จะทำงานทุกๆ tick
   ...
   ...

  if(bar==Bars)
    return;
  bar=Bars;

  //code หลังจากบันทัดนี้ จะทำงานเฉพาะเกิดแท่งใหม่
  ...
  ...

  }


ขอบคุณครับ  (TH)**

*

arteefengfu

ลองทำแล้วครับ แต่ปรากฎว่า ตรง EntryBuy2() ไม่เข้าออร์เดอร์ให้เลยครับ

แต่พอมาวาง EntryBuy2() ตรงเหนือบรรทัด if(bar==Bars) ก็เข้า ออร์เดอร์ทุก tick ซ้ำๆในแท่งเทียนอันเดียวกันครับ

อยากให้เข้า หนึ่งออร์เดอร์ในแท่งเทียนปัจจุบัน ต่อมาอยากจะให้เข้าออร์เดอร์ที่สองในแท่งเทียนถัดไป น่ะครับ

รบกวนขอความช่วยเหลือด้วยครับ ขอบคุณครับ

void OnTick(){   

        EntryBuy2(); -----> วางตรงนี้เข้าออร์เดอร์ทุกๆ tick ซ้ำๆในแท่งเทียนอันเดียวกันครับ

   if(bar==Bars)
     return;
      bar=Bars;


   EntryBuy();
        EntryBuy2(); -----> วางตรงนี้ไม่เข้าออร์เดอร์ให้ครับ
}
//+------------------------------------------------------------------+
void EntryBuy(){

      double Move1=NormalizeDouble(iMA(Symbol(),0,20,0,MODE_EMA,PRICE_CLOSE,Bar),3);
      double Move2=NormalizeDouble(iMA(Symbol(),0,50,0,MODE_EMA,PRICE_CLOSE,Bar),3);
      double Move3=NormalizeDouble(iMA(Symbol(),0,100,0,MODE_EMA,PRICE_CLOSE,Bar),3);
      double Move4=NormalizeDouble(iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,Bar),3);
     
         if( Move1<Move2 && Move2<Move3 && Move3<Move4 ){
            if( OrderBuyCountMagic0()<1 ){
               tic1=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"1",Magic0,0,clrGreen);}
   }
}
//+------------------------------------------------------------------+
void EntryBuy2(){

      double Move1=NormalizeDouble(iMA(Symbol(),0,20,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 20
      double Move2=NormalizeDouble(iMA(Symbol(),0,50,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 50
      double Move3=NormalizeDouble(iMA(Symbol(),0,100,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 100
      double Move4=NormalizeDouble(iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 200
     
         if( Move1<Move2 && Move2<Move3 && Move3<Move4 ){
            if( OrderBuyCountMagic0()==1  && Ask<=Low[1]){
               tic3=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"1",Magic1,1,clrSeaGreen);}
   }
}
//+------------------------------------------------------------------+
int OrderBuyCountMagic0(){
   int i = OrdersTotal()-1;
   int count =0;
   for(;i>=0;i--)
   {
      if( OrderSelect(i,SELECT_BY_POS) ){
         if(OrderMagicNumber()==Magic0 && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
         count++;
         }
   }
   return(count);
}
//+------------------------------------------------------------------+

*

iRuler

  • 1,282
ลองแบบนี้ดูครับ

void OnTick()
  {
   if(bar==Bars)
      return;
   bar=Bars;

   int c=OrderBuyCountMagic0();

   if(c==0)
      EntryBuy();
   else if(c==1)
      EntryBuy2();
  }
//+------------------------------------------------------------------+
void EntryBuy()
  {
   double Move1=NormalizeDouble(iMA(Symbol(),0,20,0,MODE_EMA,PRICE_CLOSE,Bar),3);
   double Move2=NormalizeDouble(iMA(Symbol(),0,50,0,MODE_EMA,PRICE_CLOSE,Bar),3);
   double Move3=NormalizeDouble(iMA(Symbol(),0,100,0,MODE_EMA,PRICE_CLOSE,Bar),3);
   double Move4=NormalizeDouble(iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,Bar),3);

   if(Move1<Move2 && Move2<Move3 && Move3<Move4)
     {
      //if( OrderBuyCountMagic0()<1 ){
      tic1=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"1",Magic0,0,clrGreen);
      //}
     }
  }
//+------------------------------------------------------------------+
void EntryBuy2()
  {
   double Move1=NormalizeDouble(iMA(Symbol(),0,20,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 20
   double Move2=NormalizeDouble(iMA(Symbol(),0,50,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 50
   double Move3=NormalizeDouble(iMA(Symbol(),0,100,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 100
   double Move4=NormalizeDouble(iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 200

   if(Move1<Move2 && Move2<Move3 && Move3<Move4)
     {
      //if(OrderBuyCountMagic0()==1  && Ask<=Low[1])
      if(Ask<=Low[1])
        {
         tic3=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"1",Magic1,1,clrSeaGreen);
        }
     }
  }

*

admin

  • 80,404
ขอบคุณครับท่านเป็นแหล่ง เทพ Code Mql4 เลยจริงๆ
็Hea** ็Hea**
"เอาชนะใจตัวเองให้ได้ ก่อนที่จะไปเอาชนะตลาด"

*

arteefengfu

ขอบคุณครับ ลองทำตามแล้ว เข้าแค่ออร์เดอร์ EntryBuy() แต่ไม่เข้าออร์เดอร์ EntryBuy2() ให้ครับ
รบกวนด้วยครับ

อ้างจาก: iRuler ที่ 25, กันยายน  2018, 08:44:47 AM
ลองแบบนี้ดูครับ

void OnTick()
  {
   if(bar==Bars)
      return;
   bar=Bars;

   int c=OrderBuyCountMagic0();

   if(c==0)
      EntryBuy();
   else if(c==1)
      EntryBuy2();
  }
//+------------------------------------------------------------------+
void EntryBuy()
  {
   double Move1=NormalizeDouble(iMA(Symbol(),0,20,0,MODE_EMA,PRICE_CLOSE,Bar),3);
   double Move2=NormalizeDouble(iMA(Symbol(),0,50,0,MODE_EMA,PRICE_CLOSE,Bar),3);
   double Move3=NormalizeDouble(iMA(Symbol(),0,100,0,MODE_EMA,PRICE_CLOSE,Bar),3);
   double Move4=NormalizeDouble(iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,Bar),3);

   if(Move1<Move2 && Move2<Move3 && Move3<Move4)
     {
      //if( OrderBuyCountMagic0()<1 ){
      tic1=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"1",Magic0,0,clrGreen);
      //}
     }
  }
//+------------------------------------------------------------------+
void EntryBuy2()
  {
   double Move1=NormalizeDouble(iMA(Symbol(),0,20,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 20
   double Move2=NormalizeDouble(iMA(Symbol(),0,50,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 50
   double Move3=NormalizeDouble(iMA(Symbol(),0,100,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 100
   double Move4=NormalizeDouble(iMA(Symbol(),0,200,0,MODE_EMA,PRICE_CLOSE,Bar),3); // 200

   if(Move1<Move2 && Move2<Move3 && Move3<Move4)
     {
      //if(OrderBuyCountMagic0()==1  && Ask<=Low[1])
      if(Ask<=Low[1])
        {
         tic3=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"1",Magic1,1,clrSeaGreen);
        }
     }
  }


*

iRuler

  • 1,282
ลองเปลี่ยน EntryBuy2() เป็นแบบนี้ครับ แล้วดูว่า มันวาดเส้นให้ไหม
ถ้าวาดเส้น vertical ให้ก็แสดงว่า ปัญหาอยู่ที่เงื่อนไขพวกเส้น MA ใน EntryBuy2()

void EntryBuy2()
{
drawVerticalLine();
}





//
void drawVerticalLine() {
   
   string lineName = "Line"+MathRand();

   if (ObjectFind(lineName) != 0) {
      ObjectCreate(lineName,OBJ_VLINE,0,Time[0],0);
      ObjectSet(lineName,OBJPROP_COLOR, clrRed);
      ObjectSet(lineName,OBJPROP_WIDTH,1);
      ObjectSet(lineName,OBJPROP_STYLE,STYLE_DOT);
   }
}

*

arteefengfu

ขอบคุณท่าน iRuler มากครับ ผมลองทำแล้วปรากฎว่า มันวาดเส้นแนวตั้งให้ ไม่ทราบว่าจะแก้ไขปัญหานี้อย่างไรครับ
เพราะผมลองเปลี่ยน ตรง EntryBuy2() เป็น if(Ask >= Low[1]) ปรากฎว่า มันเข้าออร์เดอร์ให้ในทุกแท่งเทียนครับ

รบกวนด้วยครับ ของคุณครับ

อ้างจาก: iRuler ที่ 25, กันยายน  2018, 12:06:02 PM
ลองเปลี่ยน EntryBuy2() เป็นแบบนี้ครับ แล้วดูว่า มันวาดเส้นให้ไหม
ถ้าวาดเส้น vertical ให้ก็แสดงว่า ปัญหาอยู่ที่เงื่อนไขพวกเส้น MA ใน EntryBuy2()

void EntryBuy2()
{
drawVerticalLine();
}





//
void drawVerticalLine() {
   
   string lineName = "Line"+MathRand();

   if (ObjectFind(lineName) != 0) {
      ObjectCreate(lineName,OBJ_VLINE,0,Time[0],0);
      ObjectSet(lineName,OBJPROP_COLOR, clrRed);
      ObjectSet(lineName,OBJPROP_WIDTH,1);
      ObjectSet(lineName,OBJPROP_STYLE,STYLE_DOT);
   }
}

*

iRuler

  • 1,282
อธิบายหลักการทำงานของ ea ตัวนี้มาหน่อยครับ

*

arteefengfu

หลักการทำงานของ ea ตัวนี้ คือ
๑. เมื่อ Moving Average 20 >50 > 100 > 200
๒. ให้เข้า ออร์เดอร์ Buy (EntryBuy()) ในครั้งแรก
๓. หลังจากเข้า ออร์เดอร์ Buy ในครั้งแรกแล้ว ให้เข้า ออร์เดอร์ Buy (EntryBuy2()) ในครั้งที่สองในแท่งเทียนถัดไป
๔. ออร์เดอร์ Buy (EntryBuy2()) ในครั้งที่สอง ให้เข้าต่อเมื่อ ราคา Ask ลงมาถึง จุดต่ำสุดของแท่งเทียนก่อนหน้า
๕.และให้เข้า ออร์เดอร์ Buy (EntryBuy2()) ตามเงื่อนไขข้อ ๔ ต่อไปเรื่อยๆ โดยให้เข้าออร์เดอร์เดียวต่อแท่งเทียน เท่านั้น

ขอบคุณครับ