ทริกเกอร์ป้องกันข้อผิดพลาดการซื้อขายโดยหุ่นยนต์(แจก อีเอ)

Image  

บทนำ 

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

ลักษณะของปัญหา 

 ปัญหาของทริกที่ผิดพลาดนี้เป็นที่โดดเด่นโดยเฉพาะอย่างยิ่งในช่วงที่สวิงขึ้นสวิงลงอย่างรวดเร็วในตลาดเมื่อความกว้างของแท่งเทียนในปัจจุบันอยู่ในระดับสูงและไม่มีการป้องกันที่ดี  
 ขั้นตอนวิธีการของหุ่นยนต์ซื้อขายนี้ มันทำให้เกิดการเปิดหลายออร์เดอร์และปิดของตำแหน่งที่ใกล้เคียงกับออร์เดอร์ เหมือนพวกสแคปปิ้งผลกระทบทางการเงินต่าง ๆ และขึ้นอยู่กับขั้นตอนวิธีการเฉพาะเจาะจงของตลาด พารามิเตอร์ที่กำหนดโดยนักพัฒนาหุ่นยนต์ซื้อขาย  
 ในบทความนี้ผมจะไม่พิจารณาเรื่องของการวิเคราะห์เครื่องมือทางการเงิน (ของตัวเทคนิคและพื้นฐาน) ที่สามารถส่งผลกระทบต่อความมั่นใจของการใช้งาน ที่ปรึกษาผู้เชี่ยวชาญมักจะหลีกเลี่ยงสเปรดสูงๆ 
  (ผมผู้เขียน ทฤษฎีสมดุลแรงกระตุ้น) ที่นี่เราจะมุ่งเน้นไปที่มาตรการของซอฟต์แวร์ที่ไม่ได้ขึ้นอยู่กับวิธีการโดยตรงของการวิเคราะห์ตลาดการเงินดังนั้นขอให้ดำเนินการในการแก้ปัญหา เป็นตัวอย่างที่ผมจะใช้ "MACD ตัวอย่าง" ที่ปรึกษาผู้เชี่ยวชาญจากมาตรฐานที่กำหนดอยู่ในฐานลูกค้าМetaТrader 4  

นี่คือการตีความภาพรวมของปัญหา ตัวอย่างที่ราคา EURUSD ถูกแทงในวันที่ 2 ของเดือนตุลาคมปีนี้ (М15ระยะเวลา "MACD ตัวอย่าง" EA กับการตั้งค่าเริ่มต้น): 
   
หน้าจอนี้แสดงให้เห็นชัดเจน 8 ทริกเกอร์ที่ตามมา (รายการ Buy) บนเชิงเทียนเดียว มีเพียง 1 ในนั้นคือรายการที่ถูกต้อง (ในแง่ของตรรกะปกติของตลาด) เหลือ 7 รายการ


   เหตุผลที่อยู่เบื้องหลังการผิดพลาด ในกรณีที่เฉพาะเจาะจงนี้:       นี้เป็นค่าเล็ก ๆ ของ TakeProfit ในการตั้งค่าเริ่มต้น (อัลกอริทึมออก) ดังนั้นแต่ละตำแหน่งจะปิดอย่างรวดเร็ว 
      
และขั้นตอนวิธีการเข้าออร์เดอร์ของ "MACD ตัวอย่าง" EA ที่จะถูกเรียกหลังจากปิดตำแหน่งก่อนหน้านี้โดยการให้รายการคู่แม้จะมีจำนวนของรายการบนเชิงเทียนนี้  เราได้ตกลงกันแล้วว่าเรื่องของความผันผวนของตลาด การกรองจะไม่ได้รับการพิจารณาเกี่ยวกับวัตถุประสงค์ (เนื่องจากแต่ละเทรดเดอร์มีจุดเข้าและจุดออกของตัวเองอยู่แล้ว) ดังนั้นในการแก้ปัญหา  
เราจะพิจารณาปัจจัยทั่วไปให้มากขึ้น: 
  •      เวลา (ความยาวของแท่งเทียน) 
  •      จำนวนของทริกเกอร์ (เคาน์เตอร์) 
  •      ความกว้างของการเคลื่อนไหว (ช่วงของเทียน) 
