how to develop a bot that opens only one buy trading position mql5

 

Hello,

I am new to mql5 and would appreciate some help with a the bot i am developing. I am trying to get the logic to open a single position for buying at a given time and the same goes for selling. However, i can't seem to get it right. I have managed to develop one that opens 2 positions when the MAs cross, Problem is it opens 2 positions of the same type sometimes. thanks in advance for our help.


#include <Trade/Trade.mqh>

CTrade trade;

void OnTick()
  {

   double movingAverageArr1[],movingAverageArr2[];
   
   int movingAverageDefinition1 = iMA(_Symbol,_Period,2,0,MODE_SMA,PRICE_CLOSE);
   
   int movingAverageDefinition2 = iMA(_Symbol,_Period,9,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price from current candle downwards
   ArraySetAsSeries(movingAverageArr1,true);
   
   ArraySetAsSeries(movingAverageArr2,true);
   
   //
   CopyBuffer(movingAverageDefinition1,0,0,3,movingAverageArr1);
   CopyBuffer(movingAverageDefinition2,0,0,3,movingAverageArr2);
   
   //calc if we have an entr signal
   if (
   
   (movingAverageArr1[0]>movingAverageArr2[0])
   &&
   (movingAverageArr1[1]<movingAverageArr2[1])
   //pos nums
   && (PositionsTotal()<1)
   )
   
   {
   Comment ("BUY");
   double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   
   //stop loss of 100 points
   double sl = ask - 5 * SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   
   //take profit
   double tp = ask + 200 * SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   
   trade.Buy(0.10,_Symbol,ask,sl,tp,"buy trade");
   }
   
   if (
   
   (movingAverageArr1[0]<movingAverageArr2[0])
   &&
   (movingAverageArr1[1]>movingAverageArr2[1])
   && (PositionsTotal()<1)
   )
   {
   Comment ("SELL");
   double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   //stop loss of 100 points
   double sl = bid + 100 * SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   
   //take profit
   double tp = bid - 200 * SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   
   trade.Sell(0.10,_Symbol,bid,sl,tp,"sell trade");


      if (
   
   (movingAverageArr1[0]<movingAverageArr2[0])
   &&
   (movingAverageArr1[1]>movingAverageArr2[1])
   )
    closeAllBuyPos();
   }
  }


void closeAllBuyPos()
 {
 //use for loop to go thru all open pos
 for (int i=PositionsTotal()-1; i>=0; i--)
  {
  int ticket=PositionGetTicket(i);

//geT pos direcTion
int PositionDirection=PositionGetInteger(POSITION_TYPE);

//if its a tenga pos
if (PositionDirection==POSITION_TYPE_BUY)

//close current pos
trade.PositionClose(ticket);
  }

 }
Reason: