Sponsored Ads

แสดงบทความที่มีป้ายกำกับ Forex Expert advisor แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Forex Expert advisor แสดงบทความทั้งหมด

วันอังคารที่ 13 มิถุนายน พ.ศ. 2560

การใช้ Marketinfo กับการส่ง Order

ตัวอย่างการใช้ MatketInfo กับการส่ง Order 

ในบทความนี้เราจะเอาฟังชั่นทั้ง 2 ตัว เอามาเขียนประยุกต์ใช้ด้วยกัน 

โดยเราจะดึงราคา Bid และ Ask รวมถึงค่า Point เพื่อเอาไว้ใช้ในการเปิด Order นั่นเอง 

int start()
{
   double bid = MarketInfo(Symbol(),MODE_BID); 
   double ask = MarketInfo(Symbol(),MODE_ASK);
   double point = MarketInfo(Symbol(),MODE_POINT);
   double SL = MarketInfo(Symbol(),MODE_STOPLEVEL); 
   
   
   OrderSend(Symbol(),OP_BUY,0.01,ask,10,bid-SL*Point,bid+SL*Point); 
   Alert(GetLastError()); 
   
   return; 
   
}   

****  Code นี้ หากเราไปเขียนใน EA มันจะส่งคำสั่งทุกครั้งที่มีการเคลื่อนที่ของราคา ดังนั้นควรเขียนลงใน script น่าจะดีกว่าหากต้องการส่งคำสั่งครั้งเดียว 

มาอธิบายทีละบรรทัดกันครับ

   double bid = MarketInfo(Symbol(),MODE_BID); 

ดึงค่า Bid มาใส่ในตัวแปร bid   (  Ask ก็เหมือนกัน )

   double point = MarketInfo(Symbol(),MODE_POINT);

ดึงค่า Point มาเก็บไว้ในตัวแปร point 


  double SL = MarketInfo(Symbol(),MODE_STOPLEVEL); 

ดึงค่า Stop Level มาเก็บไว้ในตัวแปร SL  เนื่องจากในการส่งคำสั่ง TP หรือ Stop loss มันจะมีระยะต่ำที่สุดที่สามารถให้ใส่ค่าได้ ดังนั้นเราก็ดึงค่านั้นจาก MarketInFo มาใช้นั้นเอง 

   OrderSend(Symbol(),OP_BUY,0.01,ask,10,bid-SL*Point,bid+SL*Point); 


เป็นคำสั่งไว้ส่ง Order ครับ ก็ใส่ค่าตามตัวแปรที่ฟังช์่นต้องการ โดยเอาตัวแปรที่เราดึงค่ามาใส่ในฟังก์ชั่นนั้นเอง 


   Alert(GetLastError()); 


เป็นการแสดงผลค่า Error ที่เกิดขึ้น มันจะแสดงเป็นตัวเลข หากเกิดปัญหาอะไรก็สามารถเช็คได้ที่ 

https://book.mql4.com/appendix/errors


เพื่อนๆสามารถดูคำอธิบายเพิ่มเติมได้ที่ https://book.mql4.com/trading/ordersend 



คำสั่งไว้เช็ค AccountMargin

Account Margin

ในบทความนี้ผมจะมาแนะนำการใช้ฟังก์ชั่นเพื่อใช้ในการเช็คมาร์จิ้นกันครับ

หากเพื่อนๆต้องการที่จะรู้ว่า Free Margin ในพอร์ทมีอยู่เท่าไหร่าสามารถใช้ฟังก์ชั่น AccountFreeMargin () เพื่อดึงค่า Free Margin ออกมาแสดงผล หรือเอามาคำนวณความเสี่ยง หรือ Money management ได้

ตัวอย่างการเขียน

int start()

{
     double x = AccountFreeMargin();
   
     Alert("Account Free Margin =" , x );
   
     return;
   
   
}

หาเพื่อนๆ ต้องการหากต้องการเปิด Order Buy  1 lot จะเหลือมาร์จิ้นอยู่เท่าไหร่  ลองเขียนตามนี้

int start()

{
     double x = AccountFreeMarginCheck(Symbol(),OP_BUY,1);
   
     Alert("Account Free Margin =" , x );
   
     return;
   
   
}


หากต้องการรู้ว่ามาร์จิ้นเพืื่อใช้ Buy 1 Lot ใช้ไปเท่าไหร่สามารถนำเอา  Code ด้านบนมาประยุกต์ใช้ได้ครับ


int start()

