ผู้เขียน หัวข้อ: ช่วยแก้ ea ให้ทีครับ  (อ่าน 168 ครั้ง)

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

ออฟไลน์ lnwกำมะลอ

  • นักลงทุนขั้นเทพ
  • ****
  • กระทู้: 468
  • พลังน้ำใจ: 18
ช่วยแก้ ea ให้ทีครับ
« เมื่อ: 17 พฤษภาคม 2019, 21:45:44 PM »
คือ ea ของผมมันเล่นทั้ง buy และ sell แต่ทีนี้อยากลองเทส buy only แต่ด้วยเงื่อนไข ถ้า tp หรือ sl buy มันจะตั้ง pending sell ทันที แล้วถ้า sell sl หรือ tp มันจะตั้ง pending buy ทันที ทำให้เทส buy only หรือ sell only มันจะไม่เข้าเงื่อนไข ผมเลยคิดว่าอาจต้องแก้เงื่อนไขโดยให้มี เส้น harizontal line มาแทนการเข้าออเดอร์ฝั่งไดฝั่งนึง ถึงจะทำให้เงื่อนไขการเข้าออเดอร์ไม่เปลี่ยน ใครใจดีช่วยแก้ให้หน่อยขอบคุณครับ  :wanwan011:

นี่โค้ดครับ

input int Gap = 100;
input int TrailingStart = 100;
input int TrailingStop = 100;
input int SL  = 100;
input int Magic = 0;
int OnInit()
  {
//---
  OrderSend(Symbol(),OP_BUYSTOP,1000,Ask+Gap*Point,3,Ask+(Gap-SL)*Point,0,"My order",Magic,0,clrGreen); =เปิดมาตั้ง pending buy ก่อนเลย

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   ModifyPending( );
     
     TrailingAlls(Symbol(),TrailingStart,TrailingStop,1,OP_BUY);
     TrailingAlls(Symbol(),TrailingStart,TrailingStop,1,OP_SELL);
   if(CountOrder(OP_BUY)== 1 && CountOrder(OP_SELLSTOP)==0 &&CountOrder(OP_SELL)==0 )
   {
   OrderSend(Symbol(),OP_SELLSTOP,1000,Bid-Gap*Point,3,Bid+(-Gap+SL)*Point,0,"My order",Magic,0,clrRed); = ส่วนที่เป็นเงื่อนไข sell ถ้าปิดไปเงื่อนไขจะผิดหมดเลย อยากให้แก้ด้วยการใส่เส้น harizontal line เพื่อรักษาเงื่อนไข
   }
   if(CountOrder(OP_BUY)== 0 && CountOrder(OP_BUYSTOP)==0 &&CountOrder(OP_SELL)==1 ) = ส่วนที่เป็นเงื่อนไข sell ถ้าปิดไปเงื่อนไขจะผิดหมดเลย อยากให้แก้ด้วยการใส่เส้น harizontal line เพื่อรักษาเงื่อนไข
   {
   OrderSend(Symbol(),OP_BUYSTOP,1000,Ask+Gap*Point,3,Ask+(Gap-SL)*Point,0,"My order",Magic,0,clrGreen);
   }   
  }
//+------------------------------------------------------------------+

void ModifyPending( )
{
int ordertotal;
int count=0;
 ordertotal=OrdersTotal()-1;
 for(;ordertotal>=0;ordertotal--)
 {
  if(OrderSelect(ordertotal,MODE_TRADES))
  {
   if(Symbol()==OrderSymbol()   && OrderMagicNumber() == Magic )
   {
     if(OrderType()==OP_BUYSTOP && OrderOpenPrice() > Ask+Gap*Point )
     OrderModify(OrderTicket(),Ask+Gap*Point,Ask+(Gap-SL)*Point,0,0);
   
     if(OrderType()==OP_SELLSTOP && OrderOpenPrice() < Bid-Gap*Point ) = ส่วนที่เป็นเงื่อนไข sell ถ้าปิดไปเงื่อนไขจะผิดหมดเลย อยากให้แก้ด้วยการใส่เส้น harizontal line เพื่อรักษาเงื่อนไข
     OrderModify(OrderTicket(),Bid-Gap*Point,Bid+(-Gap+SL)*Point,0,0);
   }
   
  }
 }

}

int CountOrder(int  Type )
{
int ordertotal;
int count=0;
 ordertotal=OrdersTotal()-1;
 for(;ordertotal>=0;ordertotal--)
 {
    if(OrderSelect(ordertotal,MODE_TRADES))
  {
   if(Symbol()==OrderSymbol()   && OrderMagicNumber() == Magic && OrderType()== Type)
   {
      count++;
   

   }
   
  }
 }
 return(count);
}

