Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1664

 
Taras Slobodyanik #:

так ведь всё равно нужно проверять условия на каждом новом тике, если не сработало на предыдущем тике - изменится на новом.

ну и обработку ошибок нужно делать.

Если делать через массив, то сверять только записанные в него тикеты модиф-ых ордеров со всеми остальными.

MakarFX #:
Примерно так, да, спасибо. В таком случае если сохранятся в объекты, то лучше уже уникальные маджики вместо тикетов, иначе наплодятся десятки объектов с одинаковыми названиями.

StringToInteger(ObjectName(0,i,0)
Опечатка? Вроде обе функции могут принимать только один параметр.
 
Документация по MQL5: Графические объекты / ObjectName
Документация по MQL5: Графические объекты / ObjectName
  • www.mql5.com
ObjectName - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nerd Trader #:
Если делать через массив, то сверять только записанные в него тикеты модиф-ых ордеров со всеми остальными.

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

Опечатка? Вроде обе функции могут принимать только один параметр.

Не наплодятся

if(ObjectName(i)!=OrderTicket()) ObjectDelete(0,ObjectName(i));

Сорри

StringToInteger(ObjectName(i));
 
MakarFX #:

Не наплодятся

Сорри

Кстати случаем не знаешь почему периодически возникает следующая ошибка? На 100 удачно открытых ордера, где-то 10 таких.

2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: 4051 | order.sl_price: 2.813499706815862e-262
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: OrderSend error 4051
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: unknown trade cmd 406958564 for OrderSend function

order.sl_price: 2.813499706815862e-262 - цена стоплоса, явно такого числа не должно быть.
4051 - "Недопустимое значение параметра функции"
unknown trade cmd - это тип ордера? С этим тоже не должно быть проблем.

class Order{
  public:
    double open_price;
    double sl_price;
    double tp_price;
    color  arrow_color;
    string error_text;
    int cmd;

    Order(){};

    void InitForSell(string type = ""){
      if(type == ""){
        Print("Ошибка: 'type' должен иметь значение");
        return;
      }

      sl_price = NormalizeDouble(db_last.hight + (sl_indent*Point), Digits); // (цена + (кол-во пипсов*Point)


      arrow_color = clrRed;

      if(type == "sellstop"){
        open_price = NormalizeDouble(db_last.low - (order_indent*Point), Digits);

        if(tp_size != 0)
          tp_price = NormalizeDouble(db_last.low - (order_indent+tp_size)*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_SELLSTOP;
        error_text = "Ошибка открытия селстопа ";
      }

      if(type == "sell"){
        open_price = Bid;

        if(tp_size != 0)
          tp_price = NormalizeDouble(Bid - tp_size*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_SELL;
        error_text = "Ошибка открытия села ";
      }
    };

    void InitForBuy(string type = ""){
      if(type == ""){
        Print("Ошибка: 'type' должен иметь значение");
        return;
      }

      sl_price = NormalizeDouble(db_last.low - (sl_indent*Point), Digits); // (цена + (кол-во пипсов*Point)


      arrow_color = clrGreen;

      if(type == "buystop"){
        open_price = NormalizeDouble(db_last.hight + (order_indent*Point), Digits);

        if(tp_size != 0)
          tp_price = NormalizeDouble(db_last.hight + (order_indent+tp_size)*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_BUYSTOP;
        error_text = "Ошибка открытия байстопа ";
      }

      if(type == "buy"){
        open_price = Ask;

        if(tp_size != 0)
          tp_price = NormalizeDouble(Bid + tp_size*Point, Digits);
        else
          tp_price = 0;

        cmd = OP_BUY;
        error_text = "Ошибка открытия бая ";
      }
    };

    ~Order(){};
};

//-------------------------------------------

if(...)
  {
    ResetLastError();
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, order.open_price, 1, 
    order.sl_price, order.tp_price, "", 0, 0, order.arrow_color);

    if(order_send == -1) return;
  }
 
MakarFX #:
Ты имеешь ввиду "мин и макс" по тикетам или цене?

По тикетам

 
Nerd Trader #:

Кстати случаем не знаешь почему периодически возникает следующая ошибка? На 100 удачно открытых ордера, где-то 10 таких.

order.sl_price: 2.813499706815862e-262 - цена стоплоса, явно такого числа не должно быть.
4051 - "Недопустимое значение параметра функции"
unknown trade cmd - это тип ордера? С этим тоже не должно быть проблем.

Попробуй перенести "NormalizeDouble"

if(...)
  {
    ResetLastError();
    int order_send = OrderSend(Symbol(), order.cmd, 0.01, NormalizeDouble(order.open_price, Digits), 1, 
    NormalizeDouble(order.sl_price, Digits), NormalizeDouble(order.tp_price, Digits), "", 0, 0, order.arrow_color);

    if(order_send == -1) return;
  }

 
EVGENII SHELIPOV #:

По тикетам

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderTicket()== GetTicketMaxMinOrder(0) || OrderTicket()== GetTicketMaxMinOrder(1) ) {
             p=MarketInfo(OrderSymbol(), MODE_POINT);
             if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
             if (OrderType()==OP_BUY) {
               pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
             }
             if (OrderType()==OP_SELL) {
               pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
            }
          }
        }
      }
    }
  }
  return(pr);
}
 
MakarFX #:

Попробуй перенести "NormalizeDouble"

без изменений

 
MakarFX #:

Макар вставил код в советник пока только чтобы сравнить профит в валюте и профит в пунктах насколько я понимаю это можно понять когда у этих функций нулевые значения 


Причина обращения: