Pending Order Stop Loss

 

Greetings

why is closing price higher than the stop loss? As soon as it hits my stop loss, stop loss price and closing price are not the same. When my pending orders (buy stop & sell stop) are placed everything is perfect. Once it turns into a position, price changes and stop loss changes. I tried searching on the web & I came across "order filled" I assumed it might be the solution to my problem, but no. here is the EA Below: 

//+------------------------------------------------------------------+
//|                                                 forum EA MT5.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\OrderInfo.mqh>

CTrade trade;
CPositionInfo m_position;
CSymbolInfo m_symbol;
COrderInfo m_order;
CAccountInfo m_account;

input double StopLoss=0.1;
input double PendingStopTrail=0.05;
input double point=100;
input int digit=2;

int MagicNumber;
double Price;
double Filter=0;
int Direction=0;

double Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK); 
double Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
int StopLevel=(int)SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
int FreezeLevel=(int)SymbolInfoInteger(Symbol(),SYMBOL_TRADE_FREEZE_LEVEL);
double TickSize=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 {
  ResetLastError();
  
  if(!m_symbol.Name(Symbol()))
  {
   return(INIT_FAILED);
  }
   
  trade.SetExpertMagicNumber(MagicNumber);
  trade.SetMarginMode();
  trade.SetTypeFillingBySymbol(m_symbol.Name());
  
  MagicNumber=(int)TimeCurrent();
             
  TesterHideIndicators(true);
  
  StopLevel=(int)SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);
  FreezeLevel=(int)SymbolInfoInteger(Symbol(),SYMBOL_TRADE_FREEZE_LEVEL);
  TickSize=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
  
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int CountPending()
 {
  int Pending=0;
  for(int b=OrdersTotal()-1;b>=0;b--)
  {
   bool Select=OrderSelect(OrderGetTicket(b));
   string OrderSymbol=OrderGetString(ORDER_SYMBOL);
   if(OrderSymbol==Symbol())
   {
    ENUM_ORDER_TYPE Type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
    if(Type==ORDER_TYPE_BUY_STOP||Type==ORDER_TYPE_SELL_STOP)
    Pending++;
   }
  }
  return(Pending);
 }
 
double Pips()
 {
  double PipPoint=0;
  int Digit=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
  if(Digit==digit){PipPoint=Point()*point;}
  return(PipPoint);
 } 
 
void FillOrder()
 {
  int Fill=0,PenFill=0;
  
  for(int f=PositionsTotal()-1;f>=0;f--)
  {
   if(m_position.SelectByIndex(f))
   if(m_position.Symbol()==Symbol())
   {
    if(m_position.Type()==POSITION_TYPE_BUY||m_position.Type()==POSITION_TYPE_SELL)
    {
     Fill=(int)m_position.Ticket();PenFill=(int)m_position.Ticket();
    }
   }
  }
 }
 
void BuyPending()
 {
  int PSAR=iSAR(Symbol(),_Period,0.02,0.2);
  double SAR[];
  ArraySetAsSeries(SAR,true);
  CopyBuffer(PSAR,0,0,Bars(Symbol(),Period()),SAR);
  
  MqlRates Candle[];
  ArraySetAsSeries(Candle,true);
  int rates=CopyRates(Symbol(),Period(),0,Bars(Symbol(),Period()),Candle);
  
  datetime Expire=TimeCurrent()+(60*15);
  
  double SLBuy=Bid-StopLoss*Pips();
  double PendingPrice=Ask+PendingStopTrail*Pips();
  
  if(OrdersTotal()==0)
  {
   if(MathAbs(PendingPrice-Ask)>FreezeLevel*Pips()||MathAbs(PendingPrice-SLBuy)>StopLevel*Pips())
   {
    if(SAR[0]<Bid)
    {
     bool BuyStop=trade.BuyStop(0.1,PendingPrice,Symbol(),SLBuy,0,ORDER_TIME_SPECIFIED,Expire,"SLClose");
    }
   }
  }   
  
 }
 
void SellPending()
 {
  int PSAR=iSAR(Symbol(),_Period,0.02,0.2);
  double SAR[];
  ArraySetAsSeries(SAR,true);
  CopyBuffer(PSAR,0,0,Bars(Symbol(),Period()),SAR);
  
  MqlRates Candle[];
  ArraySetAsSeries(Candle,true);
  int rates=CopyRates(Symbol(),Period(),0,Bars(Symbol(),Period()),Candle);
  
  datetime Expire=TimeCurrent()+(60*15);
  
  double SLSell=Bid+StopLoss*Pips();
  double PendingPrice=Bid-PendingStopTrail*Pips();
  
  if(OrdersTotal()==0)
  {
   if(MathAbs(Bid-PendingPrice)>FreezeLevel*Pips()||MathAbs(SLSell-PendingPrice)>StopLevel*Pips())
   {
   if(SAR[0]>Ask)
   {
    bool SellStop=trade.SellStop(0.1,PendingPrice,Symbol(),SLSell,0,ORDER_TIME_SPECIFIED,Expire,"SLClose");
   }
  }
 }   
  
  
 } 

void OnTick()
 {
  trade.SetExpertMagicNumber(MagicNumber);
  
  if(CountPending()<1){BuyPending();SellPending();}
  FillOrder();
   
 }