Функция mql4 для возврата orderType - PullRequest
0 голосов
/ 03 мая 2020

У меня при нажатии кнопки создается немедленный или отложенный ордер на покупку.

У меня есть функция, которая определяет, должен ли ордер быть покупкой, если текущая цена находится в пределах + - 5 пипсов от входа цена, указанная пользователем. Если цена входа больше + - 5 пипсов текущей цены, то это отложенный ордер.

Проблема заключается в том, что логи c не отправляют немедленный ордер на покупку, когда текущая цена + - 5 пипсов , Когда цена больше + - 5 пунктов, отложенные ордера выглядят нормально.

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      int whichOrderType;
      int ticket;

      double entryprice=StrToDouble(ObjectGetString(0,"EditEntry",OBJPROP_TEXT));
      double sl=StrToDouble(ObjectGetString(0,"EditSL",OBJPROP_TEXT));
      double tp=StrToDouble(ObjectGetString(0,"EditTP2",OBJPROP_TEXT));

      string name="Buy";
      if(ObjectGetInteger(0,name,OBJPROP_STATE)==true)
        {
         ObjectSetInteger(0,name,OBJPROP_STATE,false);
         whichOrderType = DecideOrderType(name, entryprice); //not complete
         ticket=OrderSend(Symbol(),whichOrderType,LotSize,Ask,50,sl,tp,NULL,MagicNumber,0,clrNONE);
        }
      name="Sell";
      if(ObjectGetInteger(0,name,OBJPROP_STATE)==true)
        {
         ObjectSetInteger(0,name,OBJPROP_STATE,false);
         whichOrderType = DecideOrderType(name,entryprice); // not complete     
         ticket=OrderSend(Symbol(),whichOrderType,LotSize,Ask,50,sl,tp,NULL,MagicNumber,0,clrNONE);
        }
     }

  }
 int DecideOrderType (string type, double entryprice)
  {

   double myAsk, myBid;

   if (type == "Buy")
   {
      myAsk = MarketInfo(Symbol(),MODE_ASK);

      //if entryprice is within 5 pips of current price then PendingOrderType = OP_BUY
      //If entryprice is below < current price then PendingOrderType = OP_BUYLIMIT
      if(myBid + 5*myPoint < entryprice)
      {
         return(OP_BUYSTOP);
      }
      if(myBid - 5*myPoint > entryprice)
      {
         return(OP_BUYLIMIT);
      }
      else
      {
         return(OP_BUY);
      }
   }
   if (type == "Sell")
   {
      myBid = MarketInfo(Symbol(),MODE_BID);

      //if entryprice is within 5 pips of current price then PendingOrderType = OP_SELL
      //If entryprice is below > current price then PendingOrderType = OP_SELLLIMIT
      //if entryprice is above > current price then PendingOrderType = OP_SELLSTOP
      if(myBid + 5*myPoint < entryprice)
      {
         return(OP_SELLLIMIT);
      }
      if(myBid - 5*myPoint > entryprice)
      {
         return(OP_SELLSTOP);
      }
      else
      {
         return(OP_SELL);
      }
   }

  }
double SetPoint()
{
   double mPoint;

   if (Digits < 4)
      mPoint = 0.01;
   else
      mPoint = 0.0001;

   return(mPoint);
}
...