BTC USD 62,006.8 Gold USD 4,258.79
Time now: Jun 1, 12:00 AM

Belajar Coding EA (mql) asas

Kalau extern bermakna ia akan keluar kat input. Kalau nakkan static (number fixed), buang extern ataupun guna #define.
 
Salam bro Aiman, contohnya Ea ini tidak ingat akan post yang pernah dibuatnya jika saya tukar LP.Satu LP 6 jam ketika saya tukar LP ketika itu Ea pada LP satu tu dah buat post...macam mana ya bro nak tulis code agar Ea pada LP yang satu lagi ambil alih post tersebut? Dan..di mana code itu harus di letakkan bro. Apa-apa pun terima kasih atas bantuan bro..
:)

#define Magic 9897
#define SLIPPAGE 3

extern string Paramater_Indi_BBstop;
extern int Length=20;
extern int Deviation=1;
extern double MoneyRisk=1.00;
extern int Signal=1;
extern int Line=1;
extern int Nbars=5000;
extern bool SoundON=true;

extern string Paramater_EA;
extern int TakeProfit = 0;
extern int StopLoss = 0;
extern int TrailingStop = 0;
extern double Lots = 0.1;
extern bool CloseOrderBilaGantiSinyal = false;
extern string koment_EA=" EA BBSTOP";

//---- indicator buffers
double UpTrendBuffer[10000];
double DownTrendBuffer[10000];
double UpTrendSignal[10000];
double DownTrendSignal[10000];
double UpTrendLine[10000];
double DownTrendLine[10000];
bool AlertON=true;
bool TurnedUp = false;
bool TurnedDown = false;

int barCount = 0;
int currPosition = 0;

