MyBanner

โฆษณา

วันเสาร์ที่ 30 พฤศจิกายน พ.ศ. 2562

โฆษณา :: Moon bitcoin cash





           Moon Bitcoin Cash เป็นเว็บไซต์แจก Bitcoin Cash แห่งหนึ่งที่เปิดมาพร้อมๆ กับเว็บไซต์ coinpot.co ซึ่งเป็นเว็บไซต์แบบ micro wallet แห่งหนึ่ง โดยเราสามารถเครม Bitcoin Cash ได้ในทุกๆ 5 นาที ถ้าท่านยังไม่มีบัญชีของ coinpot.co เมื่อคลิกที่ปุ่ม Sign in บนหน้าเว็บ ให้ทำการลงทะเบียนกับ coinpot.co ก่อน โดยคลิกเลือกที่หัวข้อ register first ไปไดอะล็อกที่ปรากฏขึ้น หน้าเว็บไซต์ coin pot จะเปิดขึ้นให้ทำการลงทะเบียน จากนั้นเราก็จะสามารถเครม Bitcoin Cash ได้ตลอด โดยยอดเงินจะถูกสะสมไว้ในเว็บไซต์ Coinpot

วันพุธที่ 20 มีนาคม พ.ศ. 2562

การคำนวณหาขนาด lot, Stop Loss (SL) และ Take Profit (TP) ของ My MA100 BB10 Fractals PSAR MACD RSI Thai EA



Unstable
Platform
MT 4
ปรับปรุงครั้งสุดท้ายเมื่อ : ๒๖ มกราคม พ.ศ.๒๕๖๒
ไม่รับประกันความเสียหาอันเนื่องมาจากการทำงานของ EA ชุดนี้

              ยังอยู่ที่เรื่องของ EA ที่ชื่อ My MA100 BB10 Fractals PSAR MACD RSI Thai EA นะครับ EA ที่อยู่เขียนนำมาเสนอไม่ใช่ EA ที่ยอดเยี่ยมที่สุด แต่ผู้เขียนนำมาเสนอเพื่อให้ศึกษาวิธีการเขียน EA เป็นหลัก

อย่างราวที่จะนำมาคุยในครั้งนี้ จะเป็นเรื่องของวิธีการกำหนด lot size, Stop Loss และ Take Profit เนื่องจาก EA ชุดนี้จะกำหนด lot size อัตโนมัติ ส่วน stop loss และ take profit ผู้ใช้สามารถกำหนดเอง (โดยระบุค่าในหัวข้อ StopLoss และ TakeProfit ในแท็บ Input ของกรอบ Properties ของ Expert Advisor) หรือจะกำหนดให้ EA คำนวณให้อัตโนมัติก็ได้ (โดยกำหนดค่าหัวข้อ CalculateNewStopLoss และ/หรือ UseAutoTakeProfit เป็น Ture) ซึ่ง EA จะนำผลของการคำนวณมาแสดงบนด้านขวาล่างของหน้าจอกราฟ ดังรูป



หา StopLoss

ก่อนอื่นต้องทำการหาค่า Stop Loss ก่อน ใน EA ชุดนี้จะเรียกว่า การหาระยะตัดขาดทุน ซึีงผู้เขียนทำเป็นฟังก์ชันเฉพาะไว้ชื่อว่า "หาจำนวนตัดขาดทุนที่เหมาะสม()" ซึ่งมีรายละเอียดภายในฟังก์ชันดังนี้

