//+------------------------------------------------------------------+
//|                                                      Inverse.mq4  |
//|                                      Copyright 2023, YourName    |
//|                                         http://www.yourlink.com  |
//+------------------------------------------------------------------+
#property copyright "2023, YourName"
#property link      "http://www.yourlink.com"
#property version   "1.00"
#property strict

#define HEDGED_ORDER_COMMENT "Hedged"

datetime hedgeOrderOpenTime = 0; // Track when the hedged order was opened

//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   for(int i = OrdersTotal()-1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == 0)
      {
         // If original order is in profit, close the hedged order if it exists
         if(OrderProfit() > 0)
         {
            for(int j = OrdersTotal()-1; j >= 0; j--)
            {
               if(OrderSelect(j, SELECT_BY_POS) && OrderSymbol() == Symbol() && StringCompare(OrderComment(), HEDGED_ORDER_COMMENT) == 0)
               {
                  if(OrderClose(OrderTicket(), OrderLots(), (OrderType() == OP_BUY) ? Bid : Ask, 3, CLR_NONE))
                  {
                     hedgeOrderOpenTime = 0; // Reset the hedged order open time
                  }
               }
            }
         }
         else if(OrderProfit() <= 0 && StringCompare(OrderComment(), HEDGED_ORDER_COMMENT) != 0)
         {
            // If the original order is in loss and not hedged yet, place a hedging order
            double lotSize = OrderLots();
            int orderType = OrderType();
            int ticket = -1;
            
            if(orderType == OP_BUY)
            {
               ticket = OrderSend(Symbol(), OP_SELL, lotSize, Bid, 3, 0, 0, HEDGED_ORDER_COMMENT, 0, 0, Red);
            }
            else if(orderType == OP_SELL)
            {
               ticket = OrderSend(Symbol(), OP_BUY, lotSize, Ask, 3, 0, 0, HEDGED_ORDER_COMMENT, 0, 0, Green);
            }
            
            if(ticket >= 0)
            {
               hedgeOrderOpenTime = TimeCurrent();
            }
            else
            {
               Print("OrderSend failed with error #", GetLastError());
            }
         }
         
         // Check if the hedged order has been open for more than 5 minutes and is in a profit of more than 0.3 pips
         if(hedgeOrderOpenTime != 0 && TimeCurrent() - hedgeOrderOpenTime > 300)
         {
            for(int j = OrdersTotal()-1; j >= 0; j--)
            {
               if(OrderSelect(j, SELECT_BY_POS) && OrderSymbol() == Symbol() && StringCompare(OrderComment(), HEDGED_ORDER_COMMENT) == 0)
               {
                  if(OrderProfit() >= 0.3 * MarketInfo(OrderSymbol(), MODE_POINT))
                  {
                     if(OrderClose(OrderTicket(), OrderLots(), (OrderType() == OP_BUY) ? Bid : Ask, 3, CLR_NONE))
                     {
                        hedgeOrderOpenTime = 0; // Reset the hedged order open time
                     }
                  }
               }
            }
         }
      }
   }
}

void OnDeinit(const int reason)
{
   // Deinitialization code here
}
//+------------------------------------------------------------------+