{
     double x = AccountFreeMarginCheck(Symbol(),OP_BUY,1);
   
     double y = AccountFreeMargin();
   
     Alert("Account Free Margin =" , y-x );
   
     return;
   
   
}

เพื่อนๆสามารถดูตัวอย่างพร้อมคำอธิบายเพิ่มเติมได้ที่ https://book.mql4.com/trading/ordersend

นอกจากนี้ยังมีคำสั่ง Account ที่น่าสนใจเพิ่มเติมเผื่อใครสนใจไปอ่านเพิ่มได้ที่ https://docs.mql4.com/account

ฟังก์ชั่น MarketInfo เพื่อดึงข้อมูลจาก Broker

Function MarketInfo()


เราสามารถดึงข้อมูลต่างๆจาก Broker นำมาใช้ในการเขียน EA ได้ โดยใช้ฟังก์ชั่น MarketInfo()

เช่น  อยากรู้ Margin required , Stop Level , Lot step จะทำยังไง 

วันนี้ผมมาแนะนำฟังก์ชั่น MarketInfo() 

โดยเพื่อนๆ สามารถอ่านข้อมูลเพิ่มเติมได้ที่ 

https://book.mql4.com/trading/ordersend

ตัวฟังก์ชั่นเขียนดังนี้ 

double MarketInfo(string symbol, int type)

ค่าที่ส่งออกจาก MarketInfo จะเป็นค่าที่เป็นตัวเลขทศนิยม  ซึ่งต้องใส่ค่า 2 ตัวได้แก่ Symbol และ Type 

Symbol หมายถึง คู่สกุลเงินที่เราต้องการจะดูข้อมูล 

type หมายถึง ข้อมูลที่ต้องการจะได้ 

ตัวอย่าง 

หากเราต้องการดูมาร์จิ้น 1 lot ของ EURUSD ของ Broker ที่เราใช้อยู่ ให้เขียนคำสั่งดังนี้ 

int start()
{   
    double m ;
      m = MarketInfo("EURUSD",MODE_MARGINREQUIRED);
      Alert(m);
      return;
   
}


หากเราต้องการดูจำนวน Lot ที่ต่ำที่สุดของ "EURUSD" ให้เขียนดังนี้ 


int start()
{   
    double m ;
      m = MarketInfo("EURUSD",MODE_MINLOT);
      Alert(m);
      return;
   
}

เพื่อนๆสามารถลองทำตาม แล้วเปลี่ยน Type เพื่อใช้ดูข้อมูลอื่นๆได้อีกมากเลยครับ 

ซึ่งสามารถดูได้ตามลิงค์ด้านล่างนี้เลย 

https://book.mql4.com/appendix/marketinfo

Open Order

Opening and Placing Orders


การส่งคำสั่งเพื่อ Open Order หรือ Placing Order สามารถใช้ฟังก์ชั่น OrderSend() เพื่อใช้ในการส่งคำสั่ง

Function OrderSend()

int OrderSend(string symbol, int cmd, double volume , double price , int slippage , double stoploss , double takeprofit , string comment=NULL, int magic=0, datetime expiration=0,color arrow_color=CLR_NONE) 


อย่าเพิ่งตกใจกับฟังก์ชั่นทำไมมันเขียนยาวขนาดนี้ มาดูความหมายของมันก่อน 

OrderSend คือ ชื่อฟังก์ชั่นจะ return ค่ากลับมาเป็นเลข ticket ของ order หากส่ง Order ไม่ผ่าน มันจะ return ค่าเป็น -1 (ซึ่งเราสามารถใช้้ฟังก์ชั่น getLastError() ไว้เพื่อเช็คดุสาเหตุอีกที ไว้ตอนต่อไปเราจะอธิบายเพิ่มเติม) 

symbol คือ ชื่อสกุลเงินที่เราต้องการจะส่งไป ปกติเราจะใช่ฟังก์ชั่น Symbol() มากกว่าที่จะระบุสกุลเงินไปตรงๆ เพื่อให้ง่ายต่อการปรับเปลี่ยนนั่นเอง 

volume คือ ขนาดของ lot ที่เราต้องการจะส่ง Order ไป 

Price คือ ราคาที่เราต้่องการจะส่ง Order ไป อาจจะระบุเป็นตัวเลขตรงๆไปเลย หรือเลือกที่ Bid , Ask เป็นต้น 

Slippage คือ ค่าเบี่ยงเบนจากราคา open price สามารถยอมรับได้เท่าไหร่ เพื่อให้ได้ order  

stoploss คือ ราคาที่เราต้องการ stoploss 

takeprofit คือ ราคาที่เราต้องการ take profit 

