Search code examples
mql4metatrader4

Check if number of OrdersHistoryTotal in Metatrader 4 trade history changed


I would like to fire a function as soon as a trade was closed (= the OrdersHistoryTotal increased by at least 1).

Is there any handler in MQL4 for such scenarios?

In my particular setup I have the following function pushSocket which should only push data in case the OrdersHistoryTotal changed.

int i,hstTotal=OrdersHistoryTotal();
string historical_trades = "";

for(i=0;i<hstTotal;i++)
   {
        if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;
        historical_trades = historical_trades +
           "historical_trades|" +
           version + "|" +
           DID + "|" +
           AccountNumber() + "|" +   
           IntegerToString(OrderTicket()) + "," +
           TimeToString(OrderOpenTime(), TIME_DATE|TIME_SECONDS) + "," +
           TimeToString(OrderCloseTime(), TIME_DATE|TIME_SECONDS) + "," +
           IntegerToString(OrderType()) + "," +
           DoubleToString(OrderLots(),2) + "," +
           OrderSymbol() + "," +
           DoubleToString(OrderOpenPrice(),5) + "," +
           DoubleToString(OrderClosePrice(),5) + "," +
           DoubleToString(OrderStopLoss(),5) + "," +
           DoubleToString(OrderTakeProfit(),5) + "," +
           DoubleToString(OrderCommission(),2) + "," + 
           DoubleToString(OrderSwap(),2) + "," +
           DoubleToString(OrderProfit(),2) + "," +
           "<" + OrderComment() + ">|";
    }    

      pushSocket.send(StringFormat("%s", historical_trades, true));

I tried to insert a counter to compare it but the counter is deleted every time on memory clean-up.. The above function is nested in a onTick function which executes every second.


Solution

  • There is a function OnTradeAction() in MQL5 that is called every time some trading action is done. But unfortunately this function is not available in MQL4. On the other hand, you can implement a function inside OnTick() that will check that HistoryTraderTotal() increased compared to the previously saved value, and do all the steps you like in that case. A bit more work but almost the same.

    OnTimer(){
        Mt4OnTradeAction();
        otherLogic();
    } 
    
    Mt4OnTradeAction(){ 
        static int historyTradesTotal=0;
        if(HistoryTradesTotal()==historyTradesTotal) return; 
        historyTradesTotal = HistoryTradesTotal(); 
        processingTrade();
    }