I am an MT5 student and my PositionClose() has refused to work. I have tried various options and alternatives but failed and I decided to seek help. Please point to me what I could be doing wrong.
Thank you.
//+------------------------------------------------------------------+//| Code_From_Scratch.mq5 |//| Copyright 2021, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2021, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.005"//---#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
CSymbolInfo m_symbol; // object of CSymbolInfo class
CAccountInfo m_account; // object of CAccountInfo class
CTrade m_trade; // object of CTrade class
CPositionInfo m_position; // trade position object//---int handleTrendFastMA;
int handleTrendSlowMA;
inputulong InpMagic = 1111; // Magic number//---bool m_need_close_buys = false; // close all BUY positionsbool m_need_close_sells = false; // close all SELL positions//---datetime m_prev_bars = 0; // "0" -> D'1970.01.01 00:00';//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---
handleTrendFastMA=iMA(_Symbol,PERIOD_M30,12,0,MODE_EMA,PRICE_CLOSE);
handleTrendSlowMA=iMA(_Symbol,PERIOD_M30,21,0,MODE_EMA,PRICE_CLOSE);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
datetime time_0=iTime(Symbol(),PERIOD_M30,0);
if(time_0==m_prev_bars)
return;
m_prev_bars=time_0;
//---string m_array_symbols[4] = {"EURUSD","NZDUSD"};
int total = ArraySize(m_array_symbols);
for(int i=0; i<total; i++)
{
double Ask=SymbolInfoDouble(m_array_symbols[i],SYMBOL_ASK);
double Bid=SymbolInfoDouble(m_array_symbols[i],SYMBOL_BID);
double maTrendFast[];
double maTrendSlow[];
CopyBuffer(handleTrendFastMA,0,0,1,maTrendFast);
CopyBuffer(handleTrendSlowMA,0,0,1,maTrendSlow);
MqlRates rates[];
ArraySetAsSeries(rates,true);
int copied=CopyRates(m_array_symbols[i],PERIOD_M30,0,5,rates);
//---Calculations for new positionsif(PositionsTotal()<4)
{
if(maTrendFast[0]>maTrendSlow[0])
{
if(rates[1].high>rates[2].high && rates[1].close > rates[1].open && rates[2].close > rates[2].open && rates[3].open > rates[3].close && rates[2].close-rates[2].open >= (rates[3].open-rates[3].close)/2)
{
if(!PositionSelect(m_array_symbols[i]))
m_trade.Buy(0.01,m_array_symbols[i],Ask,(Ask-3000*_Point),(Ask+3000*_Point));
CheckTrailingStop(Ask);
}
}
elseif(maTrendFast[0]<maTrendSlow[0])
{
if(rates[1].low<rates[2].low && rates[1].close<rates[1].open && rates[2].close<rates[2].open && rates[3].open < rates[3].close && rates[2].open-rates[2].close >= (rates[3].close-rates[3].open)/2)
{
if(!PositionSelect(m_array_symbols[i]))
m_trade.Sell(0.01,m_array_symbols[i],Bid,(Bid+3000*_Point),(Bid-3000*_Point));
CheckTrailingStop1(Bid);
}
}
return;
}
//---for(int j=PositionsTotal()-1; j>=0; j--) // returns the number of open positionsif(m_position.SelectByIndex(j))
if(m_position.Symbol()==Symbol() && m_position.Magic()==InpMagic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY) // long position is opened
{
if(rates[1].close < maTrendFast[0])
{
m_trade.PositionClose(m_position.Ticket()); // close positionreturn; // exit
}
}
else
{
if(m_position.PositionType()==POSITION_TYPE_SELL) // long position is opened
{
if(rates[1].close > maTrendFast[0])
{
m_trade.PositionClose(m_position.Ticket()); // close positionreturn; // exit
}
}
}
}
return;
}
}
//+------------------------------------------------------------------+//| ------Trailing Stops------- |//+------------------------------------------------------------------+void CheckTrailingStop(double Ask)
{
//set the desired stop loss to 150 pointsdouble SL=NormalizeDouble(Ask-500*_Point,_Digits);
//Check all the current open positions for the current symbolfor(int i=PositionsTotal()-1; i>=0; i--) // Count all currency pair positions
{
string symbol=PositionGetSymbol(i);
if(_Symbol==symbol) //If chart symbol equals position symbol
{
if(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_BUY) //IF WE HAVE A sell position
{
//Get the ticket numberulong PositionTicket=PositionGetInteger(POSITION_TICKET);
//Get the current Stop Lossdouble CurrentStopLoss=PositionGetDouble(POSITION_SL);
//if current stop loss is below 150 points from Ask priceif(CurrentStopLoss<SL)
{
//Modify the stop loss by 10 points
m_trade.PositionModify(PositionTicket,(CurrentStopLoss+10*_Point),0);
}
}//End Symbol in loop
}//End for loop
}//End trailing stop
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void CheckTrailingStop1(double Bid)
{
double SL=NormalizeDouble(Bid+500*_Point,_Digits);//Set the stop loss to 150 pointsfor(int i=PositionsTotal()-1; i>=0; i--)
{
string symbol=PositionGetSymbol(i); //get the symbol positionif(_Symbol==symbol)//if the currency pair is equalif(PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_SELL) //IF WE HAVE A sell position
{
ulong PositionTicket=PositionGetInteger(POSITION_TICKET);//calculate the current stop lossdouble CurrentStopLoss = PositionGetDouble(POSITION_SL);//Get the ticket typeif(CurrentStopLoss>SL) //If the current top loss is more than 180
{
m_trade.PositionModify(PositionTicket,(CurrentStopLoss-10*_Point),0);
}
}//End of Loop
}//End of For Loop
}
//+----------------------------//+------------------------------------------------------------------+
Hi all,
I am an MT5 student and my PositionClose() has refused to work. I have tried various options and alternatives but failed and I decided to seek help. Please point to me what I could be doing wrong.
Thank you.