/*+------------------------------------------------------------------+
ฟังก์ชัน หาจำนวนตัดขาดทุนที่เหมาะสม() ทำหน้าที่หาจำนวน pip สำหรับการตัดขาดทุน หรือ Stop Loss ใหม่
+------------------------------------------------------------------+*/
int หาจำนวนตัดขาดทุนที่เหมาะสม()
{
         int จำนวนตัดขาดทุนที่คำนวณได้ = StopLoss;
         int ระยะห่างของราคากับแนวรับ;
         int ระยะห่างHighLowแท่งก่อน;

         if (CalculateNewStopLoss) {
                 //ใช้เส้น MA เป็นหลัก
                 if (รูปแบบการซื้อขาย == OP_BUY)
                 {
                         //ปรกติจะใช้ MA100 เป็นแนวรับ แต่ถ้า MA100 อยู่เหนือ ขอบล่างของ BB จะใช้ขอบล่าง BB แทน
                        if (ขอบล่างBB < MA100)
                        {
                                 ระยะห่างของราคากับแนวรับ = (Close[0] - ขอบล่างBB) / Point;
                        } else {
                                 ระยะห่างของราคากับแนวรับ = (Close[0] - MA100) / Point;
                        }
                 }

                 if (รูปแบบการซื้อขาย == OP_SELL)
                 {
                        //ถ้า MA100 อยู่ใต้ขอบบน BB จะใช้ขอบบน BB เป็นแนวรับ
                        if (ขอบบนBB > MA100)
                        {
                                ระยะห่างของราคากับแนวรับ = (ขอบบนBB - Close[0]) / Point;
                        } else {
                                ระยะห่างของราคากับแนวรับ = (MA100 - Close[0]) / Point;
                        }
                  }


                  //กรณีได้ค่าติดลบ ปรับให้เป็น บวก ก่อน
                  if (ระยะห่างของราคากับแนวรับ < 0)
                  {
                         ระยะห่างของราคากับแนวรับ = -(ระยะห่างของราคากับแนวรับ);
                  }

                  if ((StopLoss > 0) && (ระยะห่างของราคากับแนวรับ < StopLoss))
                  {
                         ระยะห่างของราคากับแนวรับ = StopLoss;
                  }

                 ระยะห่างHighLowแท่งก่อน = (iHigh(NULL, PERIOD_CURRENT, 1)-iLow(NULL, PERIOD_CURRENT, 1)) / Point;

                 //ใช้เส้นค่าเฉลี่ยเคลื่อนช้าเป็นแนวต้นหรือ Stop Loss แต่ต้องไม่น้อยกว่วขนาดแท่งเทียนแท่งที่ผ่านมา
                จำนวนตัดขาดทุนที่คำนวณได้ = ((ระยะห่างของราคากับแนวรับ < ระยะห่างHighLowแท่งก่อน) ? 
                                                          ระยะห่างHighLowแท่งก่อน : ระยะห่างของราคากับแนวรับ);
         }
         return(จำนวนตัดขาดทุนที่คำนวณได้);
}


ก่อนที่จะทำการคำนวณใดๆ เราจะนำค่าที่ผู้ใช้ระบุไว้ใน พารามิเตอร์ StopLoss ของ EA มาเก็บไว้ก่อน จากนั้นจะเข้าสู่การคำนวณ

หลักการก็คือ เราต้องรู้ก่อนว่าเทรน หรือรูปแบบการซื้อขายในขณะนั้นเป็น BUY หรือ SELL ซึ่งชุดคำสั่งในการตรวจสอบเทรนจะอยู่ในฟังก์ชัน OnTick() ตรงการตรวจสอบเงื่อนไขการซื้อ/ขาย  (ดูที่บทความเรื่อง " เงื่อนไขการเปิดคำสั่งซื้อ/ขายของ My MA100 BB10 Fractals PSAR MACD RSI Thai EA")

เมื่อได้รูปแบบการซื้อขายในขณะนั้นแล้ว ก็จะนำเปรียบเทียบหาระยะราคาในขณะนั้น (Close[0]) กับแนวรับ (เป็นทั้งแนวรับแนวต้าน) ซึ่งจะใช้เส้น MA 100 หรือขอบบน หรือ ขอบล่างของ Bolliger Band โดยดูว่าค่าใดให้ระยะห่างมากที่สุด ซึ่งผลที่ได้อาจจะเป็น บวก หรือ ลบ ในกรณีที่เป็นค่าลบ จะทำการปรับให้เป็นบวกก่อน

ถัดมาจะทำการตรวจสอบว่าระยะห่างระหว่างราคาปิดกับแนวรับ น้อยกว่า ค่าที่กำหนดในพารามิเตอร์ StopLoss ตัว EA จะใช้ค่าในพารามิเตอร์ StopLoss แทน

