Forex Thai EA

กรุณา เข้าสู่ระบบ หรือ สมัครสมาชิก.

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
การค้นหาขั้นสูง  

ข่าว:

เราจะรวยได้ด้วยบอท

ผู้เขียน หัวข้อ: รบกวนช่วยดู code ให้หน่อยครับ  (อ่าน 327 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

urza

  • Newbie
  • *
  • ออฟไลน์ ออฟไลน์
  • กระทู้: 5
    • ดูรายละเอียด
รบกวนช่วยดู code ให้หน่อยครับ
« เมื่อ: ตุลาคม 08, 2017, 10:03:03 PM »

void movetrailingstop()
{
   for(int i = OrdersTotal()-1;i>=0;i--)
   {
      keep = OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber() == Greenred)
      {
         if(OrderProfit() > 0)
         {
            if(OrderType() == OP_BUY)
              {
               if(Bid - OrderOpenPrice() > 20*Point)
                  {
                     keep = OrderModify(OrderTicket(),OrderOpenPrice(),Bid-20*Point,OrderTakeProfit(),0,0);
                  }
               {
                  if(Bid - OrderStopLoss() > 20*Point)
                  {
                     keep = OrderModify(OrderTicket(),OrderOpenPrice(),Bid-20*Point,OrderTakeProfit(),0,0);
                  }
               }
            } 
            if(OrderType() == OP_SELL)
            { 
               if(OrderOpenPrice() - Ask > 20*Point)
               {
                  if(OrderStopLoss() == 0)
                  { 
                     if(OrderOpenPrice() > Ask + 20*Point)
                     {
                        keep = OrderModify(OrderTicket(),OrderOpenPrice(),Ask+20*Point,OrderTakeProfit(),0,0);
                     }
                  }
                  if(OrderStopLoss() > Ask + 20*Point)
                  {
                     keep = OrderModify(OrderTicket(),OrderOpenPrice(),Ask+20*Point,OrderTakeProfit(),0,0);
                  }
               }
            }
         }
      }
   }
}


void on tick ()
...........................
...........................
...........................

movetrailingstop()

if(............)
..............
..............
..............


บางครั้ง มันปิดติดลบ ครับ ไม่ทราบว่าเพราะอะไร

พอ run backtest แล้ว บางที มันขึ้น error ว่า

OrderModify error ด้วยครับ ไม่ทราบว่า เกี่ยวกันด้วยป่าวครับ

และอีกส่วนนึง

คือ อยากเขียนให้ เมื่อ equity มากกว่า balance เมื่อเริ่มต้น ตาม % ที่ตั้งไว้

แล้วให้ปิด order ทั้งหมด แล้วเริ่มเล่นใหม่ ด้วย balance ใหม่ ไม่ทราบว่า จะต้องเติมอย่างไร ครับ

โดย code ที่เขียน เป็นดังนี้ครับ

....................................................
....................................................
....................................................
....................................................
....................................................

extern double BalanceStart = 100000;

....................................................
....................................................
....................................................
....................................................
....................................................
....................................................
....................................................
....................................................

     movetrailingstop();
      if((AccountEquity()-BalanceStart) > (BalanceStart*1.2))
           for(int i = OrdersTotal()-1; i >= 0;i--)
               {if(OrderSymbol() == Symbol())
                  {if(OrderSelect(i,SELECT_BY_POS)==true)
                     {if(OrderType()==OP_BUY)
                        {keep = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),0,0);}
                     {if(OrderType()==OP_SELL)
                        {keep = OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),0,0);} 
                     {if(OrderType()==OP_SELLSTOP)
                        {keep = OrderDelete(OrderTicket());} 
                     {if(OrderType()==OP_BUYSTOP)
                        {keep = OrderDelete(OrderTicket());}}}}}}
               } 

ไม่รู้ว่าจะต้องคืนค่า BalanceStart  ยังไง สามารถใช้ return (BalanceStart) ไปเลยได้หรือไม่ครับ??

ขอบคุณล่วงหน้าครับ
บันทึกการเข้า

admin

  • Administrator
  • Full Member
  • *****
  • ออฟไลน์ ออฟไลน์
  • กระทู้: 202
  • i ma forex trader
    • ดูรายละเอียด
Re: รบกวนช่วยดู code ให้หน่อยครับ
« ตอบกลับ #1 เมื่อ: ตุลาคม 10, 2017, 01:34:11 PM »