int init()
{
barCount=0;
currPosition=0;
return(0);
**


int startIndicator()
{
int i,shift,trend;
double smax[25000],smin[25000],bsmax[25000],bsmin[25000];

for (shift=Nbars;shift>=0;shift--)
{
UpTrendBuffer[shift]=0;
DownTrendBuffer[shift]=0;
UpTrendSignal[shift]=0;
DownTrendSignal[shift]=0;
UpTrendLine[shift]=EMPTY_VALUE;
DownTrendLine[shift]=EMPTY_VALUE;
**

for (shift=Nbars-Length-1;shift>=0;shift--)
{

smax[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,shift);
smin[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,shift);

if (Close[shift]>smax[shift+1]) trend=1;
if (Close[shift]<smin[shift+1]) trend=-1;

if(trend>0 && smin[shift]<smin[shift+1]) smin[shift]=smin[shift+1];
if(trend<0 && smax[shift]>smax[shift+1]) smax[shift]=smax[shift+1];

bsmax[shift]=smax[shift]+0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);
bsmin[shift]=smin[shift]-0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);

if(trend>0 && bsmin[shift]<bsmin[shift+1]) bsmin[shift]=bsmin[shift+1];
if(trend<0 && bsmax[shift]>bsmax[shift+1]) bsmax[shift]=bsmax[shift+1];

if (trend>0)
{
if (Signal>0 && UpTrendBuffer[shift+1]==-1.0)
{
UpTrendSignal[shift]=bsmin[shift];
UpTrendBuffer[shift]=bsmin[shift];
if(Line>0) UpTrendLine[shift]=bsmin[shift];
if (SoundON==true && shift==0 && !TurnedUp)
{

Alert("Trend Naik, BUY MODE - " ,Symbol(),"-",Period());
TurnedUp = true;
TurnedDown = false;
**
**
else
{
UpTrendBuffer[shift]=bsmin[shift];
if(Line>0) UpTrendLine[shift]=bsmin[shift];
UpTrendSignal[shift]=-1;
**
if (Signal==2) UpTrendBuffer[shift]=0;
DownTrendSignal[shift]=-1;
DownTrendBuffer[shift]=-1.0;
DownTrendLine[shift]=EMPTY_VALUE;
**
if (trend<0)
{
if (Signal>0 && DownTrendBuffer[shift+1]==-1.0)
{
DownTrendSignal[shift]=bsmax[shift];
DownTrendBuffer[shift]=bsmax[shift];
if(Line>0) DownTrendLine[shift]=bsmax[shift];
if (SoundON==true && shift==0 && !TurnedDown)
{
Alert("Trend Turun, SELL MODE - " ,Symbol(),"-",Period());
TurnedDown = true;
TurnedUp = false;
**
**
else
{
DownTrendBuffer[shift]=bsmax[shift];
if(Line>0)DownTrendLine[shift]=bsmax[shift];
DownTrendSignal[shift]=-1;
**
if (Signal==2) DownTrendBuffer[shift]=0;
UpTrendSignal[shift]=-1;
UpTrendBuffer[shift]=-1.0;
UpTrendLine[shift]=EMPTY_VALUE;
**


**
return(0);
**


void OpenBuyOrder()
{

int ticket,err,tries;
tries = 0;

double price, sl, tp;
price=Ask;
if (TakeProfit==0) tp=0;
else tp=price+TakeProfit*Point;
if (StopLoss==0) sl=0;
else sl=price-StopLoss*Point;


while (tries < 3)
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,price,SLIPPAGE,sl,tp,koment_EA,Magic,0,Blue);
if(ticket<=0) {
Write("Error Accured : "+ErrorDescription(GetLastError())+" Open Buy Order, price="+price+", TP="+tp+", SL="+sl);
tries++;
** else tries = 3;
**

if (ticket>0) currPosition=1;
**

//+------------------------------------------------------------------+

void OpenSellOrder()
{

int ticket,err,tries;
tries = 0;

double price, sl, tp;
price=Bid;
if (TakeProfit==0) tp=0;
else tp=price-TakeProfit*Point;
if (StopLoss==0) sl=0;
else sl=price+StopLoss*Point;

while (tries < 3)
{
ticket = OrderSend(Symbol(),OP_SELL,Lots,price,SLIPPAGE,sl,tp,koment_EA,Magic,0,Red);
if(ticket<=0) {
Write("Error Accured : "+ErrorDescription(GetLastError())+" Open Sell Order, price="+price+", TP="+tp+", SL="+sl);
tries++;
** else tries = 3;
**

if (ticket>0) currPosition=-1;
**

void closeAllOrders()
{

int skaits=OrdersTotal();
int j=0;
int closeTickets[];

ArrayResize(closeTickets,skaits);

for (int i=0;i<skaits;i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (
(OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic)
)
{
closeTickets[j]=OrderTicket();
j++;
**
**

for (i=j-1; i>=0;i--)
{
closeOrderByTicket(closeTickets);
**

currPosition=0;

**

bool closeOrderByTicket(int ticket)
{
double closePrice;
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
if (OrderType()==OP_BUY) closePrice=Bid; else closePrice=Ask;
OrderClose(OrderTicket(),OrderLots(),closePrice,SLIPPAGE,White);
**

void DoTrail()
{
for (int i = 0; i < OrdersTotal(); i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if ( OrderSymbol()==Symbol() && (OrderMagicNumber() == Magic)) // only look if mygrid and symbol...
{

if (OrderType() == OP_BUY) {
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);
return(0);
**
**
**

if (OrderType() == OP_SELL)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
**
**
**
**
**
**



bool SignalBuyOpen()
{
bool rez;

if (currPosition==1) return(false);

if (UpTrendSignal[1]>0) rez=true; else rez=false;


return(rez);
**

bool SignalSellOpen()
{
bool rez;

if (currPosition==-1) return(false);
if (DownTrendSignal[1]>0) rez=true; else rez=false;


return(rez);
**


void CheckForSignal()
{
if (SignalBuyOpen())
{
if (CloseOrderBilaGantiSinyal && (currPosition==-1)) closeAllOrders();
OpenBuyOrder();
**

if (SignalSellOpen())
{
if (CloseOrderBilaGantiSinyal && (currPosition==1)) closeAllOrders();
OpenSellOrder();
**

**




int Write(string str)
{

Print (">>> "+ str + " Time " + TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS));
**


void start()
{


if(barCount!=Bars)
{
int Tiket_Order = OrderType();
if (StopLoss>0){
if (Tiket_Order == OP_BUY && Bid - OrderOpenPrice() <= (StopLoss) * Point) {// StopLoss BUY
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, Blue);
return;
**
if (Tiket_Order == OP_SELL && OrderOpenPrice() - Ask <= (-StopLoss) * Point) {// // StopLoss SELL
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, Red);
return;
**
**


startIndicator();
CheckForSignal();


barCount=Bars;

**

if (TrailingStop>0) DoTrail();
**
string ErrorDescription(int error_code)
{
string error_string;
switch(error_code)
{
case 0:
case 1: error_string="no error"; break;
case 2: error_string="common error"; break;
case 3: error_string="invalid trade parameters"; break;
case 4: error_string="trade server is busy"; break;
case 5: error_string="old version of the client terminal"; break;
case 6: error_string="no connection with trade server"; break;
case 7: error_string="not enough rights"; break;
case 8: error_string="too frequent requests"; break;
case 9: error_string="malfunctional trade operation"; break;
case 64: error_string="account disabled"; break;
case 65: error_string="invalid account"; break;
case 128: error_string="trade timeout"; break;
case 129: error_string="invalid price"; break;
case 130: error_string="invalid stops"; break;
case 131: error_string="invalid trade volume"; break;
case 132: error_string="market is closed"; break;
case 133: error_string="trade is disabled"; break;
case 134: error_string="not enough money"; break;
case 135: error_string="price changed"; break;
case 136: error_string="off quotes"; break;
case 137: error_string="broker is busy"; break;
case 138: error_string="requote"; break;
case 139: error_string="order is locked"; break;
case 140: error_string="long positions only allowed"; break;
case 141: error_string="too many requests"; break;
case 145: error_string="modification denied because order too close to market"; break;
case 146: error_string="trade context is busy"; break;
//---- mql4 errors
case 4000: error_string="no error"; break;
case 4001: error_string="wrong function pointer"; break;
case 4002: error_string="array index is out of range"; break;
case 4003: error_string="no memory for function call stack"; break;
case 4004: error_string="recursive stack overflow"; break;
case 4005: error_string="not enough stack for parameter"; break;
case 4006: error_string="no memory for parameter string"; break;
case 4007: error_string="no memory for temp string"; break;
case 4008: error_string="not initialized string"; break;
case 4009: error_string="not initialized string in array"; break;
case 4010: error_string="no memory for array\' string"; break;
case 4011: error_string="too long string"; break;
case 4012: error_string="remainder from zero divide"; break;
case 4013: error_string="zero divide"; break;
case 4014: error_string="unknown command"; break;
case 4015: error_string="wrong jump (never generated error)"; break;
case 4016: error_string="not initialized array"; break;
case 4017: error_string="dll calls are not allowed"; break;
case 4018: error_string="cannot load library"; break;
case 4019: error_string="cannot call function"; break;
case 4020: error_string="expert function calls are not allowed"; break;
case 4021: error_string="not enough memory for temp string returned from function"; break;
case 4022: error_string="system is busy (never generated error)"; break;
case 4050: error_string="invalid function parameters count"; break;
case 4051: error_string="invalid function parameter value"; break;
case 4052: error_string="string function internal error"; break;
case 4053: error_string="some array error"; break;
case 4054: error_string="incorrect series array using"; break;
case 4055: error_string="custom indicator error"; break;
case 4056: error_string="arrays are incompatible"; break;
case 4057: error_string="global variables processing error"; break;
case 4058: error_string="global variable not found"; break;
case 4059: error_string="function is not allowed in testing mode"; break;
case 4060: error_string="function is not confirmed"; break;
case 4061: error_string="send mail error"; break;
case 4062: error_string="string parameter expected"; break;
case 4063: error_string="integer parameter expected"; break;
case 4064: error_string="double parameter expected"; break;
case 4065: error_string="array as parameter expected"; break;
case 4066: error_string="requested history data in update state"; break;
case 4099: error_string="end of file"; break;
case 4100: error_string="some file error"; break;
case 4101: error_string="wrong file name"; break;
case 4102: error_string="too many opened files"; break;
case 4103: error_string="cannot open file"; break;
case 4104: error_string="incompatible access to a file"; break;
case 4105: error_string="no order selected"; break;
case 4106: error_string="unknown symbol"; break;
case 4107: error_string="invalid price parameter for trade function"; break;
case 4108: error_string="invalid ticket"; break;
case 4109: error_string="trade is not allowed"; break;
case 4110: error_string="longs are not allowed"; break;
case 4111: error_string="shorts are not allowed"; break;
case 4200: error_string="object is already exist"; break;
case 4201: error_string="unknown object property"; break;
case 4202: error_string="object is not exist"; break;
case 4203: error_string="unknown object type"; break;
case 4204: error_string="no object name"; break;
case 4205: error_string="object coordinates error"; break;
case 4206: error_string="no specified subwindow"; break;
default: error_string="unknown error";
**
return(error_string);
**
 
Syaratnya ada 2

1. Pastikan setiap "OrderSend" mesti ada magic number, EA tuan nampaknya sudah ada magic number, yang ini rasanya OK
2. Pastikan setiap function, "OrderSelect" terutamanya mesti check magic number (OrderMagicNumber()!=Magic) atau (OrderMagicNumber()==Magic)

Maaf ye, saya tak dapat nak check keseluruhan EA tuan, coding saya sendiri banyak yang tak terbuat.

Contohnya nak check pos yang ada magic number

for (int i=0; i<OrdersTotal(); i++)
{
OrderSelect(i,SELECT_BY_POS); // kat sini ada "OrderSelect"
if (OrderMagicNumber()!=Magic) continue; // sekiranya magic number tak sama, EA skip coding kat bawah
< coding seterusnya.....


Magic number ni macam ID, kalau kita open pos secara manual, magic number secara default ialah 0, kalau kita open pos programatically (guna script atau EA), kita boleh set magic number pada pos tersebut. Jadi EA boleh kenal pos yang dibuka menggunakan magic number.
 
Syaratnya ada 2

1. Pastikan setiap "OrderSend" mesti ada magic number, EA tuan nampaknya sudah ada magic number, yang ini rasanya OK
2. Pastikan setiap function, "OrderSelect" terutamanya mesti check magic number (OrderMagicNumber()!=Magic) atau (OrderMagicNumber()==Magic)

Maaf ye, saya tak dapat nak check keseluruhan EA tuan, coding saya sendiri banyak yang tak terbuat.

Contohnya nak check pos yang ada magic number

for (int i=0; i<OrdersTotal(); i++)
{
OrderSelect(i,SELECT_BY_POS); // kat sini ada "OrderSelect"
if (OrderMagicNumber()!=Magic) continue; // sekiranya magic number tak sama, EA skip coding kat bawah
< coding seterusnya.....


Magic number ni macam ID, kalau kita open pos secara manual, magic number secara default ialah 0, kalau kita open pos programatically (guna script atau EA), kita boleh set magic number pada pos tersebut. Jadi EA boleh kenal pos yang dibuka menggunakan magic number.

Terimakasih banyak atas bantuan bro...:)cgrock
 
Kalau current pair kita akan guna Symbol()
Kalau nak guna lain2 pair, kita kena type symbol name, contoh "EURUSD" atau "GBPUSD"

Contoh syntax untuk open post
current pair
Code:
OrderSend([COLOR="DarkRed"]Symbol()[/COLOR],OP_BUY,1,Ask,3,0,0,"My order #2",16384,0,Green);
lain2 pair (eg>EURUSD dan GBPUSD)
Code:
OrderSend([COLOR="DarkRed"]"EURUSD"[/COLOR],OP_BUY,1,Ask,3,0,0,"My order #2",16384,0,Green);
OrderSend([COLOR="DarkRed"]"GBPUSD"[/COLOR],OP_BUY,1,Ask,3,0,0,"My order #2",16384,0,Green);

Contoh lain kalau nak dapatkan bid atau close price
current pair
Code:
iClose([COLOR="DarkRed"]Symbol()[/COLOR],PERIOD_M15,0);
lain2 pair (eg>EURUSD dan GBPUSD)
Code:
iClose([COLOR="DarkRed"]"EURUSD"[/COLOR],PERIOD_M15,0);
iClose([COLOR="DarkRed"]"GBPUSD"[/COLOR],PERIOD_M15,0);

Guna metaeditor sangat mudah sebab ada auto complete, cuba type iClose kat metaeditor.
Bila huruf ke tiga ( iCl ) ditaip biasanya akan keluar autocomplete.
autocomplete.jpg


Untuk dapatkan contoh syntax pula, highlight iClose tadi, kemudian tekan F1. Kat sana kita boleh lihat contoh penggunaan iClose untuk multipairs

Salam, tumpang tanya utk kefahaman. Jika symbol() utkcurrent pair, adakah utk pair yg lain kits mesti type symbol(EURUSD) atau symbol("EURUSD"). Mohon sedikit penerangan bang, cuba nak faham dan belajar. Dan jika kita nak ambil current pricelist, mcmaner pula bentuk commandnya? Tq atas bantuan bro.
 
cuba go through ebook yang ada disertakan dalam thread ni... link nye kat page mana tak pasti...

Salam, saya dah cuba sedut byk kali tapi tak dpt2, dia tulis pautan tidak say. Ada tak cara lain.utk dptkan e-book bro tempe? Timakasih ya
 
Code untuk buy
Code:
OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,"Comment saya",[COLOR="Red"]100[/COLOR],0,Blue);

Warna merah tu magic number

Salam, kat command ordersend tu ada nombor 5. Kalau ditukar kpd nombor lain atau nombor 0, apa akan jadi? Tq ya
 

Live Forex Chart

Currency
Rates
EUR / USD
1.15415
USD / JPY
160.414
GBP / USD
1.33794
USD / CHF
0.79856
USD / CAD
1.39472
EUR / JPY
185.142
AUD / USD
0.70275
Back
Top
Log in Register