ขั้นสุดท้ายก่อนจะส่งค่าออกจากฟังก์ชัน EA จะทำการหาระยะห่างระหว่าง High กับ Low ของแท่งก่อนหน้า ถ้าระยะที่ได้น้อยกว่าขนาดของแท่งราคาแท่งก่อนหน้านี้ จะใช้ขนาดของแท่งราคาดังกล่าวแทน ค่าที่ได้จะส่งผ่านตัวฟังก์ชัน  "หาจำนวนตัดขาดทุนที่เหมาะสม()" ดังที่กล่าวมา

หา Lot size

หลังจากที่เราได้ระยะห่างระหว่างราคาปิดกับแนวรับ หรืแที่ผู้เขียนเรียกว่า จำนวนตัดขาดทุนที่เหมาะสม เราจะมาทำการหาขนาด lot size ต่อ โดยการทำงานดังกล่าจะเป็นหน้าที่ของฟังก์ชัน "หาจำนวนล็อตที่เหมาะสม()" ซึ่งมีรายละเอียดดังนี้


/*+------------------------------------------------------------------+
ฟังก์ชัน หาจำนวนล็อตที่เหมาะสม() ทำหน้าที่หาจำนวนล็อตที่เหมาะสมต่อกันเปิด order
+------------------------------------------------------------------+*/
double หาจำนวนล็อตที่เหมาะสม()
{
        double ขนาดล็อตที่คำนวณได้;
        double จำนวนเงินทุนที่ใช้ได้;

        //หาวงเงินในบัญชีที่เปิดคำสั่งซื้อ/ขายได้
        double จำนวนเงินในบัญชี = AccountFreeMargin();

        if (StringFind(Symbol(), "micro", 0) != 0)
        {
                จำนวนเงินในบัญชี = AccountFreeMargin() * 100;
        }

         //หามูลค่้าต่อ 1 pip
         double มูลค่าต่อ1pip = MarketInfo(Symbol(), MODE_TICKVALUE);

         //ถ้าทุนมากกว่า 200 จึงจะคำนวนตามสูตร
        if (จำนวนเงินในบัญชี > 200)
        {
                //นำจำนวนเงินในบัญชีมาคำนวณหายอดเงินที่ใช้ได้โดยดูจาก MaximumRisk
                จำนวนเงินทุนที่ใช้ได้ = (จำนวนเงินในบัญชี * MaximumRisk);
                //หาขขนาดล็อตที่เหมาะสม
                ขนาดล็อตที่คำนวณได้ = NormalizeDouble(( (จำนวนเงินทุนที่ใช้ได้ * MaximumRisk) /
                                                 (((StopLoss==0) && !CalculateNewStopLoss) ?
                                                 100 :
                                                 หาจำนวนตัดขาดทุนที่เหมาะสม())) / มูลค่าต่อ1pip //หาร ด้วยจำนวน pip ที่ตัดขาดทุน
                                                 , 2); //แปลงเป็นเลขทศนิยม 2 ตำแหน่ง
        } else {
               ขนาดล็อตที่คำนวณได้ = 0.01;
        }
        //ถ้าขนาด lots ที่คำนวณได้น้อยกว่า MinimumLotSize ให้ใช้ค่าใน MinimumLotSize แทน
        if (ขนาดล็อตที่คำนวณได้ < MinimumLotSize) ขนาดล็อตที่คำนวณได้ = MinimumLotSize;
        
        //ถ้าขนาด lots มากกว่า 100 จะปรับให้เท่ากับ 100 เนื่องจากโบรกเกอร์ส่วนใหญ่จะไมีอนุญาตให้ lots size มากกว่า 100
        if (ขนาดล็อตที่คำนวณได้ > 100) ขนาดล็อตที่คำนวณได้ = 100;
        
        //ส่งค่าขนาล็ออตที่เหมาะสมกลับ
        return(ขนาดล็อตที่คำนวณได้);
}

ในการหาขนาดล็อต (lot size) ของการเปิดคำสั่งซื้อ/ขายแต่ละครั้งของ My MA100 BB10 Fractals PSAR MACD RSI Thai EA จะเริ่มต้นด้วยการหาจำนวนเงินที่สามารถใช้ได้ก่อน โดยใน EA ชุดนี้จะดูจาก free margin (คำสั่ง AccountFreeMargin()) ไม่ได้นำมาจากยอดคงเหลือในบัญชี (Accout Balance) เนื่องจากเป็นยอดเงินคงเหลือที่ใช้ได้จริง

