Open Forex4you Account

Server รัน EA 1000 / ปี

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

Author Topic: ขอคำแนะนำในการเขียน function ให้ทำงานเป็นลูป  (Read 16685 times)

TvT

  • Full Member
  • ***
  • Posts: 133
ต้องการเขียน trade ให้ทำงานตามลำดับคือ
A >> B >> C >> D >> E โดยสามารถเปลี่ยนลำดับเพื่อ check ตำแหน่งตัวเองได้ ตอนนี้ใช้การกำหนด
INT ตัวแปร
แล้วใช้ตัวแปรที่ A = 1 , B=2 , ...............
แต่ยังไม่ทำงานมีใครพอแนะนำได้บ้างครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
อธิบายหลัการทำงานให้ชัดหน่อยครับยังงงกับคำถาม

TvT

  • Full Member
  • ***
  • Posts: 133
คือตอนนี้ต้องการการเขียนให้ทำงานตามเงื่อนไข (ขอเขียนคร่าวๆนะครับ พอดีอยู่ข้างนอก) ต้องการให้สามารถตรวจสอบเงื่อนไขดังภาพ
คือทำงานจาก A ไป B ไป C

int A
int start() <<< ถ้าต้องการกำหนดให้รับส่งค่า A ต้องเป็น
int start(int A) ใช่ไหมครับ (จากบทที่ 5 ครับ)

{
if (A=1)
          {
           buy-sell
           A = 2
           return(0) <<< ตรงนี้ต้องมี return ส่งค่า A ออกหรือไม่ และต้องใช้ return(0) หรือ return(A)
           }
if (A=2)
          {
           if (123456)
               {buy-sell
               A = 3
               return(0)}
           else (233455)
               {buy-sell
               A = 1
               return(0)}
           }

///  ในส่วน A=2 ต้องการตรวจเงื่อนไข 2 ข้อ โดย ถ้าเข้าเงื่อนไขแรก A=1 (กลับไปเริ่ม loop ใหม่) และเงื่อนไขที่ 2 A=3 (ไปต่อ)////
if (A=3)
          {
           buy-sell
           A = 1
           return(0)
           }
return(0) <<< ตรงนี้ต้องการให้ส่งค่า A กลับออกมาต้อง return(A)
}


คร่าวๆก็ราวๆนี้ครับที่ต้องการคือตรงสีน้ำเงินที่ ให้แยกได้ว่า long อยู่จะ check ว่าถือลองต่อหรือเปลี่ยนเป็น short ถ้า short ให้ไปต่อ แต่ long ให้เริ่มนับหนึ่งใหม่

TvT

  • Full Member
  • ***
  • Posts: 133
ตัวนี้ผมพยายามเขียนให้ detect eliott wave ได้ โดยคอยตรวจสอบตัวเองว่าอยู่ที่
1-2-3-4-5-a-b-c ครับ โดยให้มันคอย check ตัวเองว่าอยู่ตรงไหนครับ

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ทำความเข้าใจนิดนะครับ เมื่อใช้คำสั่ง return นี้คือการจบการทำงานของฟังก์ชั่นเลยนะครับ ส่วนค่าที่จะ return 0 หรือ a ก็แล้วแต่ที่คุณต้องการครับ ถ้า 0 ก็คือการส่งค่า 0 ออก ถ้าหากเป็น a ก็คือการส่งค่าที่ a เก็บไวออกมาครับ

TvT

  • Full Member
  • ***
  • Posts: 133
แล้วที่ int start()
ก่อนเข้า {} ต้องกำหนดไหมครับว่าจะให้ส่งอะไรออกมา (พอดี ในบทที่ 5 เห็นมีเขียนอยู่)


และถ้า 2 ชั้น  {
                    {}
                }

ต้องแบบนี้เลยไหม (ส่งออก 2 ที)
{
                    {
                     return(A);
                     }
return(A);
}

ขอบคุณครับ

sola48

  • Newbie
  • *
  • Posts: 22
return มันจะจบการทำงานของ function เลยครับ ไม่ว่าตรงไหนก็ตาม

