Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1664

 
Taras Slobodyanik #:

Você ainda precisa verificar as condições em cada novo tick, e se não funcionou no tick anterior, ele mudará no novo.

E o tratamento de erros tem de ser feito.

Se você fizer isso através de uma matriz, então verifique apenas as carrapatas das ordens modificadas escritas nela contra todas as outras.

MakarFX #:
É mais ou menos isso mesmo, sim, obrigado. Nesse caso, se você economizar em objetos, é melhor ter majicies únicas em vez de bilhetes, caso contrário, haverá dezenas de objetos com o mesmo nome.

StringToInteger(ObjectName(0,i,0)
Uma gralha? Penso que ambas as funções só podem assumir um parâmetro.
 
Документация по MQL5: Графические объекты / ObjectName
Документация по MQL5: Графические объекты / ObjectName
  • www.mql5.com
ObjectName - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nerd Trader #:
Se você fizer isso através de uma matriz, então verifique apenas os carrapatos das ordens modificadas que lhe foram escritas contra todas as outras.

Sobre direito, sim, obrigado. Nesse caso, se estamos economizando para objetos, é melhor termos majicks únicos em vez de bilhetes, caso contrário, haverá dezenas de objetos com o mesmo nome.

Uma gralha? Penso que ambas as funções só podem assumir um parâmetro.

Eles não o farão.

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

Desculpe

StringToInteger(ObjectName( i));
 
MakarFX #:

Eles não o farão.

Desculpe

A propósito, por acaso você sabe por que o seguinte erro ocorre periodicamente? Para 100 pedidos abertos com sucesso, há cerca de 10 deles.

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.81349970706815862e-262 - preço de stopploop, claramente este número não deve ser.
4051 - "Valor inválido do parâmetro de função"
- é este o tipo de pedido? Também não deve ser um problema com isso.

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 #:
Você quer dizer "mínimo e máximo" por bilhete ou preço?

Por bilhete

 
Nerd Trader #:

A propósito, por acaso você sabe por que o seguinte erro ocorre periodicamente? Para 100 pedidos abertos com sucesso, há cerca de 10 deles.

order.sl_price: 2.813499706815862e-262 - stop price, claramente este número não deve ser.
4051 - "Valor inválido do parâmetro de função"
- é este o tipo de pedido? Também não deve haver nenhum problema com isso.

Tente mover "NormalizeDuplo".

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 #:

Por bilhete

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 #:

Tente mover "NormalizeDuplo".

inalterado.

 
MakarFX #:

Makar inseriu código no EA até agora apenas para comparar lucro em moeda e lucro em pips até onde eu entendo que pode ser entendido quando essas funções têm valores zero