EA Programing => ปัญหาที่พบในการเขียน EA => Topic started by: Bauer on สิงหาคม 31, 2009, 12:42:12 am
-
เอาเจ้า dragonpips ที่ผมได้แกะ และตัด code ส่วนเกินจริงๆ ออกไป ละปรับเปลี่ยนชื่อตัวแปร รวมทั้งปรับเปลี่ยน code นิดหน่อยให้ดูง่าย มาให้เพื่อนๆ ที่สนใจเอาไปศึกษาครับ ก่อนผมจะเอาไปทำอะไรต่ออีกหลายอย่างจนเละ(ล้อเล่น) :)
-
ขอบคุณมากเลยครับ :D
ได้ลองอ่านดูแล้วครับ อ่านเข้าใจมากขึ้นเยอะเลยจริงๆ
มี feature ต่างๆเพิ่มขึ้นมาในหน้าการตั้งค่าด้วย
เช่นมีช่องตั้ง stoploss 1 กับ stoploss 2 (<--มันต่างกันยังไงครับเนี่ยะ) นี่เป็นสิ่งที่เราใส่เพิ่มขึ้นมาใช่ไหมครับ? จากโค้ดตัวเดิม ต้องทำอย่างถึงสามารถแปลงออกมาให้หน้าตาเปลี่ยนไปอย่างนี้ได้ครับ
โอว คงจะได้เข้ามาขอรบกวน คุยไขข้อสงสัยบ่อยๆแล้วแน่เลยครับ
-
ขอบคุณมากเลยครับ :D
ได้ลองอ่านดูแล้วครับ อ่านเข้าใจมากขึ้นเยอะเลยจริงๆ
มี feature ต่างๆเพิ่มขึ้นมาในหน้าการตั้งค่าด้วย
เช่นมีช่องตั้ง stoploss 1 กับ stoploss 2 (<--มันต่างกันยังไงครับเนี่ยะ) นี่เป็นสิ่งที่เราใส่เพิ่มขึ้นมาใช่ไหมครับ? จากโค้ดตัวเดิม ต้องทำอย่างถึงสามารถแปลงออกมาให้หน้าตาเปลี่ยนไปอย่างนี้ได้ครับ
โอว คงจะได้เข้ามาขอรบกวน คุยไขข้อสงสัยบ่อยๆแล้วแน่เลยครับ
จริง ๆ แล้วเจ้า stoploss1 กับ stoploss2 มันมีอยู่เดิมครับ แต่เมื่อก่อนมัน fix ที่ 32 ครับ ผมอยากลอง optimize ดู เลยยกมาเป็น parameter อีกตัว ถ้า set เป็น 32 มันคือค่าเดิมๆ ครับ
สำหรับที่ถามว่ามันต่างกันอย่างไร ปกติ dragon มันจะเปิดออร์เดอร์ใน 4 เงื่อนไขต่างๆกัน ในเงื่อนไขแต่ละแบบจะใช้ stoploss ต่างกันไปครับ 1 หรือ 2 (ลองดูจาก code ได้ครับ ดูไม่ยากแล้ว)
ส่วนที่ถามว่าทำไมหน้าตาเปลี่ยนไป อันนี้ผม แกะโค้ดและ optimize รวมทั้งเปลี่ยนชื่อตัวแปรให้เข้าใจง่ายขึ้นครับ แต่สำหรับชื่อตัวแปรบางส่วนอาจยังสื่อไม่ดีมากนักครับ
-
ปรับโค๊ดแล้ว มันแตกต่างจากของเดิมยังไงครับ
พอดีไม่ค่อยรู้เกี่ยวกับอีเอครับ แต่สนใจอีเอตัวนี้ครับ :D
-
ปรับโค๊ดแล้ว มันแตกต่างจากของเดิมยังไงครับ
พอดีไม่ค่อยรู้เกี่ยวกับอีเอครับ แต่สนใจอีเอตัวนี้ครับ :D
มันไม่ได้เกี่ยวกับการทำงานของ EA ครับ EA ยังคงทำงานได้เหมือนเดิมครับ แค่ช่วยให้คนที่เขียน EA เป็น อ่านเข้าใจง่ายขึ้น และสามารถนำไป modified ได้ง่ายขึ้นครับ
-
ถ้ามีไฟล์ EA แต่มันเป็น .ex4 จะมีวิธีเข้าเปิดโค้ทไหมครับ
ตัวที่นำมาถอดโค้ท คือversionล่าสุดหรือเปล่า? บรรทัดที่ตัดออกไปจะไม่กระทบแน่นะครับ?
-
ถ้ามีไฟล์ EA แต่มันเป็น .ex4 จะมีวิธีเข้าเปิดโค้ทไหมครับ
ตัวที่นำมาถอดโค้ท คือversionล่าสุดหรือเปล่า? บรรทัดที่ตัดออกไปจะไม่กระทบแน่นะครับ?
เอา Decompiler ให้เปลี่ยนกลับมาเป็น .mq4 ครับ
-
ถ้ามีไฟล์ EA แต่มันเป็น .ex4 จะมีวิธีเข้าเปิดโค้ทไหมครับ
ตัวที่นำมาถอดโค้ท คือversionล่าสุดหรือเปล่า? บรรทัดที่ตัดออกไปจะไม่กระทบแน่นะครับ?
บรรทัดที่ตัดออกไป คือ ตรวจสอบแล้วมันไม่เกี่ยวกับการทำงาน และไม่ได้ใช้งานครับ หลังจากตัดออกก็ลอง back test ดู ผลยังออกมาเหมือนก่อนตัด ถ้าถามว่าไม่กระทบแน่หรือเปล่า มันเป็นการทำโดยคนนะครับ ก็คงมีโอกาสผิดพลาด แต่ถ้าถามผมซึ่งเป็นคนทำ ตอบว่าค่อนข้างมั่นใจครับ เพราะตรวจสอบค่อนข้างละเอียดครับ
ตัวนี้เป็น version เก่าครับ ที่เขาแจกกันที่ thailandinvestorclub ไงครับ
-
ถ้ามีไฟล์ EA แต่มันเป็น .ex4 จะมีวิธีเข้าเปิดโค้ทไหมครับ
ตัวที่นำมาถอดโค้ท คือversionล่าสุดหรือเปล่า? บรรทัดที่ตัดออกไปจะไม่กระทบแน่นะครับ?
เอา Decompiler ให้เปลี่ยนกลับมาเป็น .mq4 ครับ
ว้าวววว เข้ามาโหลดก่อนเลยเป็นคนแรก
ขอบคุณ admin มากครับ
ขอบคุณคุณ Bauer เช่นกันครับ
-
Dragonpip ของคุณ Bauer เอาไปรันทดสอบแล้วได้ผลต่างจากของเดิมเล็กน้อยครับ แตกต่างกันตรงไหนไม่ทราบ แต่ดูใน Journal แล้วมี error โผล่เป็นระยะๆ(ของเดิมก็มีerrorโผล่ออกมาเป็นระยะๆเหมือนกัน) อาจเป็นเพราะเจ้านี่ก็ได้ที่ทำให้ผลการเทรดแตกต่าง
error มีดังต่อไปนี้ครับ
- order send error 130
- order send error 4107
- order close error 145
มันรันได้ ซื้อขายเปิดปิดpositionได้
แต่ก็ฟ้องว่ามีปัญหามาเป็นระยะๆ
ดูบรรทัดใกล้ๆกันมันฟ้องว่า ราคาที่ส่งมีทศนิยมเกินมา เช่น 1.5654000
ลองทดสอบดูครับ น่าจะพบเหมือนกัน (เดี๋ยวจะลองหาภาพมาแปะ)
-
ราคาที่มีทศนิยมเกินมา EA ที่ผมเขียนเองก็เจอครับ มีค่าที่ทศนิยมเกินเหมือนกัน อันนี้ผมคิดว่า error มาจากกราฟแล้วครับเพราะวันนี้ผมเจอค่าแบบนี้กับ ea ที่รัน backtest ถึง 3 ตัวครับ
-
ราคาที่มีทศนิยมเกินมา EA ที่ผมเขียนเองก็เจอครับ มีค่าที่ทศนิยมเกินเหมือนกัน อันนี้ผมคิดว่า error มาจากกราฟแล้วครับเพราะวันนี้ผมเจอค่าแบบนี้กับ ea ที่รัน backtest ถึง 3 ตัวครับ
อืม ครับ งั้นเป็นที่dataของกราฟแน่เลย
อยาก modify เจ้า dragonpip เป็นจังเลยครับ
บางทีมันราคาบวกให้ตั้ง 4 - 5 ช่องแล้วไม่ยอมปิด
มาปิดเอาติดลบบ้าง ปิดให้แค่ 2 ช่องบ้าง น่าเสียดายๆ
จะได้ลองเขียนเติมโค้ดให้มันปิดซะถ้ามันได้กำไรดีระดับหนึ่งแล้ว ฯลฯ
พยายามอ่านตัวแปรที่คุณ Bauer แปลงโค้ดมาให้ก็แล้ว
แต่ก็ได้แค่อ่านเป็นภาษาอังกฤษ
ยังไม่แตกฉานภาษา RA เลยไม่เข้าใจระบบเงื่อนไขของมันเลย
ตอนนี้กำลังพยายามเอาบทความของ admin
เอามานั่งอ่านทำความรู้จักกับการสร้าง EA ไปก่อน
ไม่รู้เมื่อไหร่นะจะเก่งอย่างคนอื่นเขาบ้าง
-
Dragonpip ของคุณ Bauer เอาไปรันทดสอบแล้วได้ผลต่างจากของเดิมเล็กน้อยครับ แตกต่างกันตรงไหนไม่ทราบ แต่ดูใน Journal แล้วมี error โผล่เป็นระยะๆ(ของเดิมก็มีerrorโผล่ออกมาเป็นระยะๆเหมือนกัน) อาจเป็นเพราะเจ้านี่ก็ได้ที่ทำให้ผลการเทรดแตกต่าง
error มีดังต่อไปนี้ครับ
- order send error 130
- order send error 4107
- order close error 145
มันรันได้ ซื้อขายเปิดปิดpositionได้
แต่ก็ฟ้องว่ามีปัญหามาเป็นระยะๆ
ดูบรรทัดใกล้ๆกันมันฟ้องว่า ราคาที่ส่งมีทศนิยมเกินมา เช่น 1.5654000
ลองทดสอบดูครับ น่าจะพบเหมือนกัน (เดี๋ยวจะลองหาภาพมาแปะ)
ผมทดสอบที่ alpari ครับ ยังไม่เห็นปัญหาเรื่อง error ครับ แต่เท่าที่คุณบอกมา
1. error 130 มันคือปัญหาที่ stop loss ครับ น่าจะน้อยเกินไป ซึ่งในส่วนค่า fix default 32 น่าจะผ่านหมดเพราะถ้าไม่ผ่านคงขึ้น error เยอะแยะ แต่จริงๆ แล้วใน EA ตัวนี้มันไม่ได้ใช้ stop loss fix ทุก condition ในบาง condition มันคำนวณจาก indi อีกตัวหนึ่ง แล้วมาบวกหรือลบกับ ค่า fix นี้อีกที ผมเข้าใจว่าที่ error น่าจะมาจากส่วนนี้ คือ มันคำนวณได้ค่า stop loss น้อยเกินไป server มันเลยไม่รับ ตรงนี้แก้ได้โดยการเพิ่มการตรวจสอบค่า stop loss ที่คำนวณได้ก่อนเอาไปใช้ครับ ไว้ผมจะเพิ่มส่วนนี้ให้ครับ
2. error 4107 มันเป็น invalid price เข้าใจว่าราคาที่ส่งไปไม่ถูกต้อง ยังไม่แน่ใจว่าเป็นตรงส่วนไหน ไม่ทราบ error เยอะหรือเปล่าครับ มันอาจจะเป็นที่ข้อมูลเราหรือเปล่าครับ report ผลการทดสอบมันฟ้องอะไรหรือเปล่าครับเช่น mismatch charts errors มีหรือไม่
3. error 145 เกี่ยวกับการแก้ไข order ก็ยังไม่แน่ใจว่าเกิดได้ยังไง เพราะเท่าที่ดู code มันไม่มีการแก้ไข order เลย
ครับก็ตอบได้เบื้องต้นแค่นี้ก่อนครับ
-
ผ่านหมดเพราะถ้าไม่ผ่านคงขึ้น error เยอะแยะ แต่จริงๆ แล้วใน EA ตัวนี้มันไม่ได้ใช้ stop loss fix ทุก condition ในบาง condition มันคำนวณจาก indi อีกตัวหนึ่ง แล้วมาบวกหรือลบกับ ค่า fix นี้อีกที ผมเข้าใจว่าที่ error น่าจะมาจากส่วนนี้ คือ มันคำนวณได้ค่า stop loss น้อยเกินไป server มันเลยไม่รับ ตรงนี้แก้ได้โดยการเพิ่มการตรวจสอบค่า stop loss ที่คำนวณได้ก่อนเอาไปใช้ครับ ไว้ผมจะเพิ่มส่วนนี้ให้ครับ
ตรงนี้สงสัยจะเป็นทั้ง stoploss แล้วก็ target ครับ
กรณีนี้อาจเป็นการตั้ง target ใกล้ราคาเกินไปหรือเปล่าครับ?(ไม่แน่ใจ)
เพราะผมเอาไปรันกับ FXOpen เขาบังคับระยะห่างจากราคาเอาไว้ที่ 10 ช่องแหนะครับ
2. error 4107 มันเป็น invalid price เข้าใจว่าราคาที่ส่งไปไม่ถูกต้อง ยังไม่แน่ใจว่าเป็นตรงส่วนไหน ไม่ทราบ error เยอะหรือเปล่าครับ มันอาจจะเป็นที่ข้อมูลเราหรือเปล่าครับ report ผลการทดสอบมันฟ้องอะไรหรือเปล่าครับเช่น mismatch charts errors มีหรือไม่
error ตัวนี้ผมเทสกับกราฟ 1m ไม่มี mismatch chart เลยครับ (แต่ถ้าเทสกับกราฟอื่นๆล่ะเจอmismatchประจำเลย)
3. error 145 เกี่ยวกับการแก้ไข order ก็ยังไม่แน่ใจว่าเกิดได้ยังไง เพราะเท่าที่ดู code มันไม่มีการแก้ไข order เลย
อันนี้ไม่แน่ใจเหมือนกันครับ แต่เคยเห็นมันตั้ง buy/sell limit รอไว้ พร้อมกับตั้งเวลาหมดอายุ ใช่มันพยายามจะลบหรือเปล่าก็ไม่รู้ order close error 145
ไว้ถ้าเก็บรูปมาอาจช่วยได้ครับ ถามนิดหนึ่งครับ Slippage คืออะไรเหรอครับ
-
มาแล้วครับ รูป กดที่ภาพแล้วมันจะขยายขึ้นมาครับ
อันนี้ผมใช้ตัวที่คุณ Bauer ให้มาเลยนะครับ เซทค่า default ทั้งหมด เทสกับ Echf เดือนสิงหาคมครับ
ใน report ไม่มี mismatch chart เลยครับ แต่ model quality มีแค่ 25% เอง
ภาพที่สองมี error 4107 อยู่ด้วยครับ
เห็นคำว่า order close error แล้วน่ากลัวจัง
แปลว่ามันพยายามปิดสถานะให้เรา แต่ปิดไม่ได้ใช่ไหมครับ?
อย่างนี้ก็แปลว่าเรายังติดสถานะต่อไป
แทนที่จะปิดบวกได้กำไร ก็อาจต้องถือต่อจนกลายเป็นขาดทุนได้ เพราะ EA ปิดorderไม่ได้อย่างนั้นหรือเปล่าครับ
-
ดูภาพประกอบเหตุการณ์ error1 ข้างบนกันครับ
อ่านทวนขึ้นมานะครับ กราฟแท่งละ 1 นาที
2009.08.25 03:58 Dragonpips_siwach01 EURCHF,M1: OrderSend error 130
2009.08.25 03:58 Dragonpips_siwach01 EURCHF,M1: OrderSend error 130
2009.08.25 03:40 Dragonpips_siwach01 EURCHF,M1: close #118 sell 0.30 EURCHF at 1.5182 sl: 1.5222 tp: 1.5175 at price 1.5179
2009.08.25 02:24 Dragonpips_siwach01 EURCHF,M1: OrderSend error 130
2009.08.25 02:20 Dragonpips_siwach01 EURCHF,M1: OrderSend error 130
2009.08.25 02:08 Dragonpips_siwach01 EURCHF,M1: OrderClose error 145
2009.08.25 02:08 Dragonpips_siwach01 EURCHF,M1: OrderClose error 145
2009.08.25 02:08 Dragonpips_siwach01 EURCHF,M1: OrderSend error 130
2009.08.25 02:08 Dragonpips_siwach01 EURCHF,M1: OrderClose error 145
(http://www.thaiforexea.com/index.php?action=dlattach;topic=32.0;attach=51;image)
- (เริ่มจากเลข ๑) EA ได้ Sell ไว้ แล้วก็ทยอยปิดทำกำไรให้ตามเส้นที่มันลากให้ดู
- (เลข ๒) อนิจจา...มีSellอยู่สถานะหนึ่งที่ปิดไม่ได้
EA มันพยายามปิดให้ที่เวลา 02:08 (ที่เลข #2-1#) ตรงนั้นเป็น error 145 ถึงสามที
เมื่อไม่สามารถปิดสถานะได้ ก็เลยต้องถือลุ้นต่อไปซะงั้น
- ที่เดียวกัน 02:08 มี error 130 ด้วย
เข้าใจว่า EA พยายามเปิดสถานะ Buy แต่ไม่สำเร็จ เสียโอกาสไปอย่างน่าเสียดาย
- (เลข ๓) ที่เลข #2-2# ซ้อนเหลื่อมกันอยู่ เป็นเวลา 02:20 และ 02:24 มัน error 130
เข้าใจว่า EA พยายามเปิดสถานะ Sell แต่ไม่สำเร็จ เสียโอกาสไปอย่างน่าเสียดายเช่นกัน
- (เลข ๔) กว่าจะปิดสถานะคงค้าง(จากข้อ ๑)ได้ ก็ปาเข้าไป 03:40 แถมปิดน้อยกว่าพวกที่ Sell พร้อมกันซะอีก ช่วง 02:37 ราคาดีกว่าตั้งเยอะ ทำไมนะมันไม่ปิดให้ตรงนั้น
- (เลข ๕) เวลา 03:58 ที่เลข #3-1#
เข้าใจว่า EA พยายามเปิดสถานะ Buy แต่ไม่สำเร็จ เสียโอกาสไปอีกแล้ว น่าเสียดายมากๆ
ถ้าเจออย่างนี้กับการเทรดจริง ก็น่าเสียใจจังเลยครับ
คงต้องรบกวนผู้รู้ช่วยด้วยแล้วครับ
-
มาแล้วครับ รูป กดที่ภาพแล้วมันจะขยายขึ้นมาครับ
อันนี้ผมใช้ตัวที่คุณ Bauer ให้มาเลยนะครับ เซทค่า default ทั้งหมด เทสกับ Echf เดือนสิงหาคมครับ
ใน report ไม่มี mismatch chart เลยครับ แต่ model quality มีแค่ 25% เอง
ภาพที่สองมี error 4107 อยู่ด้วยครับ
เห็นคำว่า order close error แล้วน่ากลัวจัง
แปลว่ามันพยายามปิดสถานะให้เรา แต่ปิดไม่ได้ใช่ไหมครับ?
อย่างนี้ก็แปลว่าเรายังติดสถานะต่อไป
แทนที่จะปิดบวกได้กำไร ก็อาจต้องถือต่อจนกลายเป็นขาดทุนได้ เพราะ EA ปิดorderไม่ได้อย่างนั้นหรือเปล่าครับ
จากรูป 4107 น่าจะเป็นที่ข้อมูลเราไม่ถูกต้องที่ price มีทศยมแปลกๆ ครับ
ส่วน 145 ยังไม่มั่นใจครับ
แต่ทำไม model quanlity แค่ 25% แสดงว่าได้ข้อมูล 1M ของเดือนสิงหามาไม่หมดหรือครับ
-
ทำไม model quanlity แค่ 25% แสดงว่าได้ข้อมูล 1M ของเดือนสิงหามาไม่หมดหรือครับ
โฮ่ โพสต่อๆกันเลย เรื่อง Model Quality ไม่ทราบเหมือนกันครับ
ผมก็โหลดมาโดยตรงผ่าน MT4 Fxopen Demo มาเลยนา
เวลาทดสอบก็รันได้ แต่ก็อย่างว่าทำไมไม่รู้มันแจ้งคุณภาพ 25% ครับ
-
ทำไม model quanlity แค่ 25% แสดงว่าได้ข้อมูล 1M ของเดือนสิงหามาไม่หมดหรือครับ
โฮ่ โพสต่อๆกันเลย เรื่อง Model Quality ไม่ทราบเหมือนกันครับ
ผมก็โหลดมาโดยตรงผ่าน MT4 Fxopen Demo มาเลยนา
เวลาทดสอบก็รันได้ แต่ก็อย่างว่าทำไมไม่รู้มันแจ้งคุณภาพ 25% ครับ
Model quanlity ให้ดีต้อง 90%
-
แถวๆ นี้หรือเปล่าครับ ชุดคำสั่งปิด position? ผมยังอ่านแล้วไม่เข้าใจว่ามันคำนวนกับอะไรบ้างครับ
แต่อยากทดลองเพิ่มคำสั่งว่า ถ้าบวก 4 แล้วให้คำนวนกับเงื่อนไขอื่นๆเพื่อเตรียมปิดได้ถ้าไม่เห็นว่าจะไปได้ไกลกว่านี้อ่ะครับ พอจะมีหนทางดีๆไหมครับ
//Close existing opening order
for (int l_pos_24 = 0; l_pos_24 < OrdersTotal(); l_pos_24++) {
closeOrder_1(l_pos_24);
}
for (int l_pos_28 = 0; l_pos_28 < OrdersTotal(); l_pos_28++) {
closeOrder_2(l_pos_28);
}
if (Ask < iOpen(Symbol(), PERIOD_M5, 0) - price_diff_01) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 0) + price_diff_01) return;
if (Ask < iOpen(Symbol(), PERIOD_M5, 1) - price_diff_02) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 1) + price_diff_02) return;
if (Ask < iOpen(Symbol(), PERIOD_M5, 2) - price_diff_03) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 2) + price_diff_03) return;
if (Ask - Bid > Spread * point_decimal) return (0);
half_maxtrade_int = NormalizeDouble(MaxTrades / 2, 0);
lot_min = MarketInfo(Symbol(), MODE_MINLOT);
lot_max = MarketInfo(Symbol(), MODE_MAXLOT);
leverage = AccountLeverage();
lot_size_price = MarketInfo(Symbol(), MODE_LOTSIZE);
open_lot_1 = MathMin(lot_max, MathMax(lot_min, Lots));
if (LotsOptimized && Risk > 0.0 && AccountFreeMargin() > Ask * open_lot_1 * lot_size_price / leverage){
open_lot_1 = NormalizeDouble(AccountFreeMargin() * Risk / lot_size_price, LotDecimal);
}else{
open_lot_1 = lot_min;
}
open_lot_1 = MathMax(lot_min, MathMin(lot_max, NormalizeDouble(open_lot_1 / lot_min, 0) * lot_min));
open_lot_1 = NormalizeDouble(open_lot_1 / half_maxtrade_int, LotDecimal);
if (open_lot_1 > LotLimit) open_lot_1 = LotLimit;
open_lot_1=MathMax(open_lot_1,lot_min);//Added by siwach;
if (AccountFreeMargin() < Ask * open_lot_1 * lot_size_price / leverage) {
Print("Low Account Balance. Lots = ", open_lot_1, " , Free Margin = ", AccountFreeMargin());
Comment("Low Account Balance. Lots = ", open_lot_1, " , Free Margin = ", AccountFreeMargin());
return;
}
double l_irsi_64 = iRSI(NULL, PERIOD_M15, 6, PRICE_CLOSE, 0);
double l_irsi_72 = iRSI(NULL, PERIOD_M1, 20, PRICE_CLOSE, 0);
double iMA_01 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 1), 4);
double iMA_02 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 1), 4);
double iMA_03 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 2), 4);
double iMA_04 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 2), 4);
double l_icci_96 = iCCI(Symbol(), PERIOD_M15, 14, PRICE_CLOSE, 0);
double l_icci_104 = iCCI(Symbol(), PERIOD_M5, 42, PRICE_CLOSE, 0);
double l_icci_112 = iCCI(Symbol(), PERIOD_M1, 210, PRICE_CLOSE, 0);
double l_icci_120 = iCCI(Symbol(), PERIOD_M1, 80, PRICE_CLOSE, 0);
double l_imomentum_136 = iMomentum(Symbol(), PERIOD_M5, 4, PRICE_CLOSE, 0);
double l_iwpr_160 = iWPR(Symbol(), PERIOD_M5, 14, 0);
double l_ibands_184 = iBands(Symbol(), PERIOD_M5, 20, 2, 0, PRICE_WEIGHTED, MODE_UPPER, 1);
double l_ibands_200 = iBands(Symbol(), PERIOD_M5, 20, 2, 0, PRICE_WEIGHTED, MODE_LOWER, 1);
double l_ima_208 = iMA(Symbol(), PERIOD_M5, 1, 0, MODE_EMA, PRICE_HIGH, 0);
double l_ima_224 = iMA(Symbol(), PERIOD_M5, 1, 0, MODE_EMA, PRICE_LOW, 0);
if (IsTradeTime() && order_count < MaxTrades && price_betw_fractal_lo_up) {
if (!ExistPosition1()){
if (l_irsi_64 < 30.0 || l_irsi_72 < 36.0 && iMA_01 >= Ask + 20.0 * point_decimal) {
if (allow_buy_1) {
target_price_1 = 0;
stop_loss_price_1 = Ask - stop_loss_point_1 * point_decimal;
if (NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal) < LotLimit){
open_lot_2 = NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal);
}else{
open_lot_2 = open_lot_1;
}
open_lot_2=MathMax(lot_min,open_lot_2); //Added by siwach
OrderSend(Symbol(), OP_BUY, open_lot_2, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_1, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#1-1#", Blue);
allow_buy_1 = FALSE;
allow_sell_1 = TRUE;
}
}
if (l_irsi_64 > 70.0 || l_irsi_72 > 64.0 && iMA_02 <= Bid - 20.0 * point_decimal) {
if (allow_sell_1) {
target_price_1 = 0;
stop_loss_price_1 = Bid + stop_loss_point_1 * point_decimal;
if (NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal) < LotLimit){
open_lot_2 = NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal);
}else{
open_lot_2 = open_lot_1;
}
open_lot_2=MathMax(lot_min,open_lot_2); //Added by siwach
OrderSend(Symbol(), OP_SELL, open_lot_2, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_1, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#1-2#", Blue);
allow_sell_1 = FALSE;
allow_buy_1 = TRUE;
}
}
if (l_irsi_64 > 40.0 && l_irsi_64 < 60.0) {
allow_sell_1 = TRUE;
allow_buy_1 = TRUE;
}
}
}
if (IsTradeTime() && Fractals_M15_up_lo_diff_point < stop_loss_point_2 && ATR_M15_4_0_point < atr_value && order_count < MaxTrades && price_betw_fractal_lo_up) {
if (!ExistPosition2()){
if (l_icci_104 <= -150.0 && l_icci_112 <= -120.0 || l_icci_96 <= -150.0 && l_icci_112 <= -120.0 && Bid <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_2) {
target_price_1 = Fractals_M15_upper;
stop_loss_price_1 = Ask - stop_loss_point_1 * point_decimal;
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_2, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#2-1#", Blue);
allow_buy_2 = FALSE;
allow_sell_2 = TRUE;
}
}
if (l_icci_104 >= 150.0 && l_icci_112 >= 120.0 || l_icci_96 >= 150.0 && l_icci_112 >= 120.0 && Ask >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_2) {
target_price_1 = Fractals_M15_lower;
stop_loss_price_1 = Bid + stop_loss_point_1 * point_decimal;
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_2, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#2-2#", Blue);
allow_sell_2 = FALSE;
allow_buy_2 = TRUE;
}
}
if (l_icci_96 < 50.0 && l_icci_96 > -50.0) {
allow_sell_2 = TRUE;
allow_buy_2 = TRUE;
}
}
if (!ExistPosition3()){
if (l_imomentum_136 >= 99.85 && l_icci_120 <= -200.0 && Bid <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_3) {
target_price_1 = Fractals_M15_upper;
stop_loss_price_1 = Fractals_M15_lower - stop_loss_point_1 * point_decimal;
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#3-1#", Blue);
allow_buy_3 = FALSE;
allow_sell_3 = TRUE;
}
}
if (l_imomentum_136 <= 100.15 && l_icci_120 >= 200.0 && Ask >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_3) {
target_price_1 = Fractals_M15_lower;
stop_loss_price_1 = Fractals_M15_upper + stop_loss_point_1 * point_decimal;
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#3-2#", Blue);
allow_sell_3 = FALSE;
allow_buy_3 = TRUE;
}
}
if (l_icci_120 >= -50.0 && l_icci_120 <= 50.0) {
allow_sell_3 = TRUE;
allow_buy_3 = TRUE;
}
}
if (!ExistPosition4()) {
if (l_iwpr_160 <= -90.0 && l_ima_224 < l_ibands_200 && Ask <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_4) {
target_price_1 = Fractals_M15_upper;
stop_loss_price_1 = Ask - stop_loss_point_2 * point_decimal;
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_4, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#4-1#", Blue);
allow_buy_4 = FALSE;
allow_sell_4 = TRUE;
}
}
if (l_iwpr_160 >= -10.0 && l_ima_208 > l_ibands_184 && Bid >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_4) {
target_price_1 = Fractals_M15_lower;
stop_loss_price_1 = Bid + stop_loss_point_2 * point_decimal;
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#4-2#", Blue);
allow_sell_4 = FALSE;
allow_buy_4 = TRUE;
}
}
if (l_irsi_64 < 60.0 && l_irsi_64 > 40.0) {
allow_sell_4 = TRUE;
allow_buy_4 = TRUE;
}
}
}
return (0);
-
คำสั่งปิด Order คือ Orderclose ครับ ค้นหา Orderclose ครับก็จะเจอส่วนปิด order ครับ
-
เจอปัญหาครับ
order sell 0.01 EURCHF. opening at 1.5146 sl: 1.5178 tp: 1.5139 failed [Invalid S/L or T/P]
อันนี้มันกำหนด T/P ต่ำไป (ต่ำกว่า 10 จุด) มันเลยฟ้องInvalid S/L or T/P
มีวิธีเขียนคำสั่งที่กำหนด T/P ให้ขั้นต่ำต้อง 10 ช่องเสมอไหมครับ
-
แถวๆ นี้หรือเปล่าครับ ชุดคำสั่งปิด position? ผมยังอ่านแล้วไม่เข้าใจว่ามันคำนวนกับอะไรบ้างครับ
แต่อยากทดลองเพิ่มคำสั่งว่า ถ้าบวก 4 แล้วให้คำนวนกับเงื่อนไขอื่นๆเพื่อเตรียมปิดได้ถ้าไม่เห็นว่าจะไปได้ไกลกว่านี้อ่ะครับ พอจะมีหนทางดีๆไหมครับ
//Close existing opening order
for (int l_pos_24 = 0; l_pos_24 < OrdersTotal(); l_pos_24++) {
closeOrder_1(l_pos_24);
}
for (int l_pos_28 = 0; l_pos_28 < OrdersTotal(); l_pos_28++) {
closeOrder_2(l_pos_28);
}
if (Ask < iOpen(Symbol(), PERIOD_M5, 0) - price_diff_01) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 0) + price_diff_01) return;
if (Ask < iOpen(Symbol(), PERIOD_M5, 1) - price_diff_02) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 1) + price_diff_02) return;
if (Ask < iOpen(Symbol(), PERIOD_M5, 2) - price_diff_03) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 2) + price_diff_03) return;
if (Ask - Bid > Spread * point_decimal) return (0);
half_maxtrade_int = NormalizeDouble(MaxTrades / 2, 0);
lot_min = MarketInfo(Symbol(), MODE_MINLOT);
lot_max = MarketInfo(Symbol(), MODE_MAXLOT);
leverage = AccountLeverage();
lot_size_price = MarketInfo(Symbol(), MODE_LOTSIZE);
open_lot_1 = MathMin(lot_max, MathMax(lot_min, Lots));
if (LotsOptimized && Risk > 0.0 && AccountFreeMargin() > Ask * open_lot_1 * lot_size_price / leverage){
open_lot_1 = NormalizeDouble(AccountFreeMargin() * Risk / lot_size_price, LotDecimal);
}else{
open_lot_1 = lot_min;
}
open_lot_1 = MathMax(lot_min, MathMin(lot_max, NormalizeDouble(open_lot_1 / lot_min, 0) * lot_min));
open_lot_1 = NormalizeDouble(open_lot_1 / half_maxtrade_int, LotDecimal);
if (open_lot_1 > LotLimit) open_lot_1 = LotLimit;
open_lot_1=MathMax(open_lot_1,lot_min);//Added by siwach;
if (AccountFreeMargin() < Ask * open_lot_1 * lot_size_price / leverage) {
Print("Low Account Balance. Lots = ", open_lot_1, " , Free Margin = ", AccountFreeMargin());
Comment("Low Account Balance. Lots = ", open_lot_1, " , Free Margin = ", AccountFreeMargin());
return;
}
double l_irsi_64 = iRSI(NULL, PERIOD_M15, 6, PRICE_CLOSE, 0);
double l_irsi_72 = iRSI(NULL, PERIOD_M1, 20, PRICE_CLOSE, 0);
double iMA_01 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 1), 4);
double iMA_02 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 1), 4);
double iMA_03 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 2), 4);
double iMA_04 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 2), 4);
double l_icci_96 = iCCI(Symbol(), PERIOD_M15, 14, PRICE_CLOSE, 0);
double l_icci_104 = iCCI(Symbol(), PERIOD_M5, 42, PRICE_CLOSE, 0);
double l_icci_112 = iCCI(Symbol(), PERIOD_M1, 210, PRICE_CLOSE, 0);
double l_icci_120 = iCCI(Symbol(), PERIOD_M1, 80, PRICE_CLOSE, 0);
double l_imomentum_136 = iMomentum(Symbol(), PERIOD_M5, 4, PRICE_CLOSE, 0);
double l_iwpr_160 = iWPR(Symbol(), PERIOD_M5, 14, 0);
double l_ibands_184 = iBands(Symbol(), PERIOD_M5, 20, 2, 0, PRICE_WEIGHTED, MODE_UPPER, 1);
double l_ibands_200 = iBands(Symbol(), PERIOD_M5, 20, 2, 0, PRICE_WEIGHTED, MODE_LOWER, 1);
double l_ima_208 = iMA(Symbol(), PERIOD_M5, 1, 0, MODE_EMA, PRICE_HIGH, 0);
double l_ima_224 = iMA(Symbol(), PERIOD_M5, 1, 0, MODE_EMA, PRICE_LOW, 0);
if (IsTradeTime() && order_count < MaxTrades && price_betw_fractal_lo_up) {
if (!ExistPosition1()){
if (l_irsi_64 < 30.0 || l_irsi_72 < 36.0 && iMA_01 >= Ask + 20.0 * point_decimal) {
if (allow_buy_1) {
target_price_1 = 0;
stop_loss_price_1 = Ask - stop_loss_point_1 * point_decimal;
if (NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal) < LotLimit){
open_lot_2 = NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal);
}else{
open_lot_2 = open_lot_1;
}
open_lot_2=MathMax(lot_min,open_lot_2); //Added by siwach
OrderSend(Symbol(), OP_BUY, open_lot_2, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_1, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#1-1#", Blue);
allow_buy_1 = FALSE;
allow_sell_1 = TRUE;
}
}
if (l_irsi_64 > 70.0 || l_irsi_72 > 64.0 && iMA_02 <= Bid - 20.0 * point_decimal) {
if (allow_sell_1) {
target_price_1 = 0;
stop_loss_price_1 = Bid + stop_loss_point_1 * point_decimal;
if (NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal) < LotLimit){
open_lot_2 = NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal);
}else{
open_lot_2 = open_lot_1;
}
open_lot_2=MathMax(lot_min,open_lot_2); //Added by siwach
OrderSend(Symbol(), OP_SELL, open_lot_2, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_1, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#1-2#", Blue);
allow_sell_1 = FALSE;
allow_buy_1 = TRUE;
}
}
if (l_irsi_64 > 40.0 && l_irsi_64 < 60.0) {
allow_sell_1 = TRUE;
allow_buy_1 = TRUE;
}
}
}
if (IsTradeTime() && Fractals_M15_up_lo_diff_point < stop_loss_point_2 && ATR_M15_4_0_point < atr_value && order_count < MaxTrades && price_betw_fractal_lo_up) {
if (!ExistPosition2()){
if (l_icci_104 <= -150.0 && l_icci_112 <= -120.0 || l_icci_96 <= -150.0 && l_icci_112 <= -120.0 && Bid <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_2) {
target_price_1 = Fractals_M15_upper;
stop_loss_price_1 = Ask - stop_loss_point_1 * point_decimal;
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_2, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#2-1#", Blue);
allow_buy_2 = FALSE;
allow_sell_2 = TRUE;
}
}
if (l_icci_104 >= 150.0 && l_icci_112 >= 120.0 || l_icci_96 >= 150.0 && l_icci_112 >= 120.0 && Ask >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_2) {
target_price_1 = Fractals_M15_lower;
stop_loss_price_1 = Bid + stop_loss_point_1 * point_decimal;
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_2, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#2-2#", Blue);
allow_sell_2 = FALSE;
allow_buy_2 = TRUE;
}
}
if (l_icci_96 < 50.0 && l_icci_96 > -50.0) {
allow_sell_2 = TRUE;
allow_buy_2 = TRUE;
}
}
if (!ExistPosition3()){
if (l_imomentum_136 >= 99.85 && l_icci_120 <= -200.0 && Bid <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_3) {
target_price_1 = Fractals_M15_upper;
stop_loss_price_1 = Fractals_M15_lower - stop_loss_point_1 * point_decimal;
if ((Ask-stop_loss_price_1)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point){ //Added by siwach
stop_loss_price_1=Ask-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
Alert("Calculated stop loss was less than minimum allowable stop loss,mininum allowable stop loss will be used");
}
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#3-1#", Blue);
allow_buy_3 = FALSE;
allow_sell_3 = TRUE;
}
}
if (l_imomentum_136 <= 100.15 && l_icci_120 >= 200.0 && Ask >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_3) {
target_price_1 = Fractals_M15_lower;
stop_loss_price_1 = Fractals_M15_upper + stop_loss_point_1 * point_decimal;
if ((stop_loss_price_1-Bid)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point){ //Added by siwach
Alert("Calculated stop loss was less than minimum allowable stop loss,mininum allowable stop loss will be used");
stop_loss_price_1=Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
}
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#3-2#", Blue);
allow_sell_3 = FALSE;
allow_buy_3 = TRUE;
}
}
if (l_icci_120 >= -50.0 && l_icci_120 <= 50.0) {
allow_sell_3 = TRUE;
allow_buy_3 = TRUE;
}
}
if (!ExistPosition4()) {
if (l_iwpr_160 <= -90.0 && l_ima_224 < l_ibands_200 && Ask <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_4) {
target_price_1 = Fractals_M15_upper;
stop_loss_price_1 = Ask - stop_loss_point_2 * point_decimal;
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_4, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#4-1#", Blue);
allow_buy_4 = FALSE;
allow_sell_4 = TRUE;
}
}
if (l_iwpr_160 >= -10.0 && l_ima_208 > l_ibands_184 && Bid >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_4) {
target_price_1 = Fractals_M15_lower;
stop_loss_price_1 = Bid + stop_loss_point_2 * point_decimal;
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#4-2#", Blue);
allow_sell_4 = FALSE;
allow_buy_4 = TRUE;
}
}
if (l_irsi_64 < 60.0 && l_irsi_64 > 40.0) {
allow_sell_4 = TRUE;
allow_buy_4 = TRUE;
}
}
}
return (0);
จะมีจุด open ที่มีโอกาสที่ stop loss จะน้อยเกินไป ให้เพิ่ม code ตามที่ผม mark น่าจะช่วยได้ คือ ถ้า stop loss น้อยเกินไป ให้ใช้ค่าต่ำสุดที่อนุญาตครับ
-
ขอบคุณมากครับ ไวจริงๆ
แต่ตอนนี้รู้สึกปัญหาจะไปอยู่ที่ T/P แทนซะแล้วครับ
order sell 0.01 EURCHF. opening at 1.5146 sl: 1.5178 tp: 1.5139 failed [Invalid S/L or T/P]
อันนี้มันกำหนด T/P ต่ำไป (ต่ำกว่า 10 จุด) มันเลยฟ้องInvalid S/L or T/P
มีวิธีเขียนคำสั่งที่กำหนด T/P ให้ขั้นต่ำต้อง 10 ช่องเสมอไหมครับ
โอย งง พอย้อนกลับไปดู order ที่ผ่านๆมาก็เห็นมันรับorderที่ T/P แค่ 9 ช่องก็มี
ทำไมเป็นงั้น (ใช้ของ FXOpen ซึ่งปกติจะบังคับ T/P 10 ช่องจากราคา)
-
แถวๆ นี้หรือเปล่าครับ ชุดคำสั่งปิด position? ผมยังอ่านแล้วไม่เข้าใจว่ามันคำนวนกับอะไรบ้างครับ
แต่อยากทดลองเพิ่มคำสั่งว่า ถ้าบวก 4 แล้วให้คำนวนกับเงื่อนไขอื่นๆเพื่อเตรียมปิดได้ถ้าไม่เห็นว่าจะไปได้ไกลกว่านี้อ่ะครับ พอจะมีหนทางดีๆไหมครับ
//Close existing opening order
for (int l_pos_24 = 0; l_pos_24 < OrdersTotal(); l_pos_24++) {
closeOrder_1(l_pos_24);
}
for (int l_pos_28 = 0; l_pos_28 < OrdersTotal(); l_pos_28++) {
closeOrder_2(l_pos_28);
}
if (Ask < iOpen(Symbol(), PERIOD_M5, 0) - price_diff_01) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 0) + price_diff_01) return;
if (Ask < iOpen(Symbol(), PERIOD_M5, 1) - price_diff_02) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 1) + price_diff_02) return;
if (Ask < iOpen(Symbol(), PERIOD_M5, 2) - price_diff_03) return;
if (Bid > iOpen(Symbol(), PERIOD_M5, 2) + price_diff_03) return;
if (Ask - Bid > Spread * point_decimal) return (0);
half_maxtrade_int = NormalizeDouble(MaxTrades / 2, 0);
lot_min = MarketInfo(Symbol(), MODE_MINLOT);
lot_max = MarketInfo(Symbol(), MODE_MAXLOT);
leverage = AccountLeverage();
lot_size_price = MarketInfo(Symbol(), MODE_LOTSIZE);
open_lot_1 = MathMin(lot_max, MathMax(lot_min, Lots));
if (LotsOptimized && Risk > 0.0 && AccountFreeMargin() > Ask * open_lot_1 * lot_size_price / leverage){
open_lot_1 = NormalizeDouble(AccountFreeMargin() * Risk / lot_size_price, LotDecimal);
}else{
open_lot_1 = lot_min;
}
open_lot_1 = MathMax(lot_min, MathMin(lot_max, NormalizeDouble(open_lot_1 / lot_min, 0) * lot_min));
open_lot_1 = NormalizeDouble(open_lot_1 / half_maxtrade_int, LotDecimal);
if (open_lot_1 > LotLimit) open_lot_1 = LotLimit;
open_lot_1=MathMax(open_lot_1,lot_min);//Added by siwach;
if (AccountFreeMargin() < Ask * open_lot_1 * lot_size_price / leverage) {
Print("Low Account Balance. Lots = ", open_lot_1, " , Free Margin = ", AccountFreeMargin());
Comment("Low Account Balance. Lots = ", open_lot_1, " , Free Margin = ", AccountFreeMargin());
return;
}
double l_irsi_64 = iRSI(NULL, PERIOD_M15, 6, PRICE_CLOSE, 0);
double l_irsi_72 = iRSI(NULL, PERIOD_M1, 20, PRICE_CLOSE, 0);
double iMA_01 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 1), 4);
double iMA_02 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 1), 4);
double iMA_03 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 2), 4);
double iMA_04 = NormalizeDouble(iMA(NULL, 0, 8, 0, MODE_SMA, PRICE_WEIGHTED, 2), 4);
double l_icci_96 = iCCI(Symbol(), PERIOD_M15, 14, PRICE_CLOSE, 0);
double l_icci_104 = iCCI(Symbol(), PERIOD_M5, 42, PRICE_CLOSE, 0);
double l_icci_112 = iCCI(Symbol(), PERIOD_M1, 210, PRICE_CLOSE, 0);
double l_icci_120 = iCCI(Symbol(), PERIOD_M1, 80, PRICE_CLOSE, 0);
double l_imomentum_136 = iMomentum(Symbol(), PERIOD_M5, 4, PRICE_CLOSE, 0);
double l_iwpr_160 = iWPR(Symbol(), PERIOD_M5, 14, 0);
double l_ibands_184 = iBands(Symbol(), PERIOD_M5, 20, 2, 0, PRICE_WEIGHTED, MODE_UPPER, 1);
double l_ibands_200 = iBands(Symbol(), PERIOD_M5, 20, 2, 0, PRICE_WEIGHTED, MODE_LOWER, 1);
double l_ima_208 = iMA(Symbol(), PERIOD_M5, 1, 0, MODE_EMA, PRICE_HIGH, 0);
double l_ima_224 = iMA(Symbol(), PERIOD_M5, 1, 0, MODE_EMA, PRICE_LOW, 0);
if (IsTradeTime() && order_count < MaxTrades && price_betw_fractal_lo_up) {
if (!ExistPosition1()){
if (l_irsi_64 < 30.0 || l_irsi_72 < 36.0 && iMA_01 >= Ask + 20.0 * point_decimal) {
if (allow_buy_1) {
target_price_1 = 0;
stop_loss_price_1 = Ask - stop_loss_point_1 * point_decimal;
if (NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal) < LotLimit){
open_lot_2 = NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal);
}else{
open_lot_2 = open_lot_1;
}
open_lot_2=MathMax(lot_min,open_lot_2); //Added by siwach
OrderSend(Symbol(), OP_BUY, open_lot_2, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_1, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#1-1#", Blue);
allow_buy_1 = FALSE;
allow_sell_1 = TRUE;
}
}
if (l_irsi_64 > 70.0 || l_irsi_72 > 64.0 && iMA_02 <= Bid - 20.0 * point_decimal) {
if (allow_sell_1) {
target_price_1 = 0;
stop_loss_price_1 = Bid + stop_loss_point_1 * point_decimal;
if (NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal) < LotLimit){
open_lot_2 = NormalizeDouble(open_lot_1 + open_lot_1 / half_maxtrade_int, LotDecimal);
}else{
open_lot_2 = open_lot_1;
}
open_lot_2=MathMax(lot_min,open_lot_2); //Added by siwach
OrderSend(Symbol(), OP_SELL, open_lot_2, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_1, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#1-2#", Blue);
allow_sell_1 = FALSE;
allow_buy_1 = TRUE;
}
}
if (l_irsi_64 > 40.0 && l_irsi_64 < 60.0) {
allow_sell_1 = TRUE;
allow_buy_1 = TRUE;
}
}
}
if (IsTradeTime() && Fractals_M15_up_lo_diff_point < stop_loss_point_2 && ATR_M15_4_0_point < atr_value && order_count < MaxTrades && price_betw_fractal_lo_up) {
if (!ExistPosition2()){
if (l_icci_104 <= -150.0 && l_icci_112 <= -120.0 || l_icci_96 <= -150.0 && l_icci_112 <= -120.0 && Bid <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_2) {
target_price_1 = Fractals_M15_upper;
if ((target_price_1-Ask)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)target_price_1=Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
stop_loss_price_1 = Ask - stop_loss_point_1 * point_decimal;
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_2, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#2-1#", Blue);
allow_buy_2 = FALSE;
allow_sell_2 = TRUE;
}
}
if (l_icci_104 >= 150.0 && l_icci_112 >= 120.0 || l_icci_96 >= 150.0 && l_icci_112 >= 120.0 && Ask >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_2) {
target_price_1 = Fractals_M15_lower;
if ((Bid-target_price_1)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)target_price_1=Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
stop_loss_price_1 = Bid + stop_loss_point_1 * point_decimal;
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_2, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#2-2#", Blue);
allow_sell_2 = FALSE;
allow_buy_2 = TRUE;
}
}
if (l_icci_96 < 50.0 && l_icci_96 > -50.0) {
allow_sell_2 = TRUE;
allow_buy_2 = TRUE;
}
}
if (!ExistPosition3()){
if (l_imomentum_136 >= 99.85 && l_icci_120 <= -200.0 && Bid <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_3) {
target_price_1 = Fractals_M15_upper;
if ((target_price_1-Ask)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)target_price_1=Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
stop_loss_price_1 = Fractals_M15_lower - stop_loss_point_1 * point_decimal;
if ((Ask-stop_loss_price_1)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point){ //Added by siwach
stop_loss_price_1=Ask-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
Alert("Calculated stop loss was less than minimum allowable stop loss,mininum allowable stop loss will be used");
}
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#3-1#", Blue);
allow_buy_3 = FALSE;
allow_sell_3 = TRUE;
}
}
if (l_imomentum_136 <= 100.15 && l_icci_120 >= 200.0 && Ask >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_3) {
target_price_1 = Fractals_M15_lower;
if ((Bid-target_price_1)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)target_price_1=Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
stop_loss_price_1 = Fractals_M15_upper + stop_loss_point_1 * point_decimal;
if ((stop_loss_price_1-Bid)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point){ //Added by siwach
Alert("Calculated stop loss was less than minimum allowable stop loss,mininum allowable stop loss will be used");
stop_loss_price_1=Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
}
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#3-2#", Blue);
allow_sell_3 = FALSE;
allow_buy_3 = TRUE;
}
}
if (l_icci_120 >= -50.0 && l_icci_120 <= 50.0) {
allow_sell_3 = TRUE;
allow_buy_3 = TRUE;
}
}
if (!ExistPosition4()) {
if (l_iwpr_160 <= -90.0 && l_ima_224 < l_ibands_200 && Ask <= Fractals_M15_center - fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_buy_4) {
target_price_1 = Fractals_M15_upper;
if ((target_price_1-Ask)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)target_price_1=Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
stop_loss_price_1 = Ask - stop_loss_point_2 * point_decimal;
OrderSend(Symbol(), OP_BUY, open_lot_1, Ask, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_4, 0, Green);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Ask, "#4-1#", Blue);
allow_buy_4 = FALSE;
allow_sell_4 = TRUE;
}
}
if (l_iwpr_160 >= -10.0 && l_ima_208 > l_ibands_184 && Bid >= Fractals_M15_center + fractal_target_point * point_decimal) {
if (0 < half_maxtrade_int && allow_sell_4) {
target_price_1 = Fractals_M15_lower;
if ((Bid-target_price_1)<MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)target_price_1=Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
stop_loss_price_1 = Bid + stop_loss_point_2 * point_decimal;
OrderSend(Symbol(), OP_SELL, open_lot_1, Bid, Slippage, stop_loss_price_1, target_price_1, "Dragonpips", magic_no_3, 0, Red);
drawMatchPoint(TimeToStr(Time[0],TIME_DATE)+TimeToStr(Time[0],TIME_MINUTES), Time[0], Bid, "#4-2#", Blue);
allow_sell_4 = FALSE;
allow_buy_4 = TRUE;
}
}
if (l_irsi_64 < 60.0 && l_irsi_64 > 40.0) {
allow_sell_4 = TRUE;
allow_buy_4 = TRUE;
}
}
}
return (0);
จะมีจุด open ที่มีโอกาสที่ stop loss จะน้อยเกินไป ให้เพิ่ม code ตามที่ผม mark น่าจะช่วยได้ คือ ถ้า stop loss น้อยเกินไป ให้ใช้ค่าต่ำสุดที่อนุญาตครับ
เพิ่มเติมครับ ส่วนของ target price แก้ไขตามที่ mark น้ำเงินครับ ผมเปลี่ยนให้ดูแค่จุดเดียวเหลืออีก 2 จุด buy 2 จุด sell ต้องแก้นะครับ สำหรับจุดที่ target price เป็น 0 ไม่ต้องเพิ่มบรรทัดนี้นะครับ (แก้ไขเพิ่มคูณ point) ลองดูนะครับยังไม่ได้ test
แก้ไข : ใส่เพิ่มให้ครบเลยแล้วกัน
-
ผมเปลี่ยนให้ดูแค่จุดเดียวเหลืออีก 2 จุด buy 2 จุด sell ต้องแก้นะครับ สำหรับจุดที่ target price เป็น 0 ไม่ต้องเพิ่มบรรทัดนี้นะครับ (แก้ไขเพิ่มคูณ point)
อ่านแล้วกลับไปเปิดโค้ดดูแต่ไม่เข้าใจ
ไม่กล้าไปแตะเลยครับ เพราะผมยังไม่เข้าใจระบบโค้ดของมัน
กลัวไปใส่แล้วทำมันพัง ขอโทษด้วยครับเห็นทีต้องรบกวนทำให้แล้วครับ ;D
-
ผมเปลี่ยนให้ดูแค่จุดเดียวเหลืออีก 2 จุด buy 2 จุด sell ต้องแก้นะครับ สำหรับจุดที่ target price เป็น 0 ไม่ต้องเพิ่มบรรทัดนี้นะครับ (แก้ไขเพิ่มคูณ point)
อ่านแล้วกลับไปเปิดโค้ดดูแต่ไม่เข้าใจ
ไม่กล้าไปแตะเลยครับ เพราะผมยังไม่เข้าใจระบบโค้ดของมัน
กลัวไปใส่แล้วทำมันพัง ขอโทษด้วยครับเห็นทีต้องรบกวนทำให้แล้วครับ ;D
เพิ่มให้ครบแล้วครับ กลับไปดูเลย
-
โอ้ว อยากจะบอกว่ามันยอดมากเลยฮะ Error ลดจำนวนไปเยอะเลย (แต่ก็ยังไม่หมด :P)
อย่างไรก็ตามมันก็ทำให้ระบบทดสอบสามารถทำงานได้ดีขึ้นมาก
ขอขอบคุณจริงๆครับ ขออวยพรให้มีความสุขกันมากๆครับ
ความเสียสละของทุกคนทำให้ผมสนใจการเขียนและพัฒนาEAมากขึ้นๆ _/|\_
-
เยี่ยมเลย 55+ ผมต้องศึกษาบ้างละ
-
ขอตัวที่แก้แล้ว ได้ป่าวครับ จะเอาไปลองดู ;D
-
เป็นตัวที่แนบไว้ข้างต้นหรือเปล่าครับ ;D
-
เป็นตัวที่แนบไว้ข้างต้นหรือเปล่าครับ ;D
ตัวที่อยู่ในหน้าแรกเป็นตัวที่คุณ Baure แปลงโค้ดจากต้นฉบับมา
ส่วนตัวที่ดัดแปลงต่อจากนั้นได้ข่าวว่ายังคงปรับเปลี่ยนไปเรื่อยๆครับ
เอาเจ้า dragonpips ที่ผมได้แกะ และตัด code ส่วนเกินจริงๆ ออกไป ละปรับเปลี่ยนชื่อตัวแปร รวมทั้งปรับเปลี่ยน code นิดหน่อยให้ดูง่าย มาให้เพื่อนๆ ที่สนใจเอาไปศึกษาครับ ก่อนผมจะเอาไปทำอะไรต่ออีกหลายอย่างจนเละ(ล้อเล่น)
-
Version คุณ Bauer เปิด OpenChart แล้วเห็น indicatorด้วย เลยขอหยิบมาคุยหน่อย
เงื่อนไขการเทรดสมบูรณ์ที่ #4 บ่อยมาก
ตามมาด้วย #2 ส่วน #3 นานๆทีจะโผล่
แต่เงื่อนไข #1 นี่สิ เหมือนแทบจะไม่เคยโผล่มาให้เห็นเลย
ผมลองเอาไปเปิดกับกราฟจริง มันมีเทรดเกินครั้งจากที่เราตั้งไว้ด้วย
เช่นตั้งไว้ 5 ครั้ง แต่บางทีกลับมีเทรดครั้งที่ 6 (ตัว original ก็เป็น)
-
Version คุณ Bauer เปิด OpenChart แล้วเห็น indicatorด้วย เลยขอหยิบมาคุยหน่อย
เงื่อนไขการเทรดสมบูรณ์ที่ #4 บ่อยมาก
ตามมาด้วย #2 ส่วน #3 นานๆทีจะโผล่
แต่เงื่อนไข #1 นี่สิ เหมือนแทบจะไม่เคยโผล่มาให้เห็นเลย
ผมลองเอาไปเปิดกับกราฟจริง มันมีเทรดเกินครั้งจากที่เราตั้งไว้ด้วย
เช่นตั้งไว้ 5 ครั้ง แต่บางทีกลับมีเทรดครั้งที่ 6 (ตัว original ก็เป็น)
เหรอครับ เพิ่งทราบเหมือนกันครับว่ามีเปิดเกิน max ที่ตั้งไว้ด้วย
-
นานๆๆๆที จะเกิดขึ้นครับ แต่ตอนรันเทสไม่เจอเลย
หรืออาจจะเป็น human error ก็ได้(คือผมอาจดูและจำผิดเอง)
-
ช่วงนี้เข้ามาอ่านกระทู้เป็นส่วนใหญ่ครับ เรื่อง coding ต้องหยุดซักพักครับ รีบไปไล่งาน software ให้เสร็จ จะได้มาทำต่อ ไว้รวยเมื่อไหร่จะเลิกงานอื่นมาลุย forex อย่างเดียว;D(ก็ฝันกันไป) :P แต่ก็ยังเข้ามาโฉบๆ ตลอดล่ะครับ
-
ถึงอย่างไรก็ขอบคุณคุณ Bauer มากครับ
ผมจะลองพยายามโมฯเล่นดูด้วยครับ เผื่อจะได้เก่งๆขึ้นมาบ้าง
-
คำสั่ง iFractals เอาไว้ทำอะไรเหรอรับ
-
คำสั่ง iFractals เอาไว้ทำอะไรเหรอรับ
ถ้าเข้าใจไม่ผิด เป็นเรื่องค่า indicator ตัวหนึ่งของกราฟ 15 นาทีครับ (EA ตัวนี้ประมวลผลผ่านกราฟ 3 แบบคือ 1m 5m และ15m)
-
คำสั่ง iFractals เอาไว้ทำอะไรเหรอรับ
ถ้าเข้าใจไม่ผิด เป็นเรื่องค่า indicator ตัวหนึ่งของกราฟ 15 นาทีครับ (EA ตัวนี้ประมวลผลผ่านกราฟ 3 แบบคือ 1m 5m และ15m)
แล้วมัน Retern อะไรออกมาครับ
-
อยากให้ Roboforex 2015 ดูง่ายๆๆ บ้างครับ ใครพอจะทำให้ดูง่ายๆๆหน่อยครับ อยากเอามา แก้ การซื้อขาย งง ฟังก์ชั่นเยอะมาก