บทนำ
บทความนี้จะอธิบายถึงวิธีการที่แตกต่างออกไป เพื่อเพิ่มความมั่นใจในการใช้งานของหุ่นยนต์ซื้อขาย โดยการเอาทริกนี้ไปปรับใช้และมีขั้นตอนวิธีแก้ไขปัญหาเมื่อคุณเจอกับตัว
ลักษณะของปัญหา
ปัญหาของทริกที่ผิดพลาดนี้เป็นที่โดดเด่นโดยเฉพาะอย่างยิ่งในช่วงที่สวิงขึ้นสวิงลงอย่างรวดเร็วในตลาดเมื่อความกว้างของแท่งเทียนในปัจจุบันอยู่ในระดับสูงและไม่มีการป้องกันที่ดี
ขั้นตอนวิธีการของหุ่นยนต์ซื้อขายนี้ มันทำให้เกิดการเปิดหลายออร์เดอร์และปิดของตำแหน่งที่ใกล้เคียงกับออร์เดอร์ เหมือนพวกสแคปปิ้งผลกระทบทางการเงินต่าง ๆ และขึ้นอยู่กับขั้นตอนวิธีการเฉพาะเจาะจงของตลาด พารามิเตอร์ที่กำหนดโดยนักพัฒนาหุ่นยนต์ซื้อขาย
ในบทความนี้ผมจะไม่พิจารณาเรื่องของการวิเคราะห์เครื่องมือทางการเงิน (ของตัวเทคนิคและพื้นฐาน) ที่สามารถส่งผลกระทบต่อความมั่นใจของการใช้งาน ที่ปรึกษาผู้เชี่ยวชาญมักจะหลีกเลี่ยงสเปรดสูงๆ
(ผมผู้เขียน ทฤษฎีสมดุลแรงกระตุ้น) ที่นี่เราจะมุ่งเน้นไปที่มาตรการของซอฟต์แวร์ที่ไม่ได้ขึ้นอยู่กับวิธีการโดยตรงของการวิเคราะห์ตลาดการเงินดังนั้นขอให้ดำเนินการในการแก้ปัญหา เป็นตัวอย่างที่ผมจะใช้ "MACD ตัวอย่าง" ที่ปรึกษาผู้เชี่ยวชาญจากมาตรฐานที่กำหนดอยู่ในฐานลูกค้าМetaТrader 4
นี่คือการตีความภาพรวมของปัญหา ตัวอย่างที่ราคา EURUSD ถูกแทงในวันที่ 2 ของเดือนตุลาคมปีนี้ (М15ระยะเวลา "MACD ตัวอย่าง" EA กับการตั้งค่าเริ่มต้น):
หน้าจอนี้แสดงให้เห็นชัดเจน 8 ทริกเกอร์ที่ตามมา (รายการ Buy) บนเชิงเทียนเดียว มีเพียง 1 ในนั้นคือรายการที่ถูกต้อง (ในแง่ของตรรกะปกติของตลาด) เหลือ 7 รายการ
เหตุผลที่อยู่เบื้องหลังการผิดพลาด ในกรณีที่เฉพาะเจาะจงนี้: นี้เป็นค่าเล็ก ๆ ของ TakeProfit ในการตั้งค่าเริ่มต้น (อัลกอริทึมออก) ดังนั้นแต่ละตำแหน่งจะปิดอย่างรวดเร็ว
เหตุผลที่อยู่เบื้องหลังการผิดพลาด ในกรณีที่เฉพาะเจาะจงนี้: นี้เป็นค่าเล็ก ๆ ของ TakeProfit ในการตั้งค่าเริ่มต้น (อัลกอริทึมออก) ดังนั้นแต่ละตำแหน่งจะปิดอย่างรวดเร็ว
และขั้นตอนวิธีการเข้าออร์เดอร์ของ "MACD ตัวอย่าง" EA ที่จะถูกเรียกหลังจากปิดตำแหน่งก่อนหน้านี้โดยการให้รายการคู่แม้จะมีจำนวนของรายการบนเชิงเทียนนี้ เราได้ตกลงกันแล้วว่าเรื่องของความผันผวนของตลาด การกรองจะไม่ได้รับการพิจารณาเกี่ยวกับวัตถุประสงค์ (เนื่องจากแต่ละเทรดเดอร์มีจุดเข้าและจุดออกของตัวเองอยู่แล้ว) ดังนั้นในการแก้ปัญหา
เราจะพิจารณาปัจจัยทั่วไปให้มากขึ้น:
- เวลา (ความยาวของแท่งเทียน)
- จำนวนของทริกเกอร์ (เคาน์เตอร์)
- ความกว้างของการเคลื่อนไหว (ช่วงของเทียน)
วิธีการแก้ปัญหาและขั้นตอนวิธีการเข้าออร์เดอร์
ที่ง่ายที่สุดและในเวลาเดียวกันวิธีที่เชื่อถือได้มากที่สุด ในการแก้ไขปัญหาจุดเริ่มต้นที่จะผ่านเวลาที่ปัจจัยเหตุผลดังต่อไปนี้:
- เคาน์เตอร์ของจำนวนเงินของทริกเกอร์ที่แสดงถึงการสร้างช่องโหวในโปรแกรมซึ่งไม่เพียง แต่มีความซับซ้อนของอัลกอริทึม แต่ความเร็วของการซื้อขายยังช้าลง
- ความกว้างและระดับการควบคุมที่เกี่ยวข้องของราคา สามารถเกิดซ้ำได้เพราะราคากลับมาที่เดิม แท่งเทียนทำเกณฑ์ของระดับราคาที่ไม่สม่ำเสมอ
- เวลากลับตัว ไม่ได้ย้ายในทิศทางเดียวเท่านั้น (มันเพิ่มขึ้น) จึงเป็นเกณฑ์ที่ถูกต้องมากที่สุด
วิธีนี้เป็นปัจจัยที่สำคัญคือช่วงเวลาของการเรียกอัลกอริทึมมายังรายการที่จะเฉพาะเจาะจงมากขึ้นช่วงเวลาของการเรียกคำสั่งสำหรับการเปิดตำแหน่ง (OrderSend) ในขณะที่ทั้งสองช่วงเวลาที่อาจจะไม่ตรงนี้ถ้าบางครั้งล่าช้าพิเศษ ดังนั้นเราสามารถจำได้ว่าขณะนี้ (เวลาปัจจุบัน) เมื่อเปิดตำแหน่ง แต่วิธีการใช้พารามิเตอร์นี้ในขั้นตอนวิธีการรายการที่จะห้ามรายการที่สองและที่เกิดขึ้นบนแท่งเทียนที่ระบุไว้หรือไม่? เราไม่ทราบว่าขณะนี้หรือล่วงหน้า (ค่าสัมบูรณ์ของมัน)
ดังนั้นเราจึงไม่สามารถใส่ไว้ในขั้นตอนวิธีการล่วงหน้าในออร์เดอร์ อัลกอริทึมมันจะควรพิจารณา (ภาพรวม) สภาพทั่วไป บางอย่างที่จะแก้ออร์เดอร์แรกบนแท่งเทียน แต่ห้ามออร์เดอร์ที่เกิดขึ้นทั้งหมดบนแท่งเทียนโดยไม่ต้องคำนวณทริกเกอร์ (ตัวเลือกที่มีเคาน์เตอร์เราได้ปรับตัวลดลงก่อนหน้านี้)การแก้ปัญหาคือค่อนข้างง่าย
ครั้งแรกผมจะเขียนโค้ดที่มีความคิดเห็นบางส่วนและจากนั้นจะชี้แจงในรายละเอียดเพิ่มเติม นี่คือรหัสเสริม (เน้นสีเหลือง) ที่ต้องการที่จะอยู่ในขั้นตอนวิธีการของการซื้อขายที่ปรึกษาผู้เชี่ยวชาญ (ดู MACD_Sample_plus1.mq4) นี้:
ครั้งแรกผมจะเขียนโค้ดที่มีความคิดเห็นบางส่วนและจากนั้นจะชี้แจงในรายละเอียดเพิ่มเติม นี่คือรหัสเสริม (เน้นสีเหลือง) ที่ต้องการที่จะอยู่ในขั้นตอนวิธีการของการซื้อขายที่ปรึกษาผู้เชี่ยวชาญ (ดู 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
อ่านเพิ่มเติม:
แต่เวลาที่แน่นอน (ช่วงเวลารายการ) เราใช้เวลา - เวลาว่างจากช่วงเวลาของการเปิดแท่งใหม่ของปัจจุบันจนถึงขณะเข้าที่ ค่านี้แล้วเมื่อเทียบกับชุดก่อนหน้านี้ค่าเวลาที่ค่อนข้างใหญ่ (ความยาวของทั้งแท่งเทียน) ที่ช่วยให้ออร์เดอร์แรกที่จะถูกใช้ในช่วงเวลาของการเปิดตำแหน่งที่เราเปลี่ยนค่า (ลดลง) ของตัวแปร Time_open โดยการเขียนค่ามีช่องว่างของเวลาจากจุดเริ่มต้นของแท่งเทียนจนถึงจุดที่แท้จริงของการปิด และเนื่องจากในช่วงเวลาที่เกิดขึ้นเวลาใด ๆ ค่าของ (TimeCurrent () - เวลา [0]) จะเกิน
ค่าที่เราเขียนที่จุดเริ่มต้นแล้ว (TimeCurrent () - เวลา [0]) <สภาพ Time_open จะยังคงเป็นไปไม่ได้ ซึ่งประสบความสำเร็จโดยการปิดกั้นออร์เดอร์ที่สองและที่เกิดขึ้นบนแท่งเทียนนี้วิธีนี้ได้โดยไม่ต้องเคาน์เตอร์ของจำนวนเงินของออร์เดอร์และการวิเคราะห์การเคลื่อนไหวของราคากว้างใด ๆ ที่เราได้แก้
ปัญหาของข้อผิดพลาดด้านล่างนี้เป็นผลมาจากการปรับปรุงง่ายๆเช่นขั้นตอนวิธีการเริ่มต้นของ EA รายการ ( "MACD Sample_plus1") นี้:
เราจะเห็นว่ามีเพียงหนึ่งออร์เดอร์ในแท่งเทียนไม่มีข้อผิดพลาดและการกระจายถูกตัดออกอย่างสมบูรณ์ การตั้งค่าตามค่าเริ่มต้นจะถูกบันทึกไว้อย่างสมบูรณ์ดังนั้นจึงเป็นที่ชัดเจนว่าปัญหาได้รับการแก้ไขโดยความช่วยเหลือของเปลี่ยนการตั้งค่าของ 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"):
เพื่อการนี้เราต้องเอาทริกเกอร์โดย 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 |
แปลและเรียบเรียงโดย: คนเล่น Forex
ความคิดเห็น
แสดงความคิดเห็น