comment คือ เราอยากหมายเหตุอะไรก็ใส่ไป 

magic คือ หมายเหตุที่เป็นเฉพาะตัวเลข 

expiration คือ ช่วงเวลาสิ้นสุดของการส่ง Order  จะใช้กับ pending order 

arrow _ color  คือ สีของลูกศร เมื่อมีการเปิด Order 


เมื่อเรารู้ว่าฟังก์ชั่นนี้ต้องการค่าอะไรแล้ว ทีนี้เรามาลองเขียน code ส่งคำสั่งกันครับ 




int start() 
   {
 OrderSend(Symbol(),OP_BUY,0.1,Ask,10,Bid-150*Point,Bid+150*Point,NULL,1234,0,"Green");
      Alert(GetLastError());
      return; 
   }



หากต้องการเลือกส่งรายการ GBPUSD  


int start() 
   {
 OrderSend(GBPUSD,OP_BUY,0.1,Ask,10,Bid-150*Point,Bid+150*Point,NULL,1234,0,"Green");
      Alert(GetLastError());
      return; 

   }




วันพฤหัสบดีที่ 15 ธันวาคม พ.ศ. 2559

ความสำคัญของการประกาศตัวแปร

Solution. Let us denote the number of John's pencils as variable A and the number of Pete's pencils as variable B, whereas the result will be denoted as C.

The answer will be: С = А + В

ตัวอย่าง 1.  หาผลรวมของดินสอของ John และ Peter

โดย ดินสอของ John แทนตัวแปร A
        ดินสอของ Pete แทนด้วยตัวแปน B
        ผลรวมของดินสอน แทนด้วยตัวแปร C

เขียนเป็นสมการ C = A+B

ลองเขียนเป็น Code อย่างง่าย

   double A = 2.0;                       // The number of John's pencils
   double B = 3.0;                       // The number of Pete's pencils
   double C = A + B;                     // total number 


ตัวอย่างที่ 2.หาผลต่างระหว่างดินสอของทั้งสองคน

   double A = 2.0;                       // The number of John's pencils
   double B = 3.0;                       // The number of Pete's pencils
   double C = B - A;                     // The difference between two real numbers


หากเราต้องการนำตัวแปรมา คูณ หรือหารกันก็สามารถทำได้ 


   double C = B * A;                     // Multiplication of two real numbers
   double C = B / A;                     // Division of two real numbers

ข้อควรระวังคือ เรื่องการประกาศชนิดตัวแปร หากเราประกาศชนิดตัวแปรผิด จะส่งผลให้คำตอบผิดพลาดได้ 

เช่น 
   int X = 2;                           // Integer
   int Y = 3;                           // Integer
   int Z = Y - X;                       // 3-2 = 1 
   int Z = Y * X;                       // 3*2=6
   int Z = Y / X;                       // 3/2 = 1 เนื่องจากประกาศชนิดตัวแปรเป็นจำนวนเต็ม

ตัวอย่าง ตัวแปรประเภท string  หรือตัวแปรตัวอักษร  ถ้านำมาบวกกัน จะได้ไหม ???

 string W1  = "Arctic";                       // String 1
 string W2  = "Hairdressing Saloon";          // String 2
 string Ans = W1 + W2;                        // Sum of strings

ผลลัพธ์  ArcticHairdressing Saloon 
** ตัวแปรอักษรถ้านำมาบวกกัน หมายถึง นำ ข้อความมาชนกันนั่นเอง 

แต่ถ้าเอามา ลบ คูณ หรือ หาร ล่ะ ???
 string Ans= W1 - W2;                        // Not allowed
 string Ans= W1 * W2;                        // Not allowed
 string Ans= W1 / W2;                        // Not allowed
*** ถ้าเอาตัวแปรตัวอักษรมาทำการ ลบ คูณ หรือ หาร จะเกิด Error นะครับ จะเอามาเขียนในโปรแกรมไม่ได้ 
สิ่งสำคัญที่ควรระวัง คือ เรื่องการประกาศชนิดตัวแปร เพราะมันส่งผลต่อคำตอบที่ต้องการคำนวณต่อไปครับ
ตัวอย่าง จงหาผลรวมของ ค่าต่อไปนี้
   double A = 2.0;                      // The number of John's pencils
   int    Y = 3;                        // The number of Pete's passages
   int    F = A + Y;                    // Total number
คำตอบ ค่า F = 2.0 + 3 = 5   ตัวแปร F จะเป็นค่าจำนวนเต็ม
ถ้าเปลี่ยนเป็นประกาศตัวแปร เป็น double 
   double A = 2.0;                   // The number of John's pencils
   int    Y = 3;                     // The number of Pete's passages
   double F = A + Y;                 // Total number