void TrailingAlls(string Sym,int TrailStart, int TrailStop,int TrailStep,int Type) {
   double li16;
   double lordstoploss20;
   double lprice28;
   if (TrailStop != 0) {
      for (int lpos36 = OrdersTotal() - 1; lpos36 >= 0; lpos36--) {
         if (OrderSelect(lpos36, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Sym || OrderMagicNumber() != Magic) continue;
            if (OrderSymbol() == Sym || OrderMagicNumber() == Magic ) {
               if (OrderType() == OP_BUY && OrderType()==Type) {
                  li16 = NormalizeDouble((MarketInfo(Sym,MODE_BID) - OrderOpenPrice()) / MarketInfo(Sym,MODE_POINT), 0);
                  if (li16 < TrailStart) continue;
                  lordstoploss20 = OrderStopLoss();
                  lprice28 = MarketInfo(Sym,MODE_BID)  - TrailStop * MarketInfo(Sym,MODE_POINT);
                  if ((lordstoploss20 == 0.0 || (lordstoploss20 != 0.0 && lprice28 > lordstoploss20 && MathAbs (lprice28-lordstoploss20)/MarketInfo(Sym,MODE_POINT) > TrailStep))
                   && MarketInfo(Symbol(),MODE_STOPLEVEL)<=MathAbs((lprice28-MarketInfo(Sym,MODE_BID) )/MarketInfo(Sym,MODE_POINT)) )
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), lprice28, OrderTakeProfit(), 0, Aqua))
                  Print("OrderModify Error ",GetLastError() ,"Bid ",MarketInfo(Sym,MODE_BID)  ," Price ", lprice28);
               }
               if (OrderType() == OP_SELL && OrderType()==Type) {
                  li16 = NormalizeDouble((OrderOpenPrice() - MarketInfo(Sym,MODE_ASK) ) / MarketInfo(Sym,MODE_POINT), 0);
                  if (li16 < TrailStart) continue;
                  lordstoploss20 = OrderStopLoss();
                  lprice28 = MarketInfo(Sym,MODE_ASK) + TrailStop * MarketInfo(Sym,MODE_POINT);
                  if ((lordstoploss20 == 0.0 || (lordstoploss20 != 0.0 && lprice28 < lordstoploss20 && MathAbs (lprice28-lordstoploss20)/MarketInfo(Sym,MODE_POINT) > TrailStep))
                  && MarketInfo(Symbol(),MODE_STOPLEVEL)<=MathAbs((lprice28-MarketInfo(Sym,MODE_ASK))/MarketInfo(Sym,MODE_POINT)) )
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), lprice28, OrderTakeProfit(), 0, Red))
                  Print("OrderModify Error ",GetLastError() ,"Ask ",MarketInfo(Sym,MODE_ASK) ," Price ", lprice28);= ส่วนที่เป็นเงื่อนไข sell ถ้าปิดไปเงื่อนไขจะผิดหมดเลย อยากให้แก้ด้วยการใส่เส้น harizontal line เพื่อรักษาเงื่อนไข
               }
            }
       
         }
      }
   }
}

double GetLastOrderOpenPrice(int Type )
{
int ordertotal;
int count=0;
 ordertotal=OrdersTotal()-1;
 for(;ordertotal>=0;ordertotal--)
 {
  if(OrderSelect(ordertotal,SELECT_BY_POS))
  {
   if(OrderMagicNumber( )==Magic && Symbol()==OrderSymbol() && OrderType()==Type )
   {
      return(OrderOpenPrice());
   

   }
   
  }
 }
 return(0);
}

ออฟไลน์ demoinvest

  • นักลงทุนขั้นเทพ
  • ****
  • กระทู้: 12252
  • พลังน้ำใจ: 1080
Re: ช่วยแก้ ea ให้ทีครับ
« ตอบกลับ #1 เมื่อ: 18 พฤษภาคม 2019, 01:29:50 AM »
ต้องรอโปรแกรมเมอร์ตัวจริงมาช่วยดูให้ละครับ

ลองใช้ล็อกให้  BUY อย่างเดียวในอีเอไปก่อนละกันนะครับ

ยืมรูปจากเว็บอื่นๆมา
https://www.ea-coder.com/wp-content/uploads/2015/04/mt4-expert-advisor-properties-long-short-positions-allowed.png


ออฟไลน์ lnwกำมะลอ

  • นักลงทุนขั้นเทพ
  • ****
  • กระทู้: 468
  • พลังน้ำใจ: 18
Re: ช่วยแก้ ea ให้ทีครับ
« ตอบกลับ #2 เมื่อ: 18 พฤษภาคม 2019, 02:40:55 AM »
ต้องรอโปรแกรมเมอร์ตัวจริงมาช่วยดูให้ละครับ

ลองใช้ล็อกให้  BUY อย่างเดียวในอีเอไปก่อนละกันนะครับ

ยืมรูปจากเว็บอื่นๆมา
https://www.ea-coder.com/wp-content/uploads/2015/04/mt4-expert-advisor-properties-long-short-positions-allowed.png

ทำแล้วครับ มันจะได้แค่ออเดอร์เดียวที่ตั้งครั้งแรกเพราะ เงื่อนไขคือถ้าไม่ close sell มันจะไม่ตั้ง pending buy ให้ครับ หรือเคยแก้เงื่อนไข ปิด buy เปิด buy กลายเป็นไม่ตรงเงื่อนไขไปเลย สรุปคือต้องมีเงื่อนไขบางอย่างไปแทน ออเดอร์ sell เพื่อรักษาเงื่อนไขการเปิดออเดอร์ ถึงจะได้ buy ตรงจุดที่ต้องการครับ พยายามหาโค้ด harizontal line มาใส่แต่ว่างง เลยอยากได้ใครก็ได้ ช่วยแก้ให้หน่อยเพราะผมเขียนไม่เป็น จะไปจ้างก็ไม่คุ้มเพราะอยากได้ไป back test เฉยๆ