วิธีการแก้ปัญหาและขั้นตอนวิธีการเข้าออร์เดอร์ 
 ที่ง่ายที่สุดและในเวลาเดียวกันวิธีที่เชื่อถือได้มากที่สุด ในการแก้ไขปัญหาจุดเริ่มต้นที่จะผ่านเวลาที่ปัจจัยเหตุผลดังต่อไปนี้: 
  •     เคาน์เตอร์ของจำนวนเงินของทริกเกอร์ที่แสดงถึงการสร้างช่องโหวในโปรแกรมซึ่งไม่เพียง แต่มีความซับซ้อนของอัลกอริทึม แต่ความเร็วของการซื้อขายยังช้าลง 
  •     ความกว้างและระดับการควบคุมที่เกี่ยวข้องของราคา สามารถเกิดซ้ำได้เพราะราคากลับมาที่เดิม แท่งเทียนทำเกณฑ์ของระดับราคาที่ไม่สม่ำเสมอ 
  •     เวลากลับตัว ไม่ได้ย้ายในทิศทางเดียวเท่านั้น (มันเพิ่มขึ้น) จึงเป็นเกณฑ์ที่ถูกต้องมากที่สุด 
 วิธีนี้เป็นปัจจัยที่สำคัญคือช่วงเวลาของการเรียกอัลกอริทึมมายังรายการที่จะเฉพาะเจาะจงมากขึ้นช่วงเวลาของการเรียกคำสั่งสำหรับการเปิดตำแหน่ง (OrderSend) ในขณะที่ทั้งสองช่วงเวลาที่อาจจะไม่ตรงนี้ถ้าบางครั้งล่าช้าพิเศษ ดังนั้นเราสามารถจำได้ว่าขณะนี้ (เวลาปัจจุบัน) เมื่อเปิดตำแหน่ง แต่วิธีการใช้พารามิเตอร์นี้ในขั้นตอนวิธีการรายการที่จะห้ามรายการที่สองและที่เกิดขึ้นบนแท่งเทียนที่ระบุไว้หรือไม่? เราไม่ทราบว่าขณะนี้หรือล่วงหน้า (ค่าสัมบูรณ์ของมัน)  
 ดังนั้นเราจึงไม่สามารถใส่ไว้ในขั้นตอนวิธีการล่วงหน้าในออร์เดอร์ อัลกอริทึมมันจะควรพิจารณา (ภาพรวม) สภาพทั่วไป บางอย่างที่จะแก้ออร์เดอร์แรกบนแท่งเทียน แต่ห้ามออร์เดอร์ที่เกิดขึ้นทั้งหมดบนแท่งเทียนโดยไม่ต้องคำนวณทริกเกอร์ (ตัวเลือกที่มีเคาน์เตอร์เราได้ปรับตัวลดลงก่อนหน้านี้)การแก้ปัญหาคือค่อนข้างง่าย  

ครั้งแรกผมจะเขียนโค้ดที่มีความคิดเห็นบางส่วนและจากนั้นจะชี้แจงในรายละเอียดเพิ่มเติม นี่คือรหัสเสริม (เน้นสีเหลือง) ที่ต้องการที่จะอยู่ในขั้นตอนวิธีการของการซื้อขายที่ปรึกษาผู้เชี่ยวชาญ (ดู MACD_Sample_plus1.mq4) นี้:  
//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"

input double TakeProfit    =50;
input double Lots          =0.1;
input double TrailingStop  =30;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int    MATrendPeriod =26;
//--- enter new variable (value in seconds for 1 bar of this TF, for М15 equals 60 с х 15 = 900 с)
datetime Time_open=900;
//--- enter new variable (time of opening the bar with 1st entry)
datetime Time_bar = 0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   double MacdCurrent,MacdPrevious;
   double SignalCurrent,SignalPrevious;
   double MaCurrent,MaPrevious;
   int    cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
   if(Bars<100)
     {
      Print("bars less than 100");
      return;
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return;
     }
