#6 Pending orders added

Aberta
huzaifa.hayat desexa fusionar 2 achegas de MQL-Development/updation/pending-orders en MQL-Development/master
Modificáronse 2 ficheiros con 214 adicións e 69 borrados
  1. BIN=BIN
      blTelegramToMT4.ex4
  2. 214 69
      blTelegramToMT4.mq4

BIN=BIN
blTelegramToMT4.ex4


+ 214 - 69
blTelegramToMT4.mq4

@@ -5,7 +5,7 @@
 //+------------------------------------------------------------------+
 #property copyright "Copyright 2025, MQL Development"
 #property link      "https://www.mqldevelopment.com/"
-#property version   "1.1"
+#property version   "2.0"
 #property strict
 
 #define buy "buy"
@@ -395,6 +395,7 @@ void execute_functionality_on_new_message(int i)
             int ticket = -1;
 
             message(result,message,group_message_id,ticket);
+            pendingMessage(result,message,group_message_id,ticket);
 
             addtoMessageStructure(group_message_id,message,ticket);
 
@@ -448,102 +449,246 @@ void message(string &result[], string message, int message_id,int & tickt)
    if(ArraySize(result) >= 1)
      {
       StringSplit(result[0], ' ', lineOne);
-      if(((StringFind(result[0], "buy", 0) != -1) || (StringFind(result[0], "sell", 0) != -1)))
-        {
-
-         for(int i=0; i<ArraySize(lineOne); i++)
+      if(StringFind(result[0], "limit", 0) == -1 && StringFind(result[0], "stop", 0) == -1)
+         if(((StringFind(result[0], "buy", 0) != -1) || (StringFind(result[0], "sell", 0) != -1)))
            {
-            if(HasAlphanumeric(lineOne[i]))
+            Print(" ------------------------------- Active Message ---------------------------------- ");
+            for(int i=0; i<ArraySize(lineOne); i++)
               {
-               ArrayResize(lineOne,ArraySize(lineOne)+1);
-               lineOne[lineIndex] = lineOne[i];
-               Print("Direction and Symbol: ", lineOne[lineIndex], " index is: ", lineIndex);
+               if(HasAlphanumeric(lineOne[i]))
+                 {
+                  ArrayResize(lineOne,ArraySize(lineOne)+1);
+                  lineOne[lineIndex] = lineOne[i];
+                  Print("Direction and Symbol: ", lineOne[lineIndex], " index is: ", lineIndex);
+
+                  if(lineOne[lineIndex] == buy || lineOne[lineIndex] == sell)
+                    {
+                     direction = lineOne[lineIndex];
+                     direction_index = lineIndex;
+                     //Print(" Direction is: ", direction, " Direction Index: ", direction_index);
+                    }
+                  lineIndex++;
+                 }
+              }
+            if(ArraySize(lineOne) >= 2)
+              {
+               if(direction_index == 0)
+                 {
+                  symbol = lineOne[1];
+                  StringToUpper(symbol);
 
-               if(lineOne[lineIndex] == buy || lineOne[lineIndex] == sell)
+                  //Print(" This is Message format One (1). Where Direction is: ", direction, " Symbol: ", symbol);
+                 }
+               else
+                  if(direction_index > 0)
+                    {
+                     symbol = lineOne[0];
+                     StringToUpper(symbol);
+
+                     //Print(" This is Message format One (1). Where Direction is: ", direction, " Symbol: ", symbol);
+                    }
+              }
+            symbol = symbolMapping(symbol);
+
+            double sl = 0;
+            double tp = 0; // = result[0];
+            for(int i=0 ; i < ArraySize(result); i++)
+              {
+               // result[i] = StringTrimLeft(result[i]);
+               // result[i] = StringTrimRight(result[i]);
+               // Print("Result : ", result[i], " index is: ", i);
+               if((StringFind(result[i], "sl", 0) != -1))
+                 {
+                  string tempSl[];
+                  StringReplace(result[i],":", " ");
+                  result[i] = trimString(result[i]);
+                  result[i] = spaceRemove(result[i]);
+                  //Print(" Sl String: ", result[i]);
+                  StringSplit(result[i], ' ', tempSl);
+                  if(ArraySize(tempSl) >= 2)
+                     sl = (double) tempSl[ArraySize(tempSl) - 1];
+                  Print("Sl : ", sl);
+                 }
+               if((StringFind(result[i], "tp", 0) != -1))
                  {
-                  direction = lineOne[lineIndex];
-                  direction_index = lineIndex;
-                  //Print(" Direction is: ", direction, " Direction Index: ", direction_index);
+                  Print("Tp : ", result[i], " index is: ", i);
+                  string tempTp[];
+                  StringReplace(result[i],":", " ");
+                  result[i] = trimString(result[i]);
+                  result[i] = spaceRemove(result[i]);
+                  Print("Tp After String Replace : ", result[i], " index is: ", i);
+                  StringSplit(result[i], ' ', tempTp);
+                  //double tp = (double) tempTp[1];
+                  for(int j=0 ; j < ArraySize(tempTp); j++)
+                    {
+                     Print(" Data is: ", tempTp[j]);
+                    }
+                  if(ArraySize(tempTp) >= 2)
+                     tp = (double) tempTp[ArraySize(tempTp) - 1];
+                  Print("Tp : ", tp);
                  }
-               lineIndex++;
+              }
+            Print("Side:", direction, " Symbol: ", symbol, " Tp: ", tp, " Sl: ", sl, " Message Id: ", message_id);
+
+            if(direction == buy)
+              {
+               tickt = placeBuyTrade(symbol, OP_BUY, SymbolInfoDouble(symbol, SYMBOL_ASK), tp, sl, message_id, lotSize);
+              }
+
+            if(direction == sell)
+              {
+               tickt = placeSellTrade(symbol, OP_SELL, SymbolInfoDouble(symbol, SYMBOL_BID), tp, sl, message_id, lotSize);
               }
            }
-         if(ArraySize(lineOne) >= 2)
+     }
+  }
+//+------------------------------------------------------------------+
+//|                                                                  |
+//+------------------------------------------------------------------+
+void pendingMessage(string &result[], string message, int message_id,int & tickt)
+  {
+   string lineOne[]; // = result[0];
+   int lineIndex = 0;
+   string direction = "";
+   int direction_index = -1;
+   string symbol = "";
+
+   if(ArraySize(result) >= 1)
+     {
+      StringSplit(result[0], ' ', lineOne);
+      if(StringFind(result[0], "limit", 0) != -1 || StringFind(result[0], "stop", 0) != -1)
+         if(((StringFind(result[0], "buy", 0) != -1) || (StringFind(result[0], "sell", 0) != -1)))
            {
-            if(direction_index == 0)
+            Print(" ------------------------------- Pending Message ---------------------------------- ");
+            for(int i=0; i<ArraySize(lineOne); i++)
               {
-               symbol = lineOne[1];
-               StringToUpper(symbol);
+               if(HasAlphanumeric(lineOne[i]))
+                 {
+                  ArrayResize(lineOne,ArraySize(lineOne)+1);
+                  lineOne[lineIndex] = lineOne[i];
+                  Print("Direction and Symbol: ", lineOne[lineIndex], " index is: ", lineIndex);
 
-               //Print(" This is Message format One (1). Where Direction is: ", direction, " Symbol: ", symbol);
+                  if(lineOne[lineIndex] == buy || lineOne[lineIndex] == sell)
+                    {
+                     direction = lineOne[lineIndex];
+                     direction_index = lineIndex;
+                     //Print(" Direction is: ", direction, " Direction Index: ", direction_index);
+                    }
+                  lineIndex++;
+                 }
               }
-            else
-               if(direction_index > 0)
+            if(ArraySize(lineOne) >= 2)
+              {
+               if(direction_index == 0)
                  {
-                  symbol = lineOne[0];
+                  symbol = lineOne[1];
                   StringToUpper(symbol);
 
                   //Print(" This is Message format One (1). Where Direction is: ", direction, " Symbol: ", symbol);
                  }
-           }
-         symbol = symbolMapping(symbol);
+               else
+                  if(direction_index > 0)
+                    {
+                     symbol = lineOne[0];
+                     StringToUpper(symbol);
 
-         double sl = 0;
-         double tp = 0; // = result[0];
-         for(int i=0 ; i < ArraySize(result); i++)
-           {
-            // result[i] = StringTrimLeft(result[i]);
-            // result[i] = StringTrimRight(result[i]);
-            // Print("Result : ", result[i], " index is: ", i);
-            if((StringFind(result[i], "sl", 0) != -1))
+                     //Print(" This is Message format One (1). Where Direction is: ", direction, " Symbol: ", symbol);
+                    }
+              }
+            symbol = symbolMapping(symbol);
+
+            double price = 0;
+            double sl = 0;
+            double tp = 0; // = result[0];
+            for(int i=0 ; i < ArraySize(result); i++)
+              {
+               // result[i] = StringTrimLeft(result[i]);
+               // result[i] = StringTrimRight(result[i]);
+               // Print("Result : ", result[i], " index is: ", i);
+               if((StringFind(result[i], "open", 0) != -1))
+                 {
+                  string tempOpen[];
+                  StringReplace(result[i],":", " ");
+                  result[i] = trimString(result[i]);
+                  result[i] = spaceRemove(result[i]);
+                  //Print(" Sl String: ", result[i]);
+                  StringSplit(result[i], ' ', tempOpen);
+                  if(ArraySize(tempOpen) >= 2)
+                     price = (double) tempOpen[ArraySize(tempOpen) - 1];
+                  Print("Open : ", price);
+                 }
+               if((StringFind(result[i], "sl", 0) != -1))
+                 {
+                  string tempSl[];
+                  StringReplace(result[i],":", " ");
+                  result[i] = trimString(result[i]);
+                  result[i] = spaceRemove(result[i]);
+                  //Print(" Sl String: ", result[i]);
+                  StringSplit(result[i], ' ', tempSl);
+                  if(ArraySize(tempSl) >= 2)
+                     sl = (double) tempSl[ArraySize(tempSl) - 1];
+                  Print("Sl : ", sl);
+                 }
+               if((StringFind(result[i], "tp", 0) != -1))
+                 {
+                  Print("Tp : ", result[i], " index is: ", i);
+                  string tempTp[];
+                  StringReplace(result[i],":", " ");
+                  result[i] = trimString(result[i]);
+                  result[i] = spaceRemove(result[i]);
+                  Print("Tp After String Replace : ", result[i], " index is: ", i);
+                  StringSplit(result[i], ' ', tempTp);
+                  //double tp = (double) tempTp[1];
+                  for(int j=0 ; j < ArraySize(tempTp); j++)
+                    {
+                     Print(" Data is: ", tempTp[j]);
+                    }
+                  if(ArraySize(tempTp) >= 2)
+                     tp = (double) tempTp[ArraySize(tempTp) - 1];
+                  Print("Tp : ", tp);
+                 }
+              }
+            ENUM_ORDER_TYPE pending_side = 0;
+            if(direction == buy)
               {
-               string tempSl[];
-               StringReplace(result[i],":", " ");
-               result[i] = trimString(result[i]);
-               result[i] = spaceRemove(result[i]);
-               //Print(" Sl String: ", result[i]);
-               StringSplit(result[i], ' ', tempSl);
-               if(ArraySize(tempSl) >= 2)
-                  sl = (double) tempSl[1];
-               Print("Sl : ", sl);
+               if(price > SymbolInfoDouble(symbol, SYMBOL_ASK))
+                 {
+                  pending_side = OP_BUYSTOP;
+                 }
+               else
+                 {
+                  pending_side = OP_BUYLIMIT;
+                 }
               }
-            if((StringFind(result[i], "tp", 0) != -1))
+            if(direction == sell)
               {
-               Print("Tp : ", result[i], " index is: ", i);
-               string tempTp[];
-               StringReplace(result[i],":", " ");
-               result[i] = trimString(result[i]);
-               result[i] = spaceRemove(result[i]);
-               Print("Tp After String Replace : ", result[i], " index is: ", i);
-               StringSplit(result[i], ' ', tempTp);
-               //double tp = (double) tempTp[1];
-               for(int j=0 ; j < ArraySize(tempTp); j++)
+               if(price < SymbolInfoDouble(symbol, SYMBOL_BID))
                  {
-                  Print(" Data is: ", tempTp[j]);
+                  pending_side = OP_SELLSTOP;
+                 }
+               else
+                 {
+                  pending_side = OP_SELLLIMIT;
                  }
-               if(ArraySize(tempTp) >= 2)
-                  tp = (double) tempTp[1];
-               Print("Tp : ", tp);
               }
-           }
-         Print("Side:", direction, " Symbol: ", symbol, " Tp: ", tp, " Sl: ", sl, " Message Id: ", message_id);
+            Print("Side:", direction, " Type: ", pending_side, " Symbol: ", symbol, " Tp: ", tp, " Sl: ", sl, " Message Id: ", message_id);
 
-         if(direction == buy)
-           {
-            tickt = placeBuyTrade(symbol, tp, sl, message_id, lotSize);
-           }
+            if(direction == buy)
+              {
+               tickt = placeBuyTrade(symbol, pending_side, price, tp, sl, message_id, lotSize);
+              }
 
-         if(direction == sell)
-           {
-            tickt = placeSellTrade(symbol, tp, sl, message_id, lotSize);
+            if(direction == sell)
+              {
+               tickt = placeSellTrade(symbol, pending_side, price, tp, sl, message_id, lotSize);
+              }
            }
-        }
      }
   }
 //+------------------------------------------------------------------+
 //|                                                                  |
 //+------------------------------------------------------------------+