โค๊ด: [Select]
if(Bid - OrderStopLoss() > 20*Point)
ลองเพิ่มว่า

โค๊ด: [Select]
double newsl=Bid-20*Point;
if(Bid - OrderStopLoss() > 20*Point && newsl!=OrderStopLoss())

ทำทั้งสองฝั่ง buy และ sell

เข้าใจว่าเจอ error modify error =1 คือ sl ที่จะโมดิฟายเข้าไปไม่ได้เปลี่ยนไปจากค่าเดิม


แก้เพิ่มอีกนิดว่าให้ new stop loss มากกว่า OrderStoploss() ปัจจุบัน สำหรับออเดอร์ buy
แก้เพิ่มอีกนิดว่าให้ new stop loss น้อยกว่า OrderStoploss() ปัจจุบัน สำหรับออเดอร์ sell
จะได้ค่า sloploss ที่วิ่งไปในทางเดียว และไม่ถอยกลับเมื่อ bid/ask ถอยลง


โค๊ด: [Select]
double newsl=Bid-20*Point;
if(Bid - OrderStopLoss() > 20*Point && newsl>OrderStopLoss())
บันทึกการเข้า

admin

  • Administrator
  • Full Member
  • *****
  • ออฟไลน์ ออฟไลน์
  • กระทู้: 202
  • i ma forex trader
    • ดูรายละเอียด
Re: รบกวนช่วยดู code ให้หน่อยครับ
« ตอบกลับ #2 เมื่อ: ตุลาคม 10, 2017, 01:48:42 PM »

อ้างถึง
คือ อยากเขียนให้ เมื่อ equity มากกว่า balance เมื่อเริ่มต้น ตาม % ที่ตั้งไว้

แล้วให้ปิด order ทั้งหมด แล้วเริ่มเล่นใหม่ ด้วย balance ใหม่ ไม่ทราบว่า จะต้องเติมอย่างไร ครับ

โดย code ที่เขียน เป็นดังนี้ครับ

ผมแนะนำให้ทำ state machine ครับ

โค๊ด: [Select]
input InpGain=0.02;   //2%
int statecloseall=0;
double PercentGain=0;

PercentGain=AccountEquity()/AccountBalance()-1;
switch statecloseall:
{
case 0:
if(PercentGain>InpGain)
//statecloseall=100;//เปลี่ยนสถานะเพื่อทำการปิดเดอร์อีกครั้ง
break;
case 100:
//  .. do for loop closing order here...

 if(order_count()==0) statecloseall=0;//เปลี่ยนสถานะกลับไปเป็น 0 เริ่มต้นอีกครั้ง
break;

}

รูปแบบนี้จำทำการ lock ให้ for loop close order ให้หมด จริงๆ จนกว่าจะไม่มีออเดอร์เหลือ แล้วค่อยหยุด

ถ้าเอาไปใช้ลอยๆ ถ้า server ทำงานช้าก็จะปิดแค่ออเดอร์สองออเดอร์ ทำให้ equity เปลี่ยน ไม่ได้เกินกว่าค่าที่เรากำหนดไว้ พอปิดไปนิดหน่อยก็เลิกทำ เพราะว่า equity gain ไม่ถึง

ถ้าใช้ state machine ก็กำหนด ไปเลยว่า
state=0. เช็คว่ากำไรเกิน%หรือไม่ ถ้าใช่ให้ปิดออเดอร์ state=100
state=100. ไล่ปิดออเดอร์ไปเรื่อยๆ มี delay บ้างอะไรบ้างก็ยังทำงานไปเรื่อยๆ จนไม่เหลือออเดอร์ค้าง ก็เปลี่ยน state ไป =0


จากนั้นก็เริ่มใหม่

ลองทำดูครับ เอาไป adapt ได้หลายอย่าง
รับรองว่าไม่เหลืออะไรค้าง ทำงานได้สมบูรณื
บันทึกการเข้า

urza

  • Newbie
  • *
  • ออฟไลน์ ออฟไลน์
  • กระทู้: 5
    • ดูรายละเอียด
Re: รบกวนช่วยดู code ให้หน่อยครับ
« ตอบกลับ #3 เมื่อ: ตุลาคม 12, 2017, 12:46:58 PM »

จะไปลองทำดูครับ

ขอบคุณครับผม
บันทึกการเข้า
 

+ ตอบด่วน

หน้านี้ถูกสร้างขึ้นภายในเวลา 0.15 วินาที กับ 24 คำสั่ง