//--- to simplify the coding and speed up access data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

   total=OrdersTotal();
   if(total<1)
     {
      //--- no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ",AccountFreeMargin());
         return;
        }
      //--- check for long position (BUY) possibility
      
      //--- enter new string (removes ban on repeated entry if a new bar is opened)
      if( (TimeCurrent() - Time_bar) > 900 ) Time_open = 900; 
      
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPreviousMathAbs
(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious &&          (TimeCurrent()-Time[0])//enter new string into the entry algorithm (performed only once, the condition on this candlestick cannot be completed afterwards)         {          ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);          if(ticket>0)            {             if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))              {               Print("BUY order opened : ",OrderOpenPrice());               Time_open = TimeCurrent()-Time[0]; //enter new string (store interval from the bar opening time with the entry until the exit moment)               Time_bar = Time[0]; //enter new string (remember opening time of the bar that had 1st entry)              }            }          else             Print("Error opening BUY order : ",GetLastError());          return;         }
  

อ่านเพิ่มเติม: 


 แต่เวลาที่แน่นอน (ช่วงเวลารายการ) เราใช้เวลา - เวลาว่างจากช่วงเวลาของการเปิดแท่งใหม่ของปัจจุบันจนถึงขณะเข้าที่ ค่านี้แล้วเมื่อเทียบกับชุดก่อนหน้านี้ค่าเวลาที่ค่อนข้างใหญ่ (ความยาวของทั้งแท่งเทียน) ที่ช่วยให้ออร์เดอร์แรกที่จะถูกใช้ในช่วงเวลาของการเปิดตำแหน่งที่เราเปลี่ยนค่า (ลดลง) ของตัวแปร Time_open โดยการเขียนค่ามีช่องว่างของเวลาจากจุดเริ่มต้นของแท่งเทียนจนถึงจุดที่แท้จริงของการปิด และเนื่องจากในช่วงเวลาที่เกิดขึ้นเวลาใด ๆ ค่าของ (TimeCurrent () - เวลา [0]) จะเกิน

 ค่าที่เราเขียนที่จุดเริ่มต้นแล้ว (TimeCurrent () - เวลา [0]) &lt;สภาพ Time_open จะยังคงเป็นไปไม่ได้ ซึ่งประสบความสำเร็จโดยการปิดกั้นออร์เดอร์ที่สองและที่เกิดขึ้นบนแท่งเทียนนี้วิธีนี้ได้โดยไม่ต้องเคาน์เตอร์ของจำนวนเงินของออร์เดอร์และการวิเคราะห์การเคลื่อนไหวของราคากว้างใด ๆ ที่เราได้แก้

ปัญหาของข้อผิดพลาดด้านล่างนี้เป็นผลมาจากการปรับปรุงง่ายๆเช่นขั้นตอนวิธีการเริ่มต้นของ EA รายการ ( "MACD Sample_plus1") นี้: 
Image 
 เราจะเห็นว่ามีเพียงหนึ่งออร์เดอร์ในแท่งเทียนไม่มีข้อผิดพลาดและการกระจายถูกตัดออกอย่างสมบูรณ์ การตั้งค่าตามค่าเริ่มต้นจะถูกบันทึกไว้อย่างสมบูรณ์ดังนั้นจึงเป็นที่ชัดเจนว่าปัญหาได้รับการแก้ไขโดยความช่วยเหลือของเปลี่ยนการตั้งค่าของ EA 
ตอนนี้ปัญหาของการกระจายในออร์เดอร์ที่จะแก้ไขได้ปรับปรุง ขั้นตอนวิธีการเข้ามาเพื่อที่จะยกเว้นการกระจายออร์เดอร์ว่าปรากฏขึ้นพร้อมกับการปิดอย่างรวดเร็วของตำแหน่งว่าในกรณีนี้โดยเฉพาะการเพิ่มขึ้นของกำไร  


วิธีการแก้ปัญหาในขั้นตอนวิธีการออก 


 ตั้งแต่เริ่มต้นปัญหาเกี่ยวข้องกับการถอดกระจายเป็นไปได้ของหุ่นยนต์ซื้อขายแทนการเพิ่มขึ้นของกำไรแล้วฉันจะไม่พิจารณาเรื่องของการวิเคราะห์การเปลี่ยนแปลงของเครื่องมือทางการเงินในส่วนที่เกี่ยวกับเรื่องนี้และจะ จำกัด ตัวเองด้วยการแก้ไขพารามิเตอร์ที่เลือกโดยไม่ต้องพิจารณาของการเปลี่ยนแปลงดังกล่าวก่อนหน้านี้เราได้ใช้พารามิเตอร์และเวลาปัจจัยที่มีความปลอดภัยและเราจะใช้มันอีกครั้งอย่างเคร่งครัดการควบคุมช่วงเวลาของการปิดตำแหน่งตามเวลาที่จะเป็นเฉพาะที่จุดของการเปิดเชิงเทียนดังต่อไปนี้ (หลังจากที่รายการ) ขณะนี้อยู่ในขั้นตอนวิธีการออกจากที่เราจะแสดงเป็น: 
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         //--- long position is opened
         if(OrderType()==OP_BUY)
           {
            //--- should it be closed?
            if(/* MacdCurrent>0 && MacdCurrentSignalPrevious && // remove code of triggering exit on MACD, not to disturb a new condition of closing (see further)
               MacdCurrent>(MACDCloseLevel*Point) &&
             */
               Bid > OrderOpenPrice() &&  // enter new string - optional (price in a positive area in regards to the entry level)
               TimeCurrent() == Time[0] ) // enter new string (simple improvement of exit algorithm: exit is strictly at the moment of opening current candlestick)
              {
               //--- close order and exit
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
                  Print("OrderClose error ",GetLastError());

               return;
              }
  
การปรับเปลี่ยนเล็กน้อยเช่นนี้จะช่วยให้ขั้นตอนวิธีการเข้าทำงาน (ตำแหน่งเปิดเงื่อนไขในการปิดไม่ได้) ตำแหน่งกินเวลาจน TimeCurrent () == เวลา [0] ช่วงเวลาและปิดพร้อมกันที่จุดเริ่มต้นของเทียนใหม่หลัง

จากที่แรงกระตุ้นที่ ในที่สุดนอกเหนือจากการป้องกันจากการกระจายที่เรายังทำกำไรที่ดี 
  (ดูภาพ "MACD Sample_plus2"): 
Image 
  เพื่อการนี้เราต้องเอาทริกเกอร์โดย MACD จากขั้นตอนวิธีการออกจากเงื่อนไขที่จำเป็นอย่างอื่นออก  ดังนั้นจึงปรากฏว่าปัญหาที่กระจายจะสามารถแก้ไขได้แยกต่างหากในการเข้าและออกอัลกอริทึม ตอนนี้ขอหารือถึงวิธีการแก้ปัญหาโดยการเชื่อมต่อเหล่านี้ขั้นตอนวิธีการของการเปิดและปิดตำแหน่ง 

การเชื่อมต่อเข้าและออกจากอัลกอริทึม 
 การเชื่อมต่อหมายถึงการสร้างแบบจำลองเบื้องต้นบางอย่างของกระบวนการทั้งหมด: เปิดตำแหน่ง - การจัดการ - ตำแหน่งปิด นี้ยังสะท้อนให้เห็นในการเลือก การเปลี่ยนแปลงในตัวชี้วัดและฟังก์ชั่นที่ใช้ในการเข้าและออก จากขั้นตอนวิธีตัวอย่างเช่นถ้าคุณใช้ TimeCurrent () = เวลา [0] เงื่อนไขขั้นตอนวิธีการออกและออกจากจุดที่ถูกกำหนดอย่างเคร่งครัดโดยจุดเริ่มต้นของเทียนในปัจจุบันแล้วอัลกอริทึมรายการควรมีการทดสอบในบาร์ที่สมบูรณ์ก่อน

ดังนั้นเพื่อที่จะปิดตำแหน่งภายใต้ TimeCurrent () = เวลา [0] สภาพโดยไม่มีเงื่อนไขใด ๆ เพิ่มเติมก็เป็นสิ่งจำเป็นที่ขั้นตอนวิธีการทั้งหมดของการเปรียบเทียบ (ที่ประตูทางออก) จะดำเนินการ (สำเร็จรูป) บนแถบก่อนหน้านี้ ควรจะมีการชดเชยที่มีค่าเท่ากับ 1 ในการตั้งค่าของตัวชี้วัดที่มีส่วนร่วมในการเปรียบเทียบค่า ในกรณีนี้การเปรียบเทียบค่าที่จะถูกต้องและจุดเริ่มต้นของเทียนในปัจจุบันจะเป็นตอนจบตรรกะที่จะออกจากอัลกอริทึมวิธีนี้การเชื่อมต่อขั้นตอนวิธีการและทางออกของรายการยังเชื่อมโยงกับปัจจัยเวลา 
  
ข้อสรุป 
  
ปัญหาที่เกิดจากวิกฤติที่ผิดพลาดของที่ผู้พัฒนาอีเอได้รับการแก้ไขอย่างมีประสิทธิภาพโดยใช้ปัจจัยเวลาในขั้นตอนวิธีการเข้า ความมั่นใจที่จะเพิ่มขึ้นของการดำเนินงานของ EA สามารถทำได้โดยการแก้ไขจุดออก (ตัวอย่างตามเวลา) และการเชื่อมต่อเข้าและออกจากขั้นตอนวิธีการผ่านการสร้างแบบจำลองเบื้องต้นของตรรกะหลักของวิกฤติและชดเชย (แถบที่บ่งชี้หรือฟังก์ชั่นจะได้รับการคำนวณ) . 
 ด้านล่างนี้คือรหัสของอีเอ: เริ่มต้นหนึ่ง (MACD_Sample.mq4) กับรายการที่ดีขึ้น (MACD_Sample_plus1.mq4) และมีทางออกที่ดีขึ้น (MACD_Sample_plus2.mq4) ซื้อเฉพาะช่องทางที่ดีขึ้นในขณะที่ช่องทางขายยังคงไม่มีการเปลี่ยนแปลงจงใจเพื่อเปรียบเทียบขั้นตอนวิธีการเริ่มต้นและการปรับปรุง  และแน่นอน EAs ทั้งหมดมีวัตถุประสงค์เพื่อการสาธิตและการไม่ได้มีไว้สำหรับการซื้อขายจริงในตลาดการเงิน(ความหมายคือ ทดลองก่อนค่อยใช้จริง) 
  
Translated from Russian by MetaQuotes Software Corp.  Original article: https://www.mql5.com/ru/articles/2110 
Attached files |  
macd_sample.mq4 (6.1 KB)  
macd_sample_plus2.mq4 (6.35 KB)  
macd_sample_plus1.mq4 (6.95 KB)  

แปลและเรียบเรียงโดย: คนเล่น Forex 

ความคิดเห็น

เรื่องราวที่น่าสนใจ