-int placeBuyTrade(string symbol,double tp,double sl, int messageId, double lot_size)
+int placeBuyTrade(string symbol, ENUM_ORDER_TYPE orderType, double priceIs,double tp,double sl, int messageId, double lot_size)
   {
 
    double ask = SymbolInfoDouble(symbol,SYMBOL_ASK);
@@ -552,7 +697,7 @@ int placeBuyTrade(string symbol,double tp,double sl, int messageId, double lot_s
    double buyTp  = tp;
 
 
-   int ticket = OrderSend(symbol, OP_BUY, lot_size, ask, 3, buySl, buyTp, "Buy Trade Placed.", magic_no, 0, clrBlue);
+   int ticket = OrderSend(symbol, orderType, lot_size, priceIs, 3, buySl, buyTp, "Buy Trade Placed.", magic_no, 0, clrBlue);
    Print("Buy order Print: Stop Loss: ", buySl, " Take profit: ", buyTp);
    if(ticket < 0)
      {
@@ -568,7 +713,7 @@ int placeBuyTrade(string symbol,double tp,double sl, int messageId, double lot_s
 //+------------------------------------------------------------------+
 //|                                                                  |
 //+------------------------------------------------------------------+
-int placeSellTrade(string symbol,double tp,double sl, int messageId, double lot_size)
+int placeSellTrade(string symbol, ENUM_ORDER_TYPE orderType, double priceIs,double tp,double sl, int messageId, double lot_size)
   {
 
    double ask = SymbolInfoDouble(symbol,SYMBOL_ASK);
@@ -576,7 +721,7 @@ int placeSellTrade(string symbol,double tp,double sl, int messageId, double lot_
    double sellSl = sl;
    double sellTp = tp;
 
-   int ticket = OrderSend(symbol, OP_SELL, lot_size, bid, 3, sellSl, sellTp, "Sell Trade Placed.", magic_no, 0, clrRed);
+   int ticket = OrderSend(symbol, orderType, lot_size, priceIs, 3, sellSl, sellTp, "Sell Trade Placed.", magic_no, 0, clrRed);
    if(ticket < 0)
      {
       Print("Sell Order Failed ", GetLastError());