คำตอบค่า F = 2.0 +3 = 5.0 เพราะตัวแปร F มีชนิดตัวแปรเป็น double หรือจำนวนจริงนั่นเอง 

ถ้าเราเอาตัวแปร string มาบวกกับ ตัวแปรที่เป็นตัวเลขล่ะ 
  string W1  = "Arctic";             // String 1
   double A   = 2;                    // Number of John's pencils
   string Sum = W1 + A;               // Implied transformation to the right
คำตอบ Sum คือ Arctic2.00000000 เนื่องจาก ตัวแปร Sum เป็นตัวแปรอักษร จึงมองว่า A เป็นอักษร แต่ถ้าเปลี่ยนปะกาศตัวแปร Sum เป็น double 
   string W1 = "Arctic";               //String 1
   double A = 2;                       // Number of John's pencils
   double Sum = W1 + A;              
** โปรแกรมจะฟ้อง error นะครับ ควรระวัง เพราะตัวแปรอักษรนำมาคำนวณไม่ได้ 
นอกจากเรื่องชนิดตัวแปรที่เราควรจะระวังแล้ว เรื่องลำดับการคำนวณก็เป็นสิ่งสำคัญ ผมแนะนำให้ใส่วงเล็บให้ชัดเจนครับ 
เพื่อให้ลำดับขั้นการคำนวณถูกต้อง ตามคำตอบที่ต้องการ   

วันพุธที่ 14 ธันวาคม พ.ศ. 2559

Operations and Expression

ตัวดำเนินการในภาษา MQL4 เป็นสิ่งจำเป็นที่เราจะต้องเข้าใจก่อนการเขียนโปรแกรม 


Arithmetical Operations:   ตัวดำเนินการทางคณิตศาสตร์


Symbol
Operation
Example
Analog
+
Addition of values  เพิ่มค่า
x + 2
-
Subtraction of values or sign change ลบ
x - 3, y = - y
*
Multiplication of values คูณ
3 * x
/
Quotient of division หาร
x / 5
%
Residue of division หารเอาเศษ
minutes = time % 60
++
Addition of 1 to the value of the variable เพิ่มค่า +1
y++
y = y + 1
--
Subtraction of 1 from the value of the variable ลบ - 1
y--
y = y - 1

Assignment Operations:  ตัวดำเนินการเครื่องหมาย 

Symbol
Operation
Example
Analog
=
Assignment of the value x to the variable y , ให้ค่าเท่ากับ           
у = x
+=
Increase of the variable y by x ,  เพิ่มค่าเท่ากับ x
у += x
y = y + x
-=
Reduction of the variable y by x ,ลดค่าเท่ากับ x
y -= x
y = y - x
*=
Multiplication of the variable y ,by x
y *= x
y = y * x
/=
Division of the variable y ,by x
y /= x
y = y / x
%=
Residue of division of the variable y by x 
y %= x
y = y % x

Relational Operations : ตัวดำเนินการลำดับขั้น


Symbol
Operation
Example
==
True, if x is equal to y ,จริงถ้าค่าเท่ากัน    
x == y
!=
True, if x is not equal to y ,จริงถ้าค่าไม่เท่ากัน 
x != y
< 
True, if x is less than y ,จริงถ้า x<y
x < y
> 
True, if x is more than y ,จริงถ้า x>y
x > y
<=
True, if x is equal to or less than y ,จริง ถ้า x<=y         
x <= y
>=
True, if x is equal to or more than y, จรืงถ้า x>=y
x >= y

Boolean (Logical) Operations : ตัวดำเนินการด้านตรรกศาสตร์


Symbol
Operation
Example
Explanations
!
ไม่ใช่
! х
 คืนค่าจริง ถ้าค่าไม่เท่ากับ x
||
หรือ
x < 5 || x > 7
 คืนค่าจริง ถ้า X <5 หรือ X > 7 
&&
และ)
x == 3 && y < 5   
 คืนค่าจริงถ้า X= 3 และ Y < 5 



 

Comma Operation


เป็นตัวคั่นระหว่าง Expression ซึ่งถูกใช้ใน Loop หรือ Function Call ซึ่งจะกล่าวในบทความต่อไป 

for(i=0,j=99; i<100; i++,j--) Print(array[i][j]); // Loop statement

My_function (Alf, Bet, Gam, Del) // Calling for a function with arguments

สามารถชมการอธิบายเรื่อง Operations and Expression  คลิปด้านล่าง