-สำหรับบัญชีไมโครของ XM

บัญชีไมโครของ XM จะต่างจากบัญชีประเภทเดียวกันของโบรกเกอร์อื่นๆ คือ เวลาเปิดคำสั่งซื้อ/ขาย XM จะดำเนินการในหน่วยเซ็นต์ (cent) แต่แสดงผลบนโปรแกรมเทรดเป็น USD หมายถึงค่าที่เก็บในระบบเป็น USD ดังนั้นเมื่อจะหาจำนวนเงินที่สามารถใช้ได้ด้วยคำสั่ง AccountFreeMargin() มาแล้วจำเป็นต้องแปลงให้เป็นหน่วย cent ก่อน คือ นำยอดเงินเงินที่ใช้ได้ x 100

จากนั้นจะทำการหามูลค่าต่อ 1 pip (คำสั่ง MarketInfo(Symbol(), MODE_TICKVALUE);) แล้วเข้าสู่การคำนวณหาขนาดล็อตที่เหมาะสม โดยจะทำเมื่อ ยอดเงินที่สามารถใช้ได้มากกว่า 200 USD หรือ USC กล่าวคือ ถ้ายอดเงินที่ใช้ได้น้อยกว่า 200 จะใช้ขนาดล็อกเท่ากับ 0.01 เสมอ (หรือใช้ตามที่ระบุในพารามิเตอร์ของ EA)


ในการคำนวนเราจะทำการนำยอดเงินที่ใช้ได้ทั้งหมด (Free magin) มาคูณกับระดับความเสี่ยงที่เราระบุไว้ในพารามิเตอร์ MaximumRisk ของ EA (ความเสี่ยงเป็นเปอร์เซ็นต์ หารด้วย 100) จะได้เป็นยอดเงินที่จะใช้เปิดคำสั่งซื้อ/ขายในครั้งนี้

ตัวอย่างเช่น ถ้ามีเงินอยู่ 100 USD แล้วเรากำหนดความเสี่ยงเป็น 2 เปอร์เซ็นต์ (MaximumRisk = 0.02) เท่ากับ 2 USD ตัว EA จะนำยอดเงินดังกล่าวไปคำนวนหาจำนวนล็อตที่จะเปิดคำสั่งซื้อ/ขายไม่ใช่ยอดเงินใน free margin ทั้งหมด

ในการหาขนาดล็อตสำหรับการเปิดคำสั่งซื้อ/ขาย จะใช้สู่ดังนี้

ขนาดล็อตที่คำนวนได้ ได้จาก ((จำนวนเงินทุน x ระดับความเสี่ยง) / 
ระยะ stop loss หรือระยะตัดขาดทุน )/มูลค่าต่อ 1 pip

ซึ่งใน EA จะมีรายละเอียดชุดคำสั่งดังนี้

ขนาดล็อตที่คำนวณได้ = NormalizeDouble(( (จำนวนเงินทุนที่ใช้ได้ * MaximumRisk) /
                                                 (((StopLoss==0) && !CalculateNewStopLoss) ?
                                                 100 :
                                                 หาจำนวนตัดขาดทุนที่เหมาะสม())) / มูลค่าต่อ1pip //หาร ด้วยจำนวน pip ที่ตัดขาดทุน


                                                 , 2); //แปลงเป็นเลขทศนิยม ตำแหน่ง

จากชุดคำสั่งข้างต้น จะสังเกตเห็นว่า จำนวนเงินที่นำมาใช้คำนวณ EA จะนำมาคูณกับเปอร์เซ็นของระดับความเสี่ยงอีกครั้งหนึ่ง ก่อนจะนำมาหาระยะตัดขาดทุน ซึ่งใน EA ชุดนี้จะหาด้วยฟังก์ชัน หาจำนวนตัดขาดทุนที่เหมาะสม() ทั้งหมดหารด้วยมูลค่าต่อ 1 pip และจัดตัวเลขใหเป็นเลขทดศนิยม 2 หลักตามลำดับ

