Hi all,
so I am new to MQL4 and not really great at programming overall. Anyway, I am trying to learn from a tutorial (this one: https://www.cashbackforex.com/school/mql4-programming/basic-expert-advisor-example-moving-average-cross/ ) and there seems to be some stuff there that doesn't work. I haven't completed all of it yet, as I am trying to figure stuff out bit by bit.
So what happens here, is that I am trying to make the function below work, but I keep getting this error: "'close' - function declarations are allowed on global, namespace or class scope only"
I have tried to remove "void" before "close" but then I get other errors like "type - unidentified identifier". Why is there a void there, I guess there should actually be "void" there, since the author put it there, but then, I don't know what is wrong...
Please help!
And thank you in advance!
***
Try renaming the function to something other than "close", instead something like "closeOrders". Modern MetaQuotes uses an array named "close" and might be confusing your function of "close" with that.
Also, make sure the function is entirely outside OnInit, OnDeinit, OnTick, and/or OnTimer functions.
Try renaming the function to something other than "close", instead something like "closeOrders". Modern MetaQuotes uses an
array named "close" and might be confusing your function of "close" with that.
Also, make sure the function is entirely outside OnInit, OnDeinit, OnTick, and/or OnTimer functions.
Thank you!
The function wasn't actually outside OnInit, so I moved it outside and the errors are gone! :)
Hi guys i am trying to build a code that checks when my 8 ema crosses above the ema 60, and the close price of the crossed candle is lower than the closed the price of the candle 3 candle sticks ahead, to return "WON" and if the close price of the crossed candle is higher than the close price of the candle 3 candle sticks ahead it will return "LOSS". And then vise versa for if the 8 ema crosses the 60 ema below.
My code is the following:
***
Please insert the code correctly: when editing a message, press the button and paste your code into the pop-up window.
Thank you!
The function wasn't actually outside OnInit, so I moved it outside and the errors are gone! :)
i am facing the same problem , can you tell me how i can outside my function : https://www.youtube.com/watch?v=w42y_a3qK8g , i use to watch this video ,
my code :
//+------------------------------------------------------------------+
//| test1.mq4 |
//| Copyright 2022, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
extern string LOT_SETTING = "MONEY MANAGMENT SETTINGS";//++++++++++++++++++
extern bool mm = true; //AUTO LOT SIZE ON/OFF
extern double risk = 20; //RISK LEVEL FOR AUTO LOT SIZA %
extern double equityuse = 80; //USE OF EQUITY FOR TRADE IN %
extern string LOT_SETTIN = "LOTS SIZE SETTING"; //+++++++++++++++++++++++++
extern double Lots = 0.05; //LOT SIZE MANUAL FOR FIRST TRADE
extern double TakeProfit = 100; //TAKE PROFIT FOR TRADE IN PIPS
extern double closevalue = 10; //CLOSE ALL WHEN PROFIT REACH 0=TP
extern int MaxTradesPerChart = 15; //MAXIMUM ALLOWED LOTS IN CHART
extern int slipige = 10; //SLIPPIGE ALLOWED
extern string TRAI = "TIME SETTING"; //++++++++++++++++++++++++++++++
extern int StartHour = 0; //TRADE STARTING TIME
extern int StopHour = 24; //TRADE ENDING TIME
extern int StTradeDay = 0; //TRADE STARTING TIME 0=Monday,5=Friday
extern int EndingTradeDay = 5; //TRADE ENDING DAY 0=Monday,5=Friday
extern string TRAIL = "TRAIL SETTING"; //+++++++++++++++++++++++++++++
extern bool trailling = false; //TRALLING STOP ON/OFF TRAIL AUTO STOP
extern double TraillingStop = 20; //TRAILLING START AFTER PIPS
extern double TraillingStep = 5; //TRAILLING STEPS IN PIPS
extern string DISPLAY_SE = "MARTINGLE SETTINGS"; //++++++++++++++++++++++++
extern bool martingle = true; //MARTINGLE ON/OFF TRAIL AUTO STOP
extern int PipStarter = 40; //PIPS GAP BETWEEN LOTS
extern double Booster = 1.5; //LOT INCRESSING RATIO
extern string RSI_INDICATOR = "RSI SETTING "; //++++++++++++++++++++++++++++++
extern int rsiLow = 40; //START BUY WHEN RSI VALUE
extern int rsiHigher = 60; //START SELL WHEN RSI VALUE
extern int rsiPer = 24; //RSI PERIOD
extern string REAL_ACC_TRADING = "MACD SETTING"; //++++++++++++++++++++++++++++++
extern int fastema = 12; //FAST EMA VALUE
extern int slowema = 26; //SLOW EMA VALUE
extern int period = 9; //PERIOD
extern string REAL_ACC_TRADIN = "NEWS FILTER"; //+++++++++++++++++++++++++++++++
//==============================Global variable====================================
double digit =0.0;
double pip_gap =0.0;
int Majic_no =1000;
string identif ="Afaq Khan";
int Real_account =65089013;
long CurAccount;
double Lot_size,macdvalue,rsivalue,vPoint;
//=================================================================================
int deinit()
{
string name_delete;
for(int i=ObjectsTotal()-1; i>=0; i--)
{
name_delete=ObjectName(i);
if(StringFind(name_delete,identif)!=-1)
ObjectDelete(name_delete);
} //End removing market info labels from chart
return(0);
}
//==================================================================================
int init()
{
if(Point == 0.00001)
{
vPoint = 0.0001;
}
else
{
if(Point == 0.001)
{
vPoint = 0.01;
}
else
vPoint = Point;
}
if(Digits ==3)
{
digit = 10.0 * TakeProfit;
pip_gap = 10.0 * PipStarter;
}
else
{
if(Digits == 5)
{
digit =10.0* TakeProfit;
pip_gap =10.0* PipStarter;
}
else
{
digit = TakeProfit;
pip_gap= PipStarter;
}
}
CurAccount=AccountInfoInteger(ACCOUNT_LOGIN);
return(0);
}
//=======================================on every tick====================================
int start()
{
if(Bars<10)
{
Comment("Not enough bars");
return(0);
}
//=======================================checking for account type====================
if(IsDemo());
else
if(CurAccount!=Real_account)
{
Comment ("FOR REAL ACCOUNT TRADE CONTACT WHATSAPP ONLY: 03149187588");
return(0);
}
On_every_tick();
return(0);
}
//=====================================================================================
int On_every_tick()
{
if (martingle==true)
{
trailling=false;
ManageBuy();
ManageSell();
}
if (martingle==false)
{
trailling=true;
if(Count_Order() == 0 )
{
OpenBuy();
OpenSell();
}
}
closevalue= Lotsize()*500;
if(CalculateProfit()>=closevalue)
{
CloseAllTrades();
}
ChartComment();
return (0);
}
//====================================================================================
double Lotsize1()
{
double Balance = AccountBalance();
double PV = MarketInfo(Symbol(),MODE_TICKVALUE);
double Risk = risk/100;
double Equityuse = (AccountEquity()*Risk)/100;
double Lot = (Balance*Risk)/(Equityuse*PV)/10;
return(NormalizeDouble(Lot,2));
}
//***********************************************************************************
double Lotsize()
{
int prec=2;
double minlot,
maxlot;
minlot=MarketInfo(Symbol(),MODE_MINLOT); //get brokers minimal lot size
maxlot=MarketInfo(Symbol(),MODE_MAXLOT); //get brokers maximal lot size
if(minlot==0.01) prec=2;
if (maxlot==0.1) prec=1;
double lot;
double alot;
alot= NormalizeDouble(AccountBalance()/1000/10,prec);
if(mm == true)lot = alot; else lot = Lots;
if(lot> MarketInfo(Symbol(),MODE_MAXLOT))lot = MarketInfo(Symbol(),MODE_MAXLOT);
if(lot> MarketInfo(Symbol(),MODE_MINLOT))lot = MarketInfo(Symbol(),MODE_MINLOT);
return(NormalizeDouble(lot,2));
}
//********************************************************************************
void OpenBuy()
{
if(IsTradeTime()==1 && DayOfWeek() >= StTradeDay && DayOfWeek() <= EndingTradeDay && check_Buy())
{
//if (mm=true) (Lot_size=Lotsize(); ) else (Lot_size= Lots;)
int A=OrderSend(Symbol(),OP_BUY,Lot_size,Ask,3,0,Ask+digit*Point,"Afaq",Majic_no,Green);
{
}
}
return;
}
//======================================================================================
void OpenSell()
{
if (IsTradeTime()==1 && DayOfWeek() >= StTradeDay && DayOfWeek()<= EndingTradeDay && check_Sell())
{
//if (mm=true) (Lot_size=Lotsize(); ) else (Lot_size= Lots;)
int A=OrderSend(Symbol(),OP_SELL,Lot_size,Bid,3,0,Bid-digit*Point,"Afaq",Majic_no,0,Pink);
{
}
} return;
}
//========================================================================================
int IsTradeTime()
{
if ((StartHour < StopHour && TimeHour(TimeCurrent()) < StartHour)||TimeHour(TimeCurrent())>=StopHour)
return(0);
if (StartHour > StopHour && (TimeHour(TimeCurrent()) < StartHour && TimeHour(TimeCurrent())>=StopHour))
return(0);
if (StartHour == 0)
StopHour = 24;
if (Hour() == StopHour -1 && Minute() >=55)
return(0);
return(1);
}
//===================================================================================
bool check_Sell()
{
bool Putorder=false;
{
rsivalue=iRSI (_Symbol,_Period,rsiPer,PRICE_CLOSE,0);
macdvalue=iMACD(NULL,0,fastema,slowema,period,PRICE_CLOSE,MODE_MAIN,0);
if ((rsivalue>=rsiHigher) && (macdvalue>0))
Putorder=true;
}
return(Putorder);
}
//====================================================================================
bool check_Buy()
{
bool Putorder=false;
{
rsivalue=iRSI (_Symbol,_Period,rsiPer,PRICE_CLOSE,0);
macdvalue=iMACD(NULL,0,fastema,slowema,period,PRICE_CLOSE,MODE_MAIN,0);
if ((rsivalue>=rsiLow) && (macdvalue>0))
Putorder=true;
}
return(Putorder);
}
//================================================================================
void ManageBuy()
{
double Lot_open_price =0;
double Lots_total =0;
double Lot_tp =0;
int cnt =0;
double lott =0;
for (cnt =0; cnt <OrdersTotal(); cnt++)
{
int a=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber() != Majic_no || OrderType() != OP_BUY)
continue;
if(OrderOpenTime()>0)
{
Lot_open_price = OrderOpenPrice();
Lot_tp = OrderTakeProfit();
}
if(OrderLots() > Lots_total)
Lots_total = OrderLots();
}
double Get_lot = MathRound(MathLog(Lots_total / Lots) / MathLog(Booster)) + 1.0;
if (Get_lot<0)
Get_lot =0;
//if (mm=true) (lott=Lotsize(); ) else (lott= Lots;)
Lot_size=NormalizeDouble(Lots * MathPow(Booster,Get_lot),2);
if ((Get_lot==0 && DayOfWeek() <5)|| Get_lot==0 && DayOfWeek() >=0 && DayOfWeek()<=5)
OpenBuy();
if(Lot_open_price - Ask > pip_gap * Point && Get_lot < MaxTradesPerChart)
{
OpenBuy();
return;
}
for (cnt = 0; cnt < OrdersTotal(); cnt++)
{
int b=OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber() != Majic_no || OrderType() != OP_BUY || OrderTakeProfit() == Lot_tp || Lot_tp == 0.0)
continue;
int c=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Lot_tp,0,Pink);
}
}
//===============================================================================================
void ManageSell()
{
double Lot_open_price =0;
double Lots_total =0;
double Lot_tp =0;
int cnt =0;
double lott =0;
for (cnt =0; cnt <OrdersTotal(); cnt++)
{
int d=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber() != Majic_no || OrderType() != OP_SELL)
continue;
if(OrderOpenTime()>0)
{
Lot_open_price = OrderOpenPrice();
Lot_tp = OrderTakeProfit();
}
if(OrderLots() > Lots_total)
Lots_total = OrderLots();
}
double Get_lot = MathRound(MathLog(Lots_total / Lots) / MathLog(Booster)) + 1.0;
if (Get_lot<0)
Get_lot =0;
//if (mm=true) (lott=Lotsize(); ) else (lott= Lots;)
Lot_size=NormalizeDouble(Lots * MathPow(Booster,Get_lot),2);
if ((Get_lot==0 && DayOfWeek() <5)|| Get_lot==0 && DayOfWeek() >=0 && DayOfWeek()<=5)
OpenSell();
if(Bid - Lot_open_price > pip_gap * Point && Lot_open_price > 0.0 && Get_lot < MaxTradesPerChart)
{
OpenSell();
return;
}
for (cnt = 0; cnt < OrdersTotal(); cnt++)
{
int e=OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber() != Majic_no || OrderType() != OP_SELL || OrderTakeProfit() == Lot_tp || Lot_tp == 0.0)
continue;
int f=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Lot_tp,0,Pink);
}
}
//=======================================================================================
void ChartComment()
{
string drawdown= DoubleToStr(Calculate_draw_down(2),2);
Comment("\nMy Ea RESULT = 03149187588",
"\n______________________________________________ =",
"\nLot PROFIT =",CalculateProfit(),
"\nSERVER TIME =",TimeToStr(TimeCurrent(), TIME_SECONDS),
"\nACCOUNT EQUITY =",AccountEquity(),
"\nACCOUNT BALANCE =",AccountBalance(),
"\nFREE MARFR=IN =",AccountFreeMargin(),
"\nDRAWDOWN =",drawdown,
"\n_______________________________________________ ="
)
}
//======================================================================================
double Calculate_draw_down (int a)
{
double Draw_down;
if(a==2)
{
Draw_down= (AccountEquity()/AccountBalance() - 1.0) / (-0.01);
if (Draw_down > 0.0)
return(0);
}
if(a==1)
{
Draw_down = 100.0 * (AccountEquity() / AccountBalance() - 1.0);
if (Draw_down > 0.0)
return (Draw_down);
return(0);
}
return(0.0);
}
//===============================================================================================
double CalculateProfit()
{
double profit = 0;
for(int cnt = OrdersTotal() - 1 ; cnt >= 0; cnt--)
{
int x= OrderSelect (cnt, SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() != Symbol() || (OrderMagicNumber()) != Majic_no)
continue;
if(OrderSymbol() == Symbol() && (OrderMagicNumber())== Majic_no)
if ((OrderType()==OP_BUY) || (OrderType()==OP_SELL))
profit += OrderProfit();
}
return(profit);
}
//=================================================================================
void CloseAllTrades()
{
int total=OrdersTotal();
for(int y= OrdersTotal()-1; y>=0; y--)
{
if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES))
if((OrderSymbol()==Symbol()) && (OrderMagicNumber()== Majic_no))
{
int ticket=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,Aqua);
}
}
return;
}
//========================================================================================
void Trail_sl()
{
if ((OrdersTotal()>0) && (TraillingStop !=0))
{
for (int cnt=OrdersTotal();cnt>=0;cnt--)
{
int myoder=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice()>((TraillingStop+TraillingStep)*vPoint))
{
if ((OrderStopLoss()<(Bid - (TraillingStop+TraillingStep)*vPoint)) || OrderStopLoss()==0)
int ticket=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-vPoint*TraillingStop,0,0,Green);
}
}
}
if(OrderType()==OP_SELL)
{
if ((OrderOpenPrice()-Ask)> ((TraillingStop+TraillingStep)*vPoint))
{
if ((OrderStopLoss()>(Ask + (TraillingStop+TraillingStep)*vPoint)) || OrderStopLoss()==0)
int k=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+vPoint*TraillingStop,0,0,Red);
}
}
}
return;
}
}
//***********************************************************************************************
double Count_Order()
{
int CurTrades=0;
for (int i=OrdersTotal()-1; i >=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol() != Symbol() || OrderMagicNumber() != Majic_no)
continue;
if(OrderSymbol()== Symbol() && OrderMagicNumber() == Majic_no)
if ((OrderType()==OP_BUY) || (OrderType()==OP_SELL))
CurTrades++;
}
return(CurTrades);
}
//******************************************************************************************************
- www.cashbackforex.com
Thank you!
The function wasn't actually outside OnInit, so I moved it outside and the errors are gone! :)
- Just above your pasted code was: Vladimir Karputov #: Please insert the code correctly: when editing a message, press the button and paste your code into the pop-up window.
Why didn't you use the code button?
Please edit your (original) post and use the CODE button (or Alt+S)! Or delete it since you then attached the file.
General rules and best pratices of the Forum. - General - MQL5 programming forum (2019)
Messages Editor - si46idrees #: i have an error this " "'close' - function declarations are allowed on global, namespace or class scope only" "
You have no "close" function in your posted code. The error message is "'CloseAllTrades' - function declarations are allowed on global, namespace or class scope only test1.mq4 385 6"
How To Ask Questions The Smart Way. (2004)
Be precise and informative about your problem
-
Start by fixing the first error first. "'}' - semicolon expected test1.mq4 348 1"
"\n_______________________________________________ =" ) }
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hi all,
so I am new to MQL4 and not really great at programming overall. Anyway, I am trying to learn from a tutorial (this one: https://www.cashbackforex.com/school/mql4-programming/basic-expert-advisor-example-moving-average-cross/ ) and there seems to be some stuff there that doesn't work. I haven't completed all of it yet, as I am trying to figure stuff out bit by bit.
So what happens here, is that I am trying to make the function below work, but I keep getting this error: "'close' - function declarations are allowed on global, namespace or class scope only"
I have tried to remove "void" before "close" but then I get other errors like "type - unidentified identifier". Why is there a void there, I guess there should actually be "void" there, since the author put it there, but then, I don't know what is wrong...
Please help!
And thank you in advance!
***