ps.ไม่เกทคำถามข้อแรกอะครับ รอ ผู้รุ้ละกัน รู้แค่นี้อ่ะนะ  ;D

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ที่ int start() ไม่ต้องกำหนดครับเพราะเป็นฟังก์ชั่นแรกที่ EA เริ่มทำงานแต่ถ้าเป็นฟังก์ชั่นชื่ออื่นๆๆ จะกำหนดหรือม่กำหนดก็ได้ขึ้นอยู่กับเราว่าต้องการส่งค่าผ่านนอกเข้าไปใช้ในฟังก์ชั่นหรือเปล่าครับ

D_Diamond

  • Hero Member
  • *****
  • Posts: 673
    • Expert Forex Trading
ถ้าจะทำแบบนั้นก็ไม่ต้องสนใจ return ครับ  ใช้ retuen(0); ไปตามปรกติวางไว้ตรงจุดที่อยากให้เด้งออกนอกฟังก์ชั่น   ถ้าไม่อยากกให้เด้งออก ก็ไม่ต้องมี

ท่านกำหนดตัวแปร A ไว้อยู่แล้ว   ตัวแปรมันก็เปลี่ยนแปลงไปตลอดเวลาตามเงื่อนไขอยู่แล้ว   

สำคัญคือ ตัวแปร A ต้องประกาศไว้นอกฟังก์ชั่น  ส่วนที่เขาเรียกว่าอะไรนะ  global รึเปล่า

TvT

  • Full Member
  • ***
  • Posts: 133
double ticket, total;
int trend = 0;

int start(int trend)
{
///high-low///
total=OrdersTotal();
double lasthigh = High[iHighest(NULL,0,2,250,31)];
double lastlow = Low[iLowest(NULL,0,2,250,31)];
double high = lasthigh * 1.001;
double low =  lastlow * 0.999;
//////
double ema40=iMA(NULL,0,40,0,MODE_EMA,PRICE_CLOSE,1);
double ema80=iMA(NULL,0,80,0,MODE_EMA,PRICE_CLOSE,1);
double high30 = High[iHighest(NULL,0,3,30,1)];
double low30 = Low[iLowest(NULL,0,3,30,1)];
if(total<1)
                  {
                  if((high30<high) && (low30>low))
                        {
                        if(ema40>ema80)
                                    {
                                    ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0,"Short",0,0,Red);
                                    OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                    Print("sale");
                                    }
                       
                        if(ema40<ema80)
                                    {
                                    ticket=OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Long",0,0,Green);
                                    OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                    Print("buy");
                                    }         
                        trend = 0;
                        return(trend);
                        }
                  if((ema80<ema40) && (high30>low))
                                    {
                                    ticket=OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Long",0,0,Green);
                                    OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                    Print("buy");
                                    trend = 1;
                                    return(trend);
                                    }                       
                  if((ema80>ema40) && (low30<low))
                                    {
                                    ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0,"Short",0,0,Red);
                                    OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                                    Print("sale");
                                    trend = 5;
                                    return(trend);
                                    }
                  return(trend);
                  }