ก่อนจะส่งค่าจำนวนตัดขาดทุนที่เหมาะสมออกไป จะทำการตรวจสอบก่อนว่า ขนาดล็อตที่ได้น้อยกว่าที่กำหนดในาพามิเตอร์ MinimumLotSize ของ EA ถ้าน้อยกว่า จะนำค่าใน MinimumLotSize ไปใช้ (บัญชีเทรดบางประเภทจะกำหนดขนาดล็อตต่ำสุดเป็นค่าอื่นๆ ไม่ใช่ 0.01 ทุกบัญชี) และบัญชีเทรดฟอร์เร็กซ์ทุกบัญชีทุกประเภทจะเปิดคำสั่งซื้อขายได้ไม่เกิน 100 ล็อต ซึ่งถ้าผลการคำนวณขนาดล็อตที่ได้เกิน 100 จะใช้ขนาดล็อตเป็น 100 ล็อตแทน

หาระยะเป้าหมายกำไร (Take Profit : T/P)



ในกรณีที่ผู้ใช้กำหนดค่าพารามิเตอร์ในหัวข้อ UseAutoTakeProfit เป็น True ตัว EA ชุดนี้จะทำการคำนวณหาเป้าหมายกำไร หรือ Take Profit ให้อัตโนมัติ โดยนำระยะตัดขาดทุนที่เหมาะสม และค่าที่ระบุในพารามิเตอร์ RiskRewardRatio ของ EA มาคำนวณตามสูตรดังนี้

 Take Profit = ระยะตัดขาดทุน  *  (Risk / Reward)

โดยผู้เขียนทำเป็นฟังก์ชันเฉพาะไว้ชื่อ หาเป้าหมายกำไรอัตโนมัติ() โดยมีรายละเอียดภายในฟังก์ชันดังนี้

/*+------------------------------------------------------------------+
ฟังก์ชัน หาเป้าหมายกำไรอัตโนมัติ(); ทำหน้าที่ หาเป้าหมายกำไรที่เหมาะสม
+------------------------------------------------------------------+*/
double หาเป้าหมายกำไรอัตโนมัติ()
{
        if (UseAutoTakeProfit)
        {
                //ระยะตัดขาดทุน * (Risk  / Reward )
                double ระยะเป้าหมายกำไร = (หาจำนวนตัดขาดทุนที่เหมาะสม() / RiskRewardRatio);
                return(ระยะเป้าหมายกำไร);
        } else {
                return(TakeProfit);
        }
}


เนื่องจากค่า Risk / Reward เป็นค่าอัตรส่วนระหว่าง risk หรือ ความเสี่ยง 1 หน่วย ต่อ (หาร) Reward หรือผลตอบแทนที่ได้รับ เช่นค่า ต้องการเสี่ยง 1 หน่วย และต้องการผลตอบแทน 2 เท่า ค่าอัตราส่วนดังกล่าวจะเท่ากับ 1/2 หรือ 0.5 เป็นค้น ซึ่งค่าดังกล่าวผู้ใช้ต้องระบุไว้ในพารามิเตอร์ RiskRewardRatio ของ EA
 ในการหาเป้าหมายกำไร หรือ Take Profit ใน EA ชุดนี้จะใช้ ระยะตัดขาดทุน หารด้วย อัตราส่วนระหว่าง Risk กับ Reward ซึ่งจะได้ผลออกมาเป็นระยะเป้าหมายกำไร หรือ Take Profit ซึ่งค่าต่างๆ ดังกล่าวจะนำไปใช้ในการเปิดคำสั่งซื้อ/ขายของ EA ชุดนี้

บทความที่เกี่ยวข้อง

เขียน EA สำหรับ FOREX ใช้เองจะดีไหม ตอน My MA100 BB10 Fractals PSAR MACD RSI Thai EA
การกำหนดค่าต่างๆ ของ My MA100 BB10 Fractals PSAR MACD RSI Thai EA
indicators ที่ใช้ใน My MA100 BB10 Fractals PSAR MACD RSI Thai EA
เงื่อนไขการเปิดคำสั่งซื้อ/ขายของ My MA100 BB10 Fractals PSAR MACD RSI Thai EA
การคำนวณหาขนาด lot, Stop Loss (SL) และ Take Profit (TP) ของ My MA100 BB10 Fractals PSAR MACD RSI Thai EA

Adz2you.