Logo

Вход

Войти с помощью соц. сетей
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
  • #1 Свернуть

    Открытие и закрытие ордеров по условию

    Друзья помогите дополнить код, я не знаком с функциями OrderSend и CloseOrder. Пробовал сам решить проблему но выходит ерунда.
    MQL код:

    //----- ОТКРЫТИЕ ОРДЕРОВ
    if(Buf1<0 && Buf2==0)
    {
    Открытие ордера BUY по первому символу

    Открытие ордера SELL по второму символу
    }
    else if(Buf1>0 && Buf2==0)
    {
    Открытие ордера SELL по первому символу

    Открытие ордера BUY по второму символу
    }
    else;

    //----- ЗАКРЫТИЕ ОРДЕРОВ
    if(Buf1==0 && Buf2!=0)
    {
    Закрытие ранее открытых двух ордеров с одинаковым магиком
    }
    else;

  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от FXman1988 Посмотреть сообщение
    я не знаком с функциями OrderSend и CloseOrder.
    Так может стоит познакомиться с ними? В справке все довольно доходчиво описано. И примеры тоже есть. Если вы думаете, что тут кто-то вам выложит что-то отличное от того, что есть в справке, то вы ошибаетесь.
     

    Комментарий

    • #3 Свернуть

      Сообщение от ir0407 Посмотреть сообщение
      Так может стоит познакомиться с ними? В справке все довольно доходчиво описано. И примеры тоже есть. Если вы думаете, что тут кто-то вам выложит что-то отличное от того, что есть в справке, то вы ошибаетесь.
      MQL код:

      //----- УСЛОВИЕ ЧТОБЫ ОРДЕРА НЕ ДУБЛИРОВАЛИСЬ
      int sellcht = 0;
      int buycht = 0;
      int ordcht = 0;
      for (int i=0; i<OrdersTotal(); i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
      if(OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
      {
      sellcht++;
      ordcht++;
      }
      if(OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
      {
      buycht++;
      ordcht++;
      }
      if(OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
      {
      buycht++;
      ordcht++;
      }
      if(OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
      {
      sellcht++;
      ordcht++;
      }
      }
      }

      //----- ОТКРЫТИЕ ОРДЕРОВ
      if(Buf1 == -1.0) //----- 1-SELL, 2-BUY
      {
      if(sellcht==0 && ordcht<2)
      {
      int ticket1=OrderSend(Symbol1,OP_SELL,Lots,Bid,3,0,0," OP_SELL",Magic,0,clrRed);
      if(ticket1<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
      else Print("Функция OrderSend успешно выполнена");
      }
      //-----
      if(buycht==0 && ordcht<2)
      {
      int ticket2=OrderSend(Symbol2,OP_BUY,Lots,Ask,3,0,0,"O P_BUY",Magic,0,clrBlue);
      if(ticket2<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
      else Print("Функция OrderSend успешно выполнена");
      }
      }
      //-----
      if(Buf1 == 1.0) //----- 1-BUY, 2-SELL
      {
      if(buycht==0 && ordcht<2)
      {
      int ticket1=OrderSend(Symbol1,OP_BUY,Lots,Ask,3,0,0,"O P_BUY",Magic,0,clrBlue);
      if(ticket1<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
      else Print("Функция OrderSend успешно выполнена");
      }
      //-----
      if(sellcht==0 && ordcht<2)
      {
      int ticket2=OrderSend(Symbol2,OP_SELL,Lots,Bid,3,0,0," OP_SELL",Magic,0,clrRed);
      if(ticket2<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
      else Print("Функция OrderSend успешно выполнена");
      }
      }

      //----- ЗАКРЫТИЕ ОРДЕРОВ
      if(Buf1 == 0.0)
      {
      for (int i=0; i<OrdersTotal(); i++)
      {
      if (OrderSelect(i,MODE_TRADES)==true)
      {
      if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
      if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
      if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
      if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
      }
      //-----
      if (OrderSelect(i,MODE_TRADES)==true)
      {
      if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
      if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
      if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
      if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
      }
      }
      }


      Вот что получилось у меня, ордера бывает не открываются по второму инструменту и с закрытием те же проблемы...

      Комментарий

      • #4 Свернуть

        Сообщение от FXman1988 Посмотреть сообщение
        MQL код:

        //----- УСЛОВИЕ ЧТОБЫ ОРДЕРА НЕ ДУБЛИРОВАЛИСЬ
        int sellcht = 0;
        int buycht = 0;
        int ordcht = 0;
        for (int i=0; i<OrdersTotal(); i++)
        {
        if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
        {
        if(OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
        {
        sellcht++;
        ordcht++;
        }
        if(OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
        {
        buycht++;
        ordcht++;
        }
        if(OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
        {
        buycht++;
        ordcht++;
        }
        if(OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
        {
        sellcht++;
        ordcht++;
        }
        }
        }

        //----- ОТКРЫТИЕ ОРДЕРОВ
        if(Buf1 == -1.0) //----- 1-SELL, 2-BUY
        {
        if(sellcht==0 && ordcht<2)
        {
        int ticket1=OrderSend(Symbol1,OP_SELL,Lots,Bid,3,0,0," OP_SELL",Magic,0,clrRed);
        if(ticket1<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
        else Print("Функция OrderSend успешно выполнена");
        }
        //-----
        if(buycht==0 && ordcht<2)
        {
        int ticket2=OrderSend(Symbol2,OP_BUY,Lots,Ask,3,0,0,"O P_BUY",Magic,0,clrBlue);
        if(ticket2<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
        else Print("Функция OrderSend успешно выполнена");
        }
        }
        //-----
        if(Buf1 == 1.0) //----- 1-BUY, 2-SELL
        {
        if(buycht==0 && ordcht<2)
        {
        int ticket1=OrderSend(Symbol1,OP_BUY,Lots,Ask,3,0,0,"O P_BUY",Magic,0,clrBlue);
        if(ticket1<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
        else Print("Функция OrderSend успешно выполнена");
        }
        //-----
        if(sellcht==0 && ordcht<2)
        {
        int ticket2=OrderSend(Symbol2,OP_SELL,Lots,Bid,3,0,0," OP_SELL",Magic,0,clrRed);
        if(ticket2<0) Print("OrderSend завершилась с ошибкой #",GetLastError());
        else Print("Функция OrderSend успешно выполнена");
        }
        }

        //----- ЗАКРЫТИЕ ОРДЕРОВ
        if(Buf1 == 0.0)
        {
        for (int i=0; i<OrdersTotal(); i++)
        {
        if (OrderSelect(i,MODE_TRADES)==true)
        {
        if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
        if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
        if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
        if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
        }
        //-----
        if (OrderSelect(i,MODE_TRADES)==true)
        {
        if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
        if (OrderSymbol() == Symbol1 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
        if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_BUY) int close = OrderClose(OrderTicket(),OrderLots(),Bid,0,Gray);
        if (OrderSymbol() == Symbol2 && OrderMagicNumber() == Magic && OrderType() == OP_SELL) int close = OrderClose(OrderTicket(),OrderLots(),Ask,0,Gray);
        }
        }
        }


        Вот что получилось у меня, ордера бывает не открываются по второму инструменту и с закрытием те же проблемы...
        Если это мультик, то в какой функции OnTick() или OnTimer(), весь этот код располагаем?
        Видимо в журнале можно прочитать, что что-то не так, либо при открытии, либо при закрытии.
        Лог читай.
        Если это моно советник, то зачем лезть на другие инструменты?
        Последний раз редактировалось MonyaMaker; 25.09.2019, 17:54.

        Комментарий

        • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
        • #5 Свернуть

          Сообщение от FXman1988 Посмотреть сообщение
          ордера бывает не открываются по второму инструменту и с закрытием те же проблемы...
          Ну естественно... Вы используете разные инструменты, а цены Bid и Ask почему-то берете только с того графика, на котором висит советник. Просто напишите свои функции-оболочки вокруг нужных торговых функций, в которых организуйте правильное получение актуальных цен для инструмента переданного в функцию в качестве параметра. Базовый вариант такой функции может выглядеть примерно так.
          Код:
          //------------------------------------------------------------------------
          //Пользовательская функция SendMarketOrder()
          //Параметры:
          //  S - символ, по которому ставим ордер
          //  T - тип ордера
          //  V - объем ордера
          //  M - мейджик для ордера(необязательный параметр)
          //  C - комментарий к ордеру(необязательный параметр)
          //------------------------------------------------------------------------
          int SendMarketOrder(string S, int T, double V, int M = 0, string C = "")
          {
            double Price = 0.0; int Slippage = 3; color Color = clrNONE;
            
            switch(T)
            {
              case OP_BUY:  Price = SymbolInfoDouble(S, SYMBOL_ASK); Color = clrBlue; break;
              case OP_SELL: Price = SymbolInfoDouble(S, SYMBOL_BID); Color = clrRed;  break;
            }
            
            return(OrderSend(S, T, V, Price, Slippage, 0.0, 0.0, C, M, 0, Color));
          }
          
          //Варианты использования в коде
          Ticket1 = SendMarketOrder(Symbol1, OP_BUY, Lots);                     //Без мейджика и комментария к ордеру
          Ticket2 = SendMarketOrder(Symbol2, OP_SELL, Lots, Magic, "OP_SELL");  //С мейджиком и комментарием к ордеру
           

          Комментарий

          Сейчас онлайн

          working...
          X