/////////////                 
if(total>0)
                  {
                  if ((OrderType() == OP_BUY)&&(high30>high))
                        {
                        trend = 1;
                        return(trend);
                        }
                  if (trend ==1 && OrderType()==OP_BUY && ema40<ema80)
                        {
                        {OrderClose(OrderTicket(),OrderLots(),Bid,0,Blue);
                         Print("sale");
                        }
                        {ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0,"Short",0,0,Red);
                         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                         Print("sale");
                        }                       
                        trend = 2;
                        return(trend);
                        }
                  if (trend ==2 && OrderType()==OP_SELL && ema40>ema80)
                        {
                        {OrderClose(OrderTicket(),OrderLots(),Ask,0,Blue);
                         Print("buy");
                        }
                        {ticket=OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Long",0,0,Green);
                         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                         Print("buy");
                        }
                        trend = 3;
                        return(trend);
                        }
                  if (trend ==3 && OrderType()==OP_BUY && ema40<ema80)
                        {
                        {OrderClose(OrderTicket(),OrderLots(),Bid,0,Blue);
                         Print("sale");
                        }                 
                        trend = 0;
                        return(trend);
                        }                                                     
                  if ((OrderType() == OP_SELL)&&(low30<low))
                        {
                        trend = 5;
                        return(trend);
                        }                   
                  if (trend ==5 && OrderType()==OP_SELL && ema40>ema80)
                        {
                        {OrderClose(OrderTicket(),OrderLots(),Ask,0,Blue);
                         Print("buy");
                        }
                        {ticket=OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Long",0,0,Green);
                         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                         Print("buy");
                        }
                        trend = 6;
                        return(trend);
                        }
                  if (trend ==6 && OrderType()==OP_BUY && ema40<ema80)
                        {
                        {OrderClose(OrderTicket(),OrderLots(),Bid,0,Blue);
                         Print("sale");
                        }
                        {ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0,"Short",0,0,Red);
                         OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
                         Print("sale");
                        }                       
                        trend = 7;
                        return(trend);
                        }                       
                  if (trend ==7 && OrderType()==OP_SELL && ema40>ema80)
                        {
                        {OrderClose(OrderTicket(),OrderLots(),Ask,0,Blue);
                         Print("buy");
                        }
                        trend = 0;
                        return(trend);
                        }
                       
                  }                 
return (trend);
}

TvT

  • Full Member
  • ***
  • Posts: 133
นี่คือ EA ที่เขียนและต้องการให้ check เงื่อนไขครับ ปัญหาคือผมต้องการให้ทุกครั้งที่ได้ค่า "trend" ผมต้องการให้ถูกดึงไปเซฟในเครื่อง แล้วดึงค่านี้ออกมา และแก้ไขเซฟใหม่เวลาได้ค่าใหม่ (ไม่งั้นเวลาเปิด restart com  ทีมีล้มละลายได้)

เวลาไล่ทุกครั้งที่มีแท่งให้ให้ check
if ((OrderType() == OP_BUY)&&(high30>high))
                        {
                        trend = 1;
                        return(trend);
                        }
                  if ((OrderType() == OP_SELL)&&(low30<low))
                        {
                        trend = 5;
                        return(trend);
                        }

เพื่อตรวจการทำนิว high-low ก่อนทุกครั้งแล้วจึงตรวจเงื่อนไขอื่นๆต่อไป

อยากจะขอให้ช่วยแก้ไข EA ให้ครับ และถ้าสามารถบอกตำแหน่งที่แก้ function ที่ใช้ เป็นตัวแดงจะดีมาก (เพื่อศึกษาครับ)


ปล. web นี้คนดูสนใจการทำงาน arbritage มากเลยนะครับ(พวกเล่นหลาย pair) , เอาจิงๆสู้เล่นตามเทรนไม่ได้หรอกครับ (จากประสบการณ์เล่นมือ)
« Last Edit: สิงหาคม 09, 2010, 10:45:44 pm by TvT »

admin

  • Administrator
  • Hero Member
  • *****
  • Posts: 2386
ปัญหาคือผมต้องการให้ทุกครั้งที่ได้ค่า "trend" ผมต้องการให้ถูกดึงไปเซฟในเครื่อง แล้วดึงค่านี้ออกมา และแก้ไขเซฟใหม่เวลาได้ค่าใหม่ แบบนี้ต้องใช้การเขียนไฟลืช่วยครับ ลองเข้าไปที่ refrence แล้ว search หา  FileReadString()   FileWriteString() ดูครับ

TvT

  • Full Member
  • ***
  • Posts: 133
ครับ จะไปลองดูขอบคุณครับ

แล้วช่วยแก้ EA ข้างต้นให้ซื้อขายได้มั้ยครับ ไม่แน่ใจว่าผิดตรงไหนครับ

เข้าใจว่าน่าจะเป็นตัวแปร trend ไม่ถูกต้อง แต่ไม่แน่ว่าต้องแก้ยังไงบ้างครับ

ปล. sig host นี่รูปอะไรครับ
« Last Edit: สิงหาคม 11, 2010, 06:45:51 am by TvT »