Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1620

 
Una variable, no una cita. Hay un recuento en una variable de cadena, y el doble se convierte en una variable de cadena con la precisión especificada. Esto es, por supuesto, fuerte.
 
Por cierto, esto es sobre el tema de una cotización en cinco dígitos que viene con más de cinco decimales. Quería hacer una comprobación automática, resulta que no es tan fácil en este lenguaje. Mientras tanto, lo he comprobado manualmente con una impresora. No hay más de cinco decimales, ¿con qué frecuencia ocurre eso? ¿Tal vez fue en la terminal 4?
 
De acuerdo, hay una ignorancia sistemática de los mensajes. Deberíamos iniciar un hilo de nuevo.
 
pribludilsa #:
Bien, hay una ignorancia sistemática de los mensajes. Deberíamos iniciar un hilo de nuevo.

ya ha habido temas sobre este asunto. En una cadena y el número de cadenas a contar. En realidad, primero hay que contar el número de dígitos antes del punto decimal. Puedes convertirlo en un número entero. Y es igual de incómodo de encadenar))))

 
Alexey Viktorov #:

En el probador de mt4 no es posible abrir órdenes en otros pares, todo lo demás está disponible sin problemas.

Gracias, efectivamente es posible obtener los valores de los indicadores de otro instrumento en el probador.
Alexander #:

Compruebe la disponibilidad de las cotizaciones del AUDUSD, en la TF correcta

Ese era exactamente el problema. El asunto es que estaba probando en un día libre (domingo) y "descargué" un archivo de cotizaciones para el símbolo requerido (AUDUSD), pero resultó que simplemente no se podían descargar en el día libre, porque los servidores de mi corredor de divisas no estaban disponibles en ese día libre. Y hoy lunes la descarga del archivo de cotizaciones y las pruebas fueron exitosas.
MakarFX #:
Lo siento, me equivoqué, no lo sabía.
No pasa nada, tus respuestas en los mensajes privados eran mucho más valiosas.

Es muy agradable que la gente responda y se ayude aquí. No todas las respuestas se encuentran en la documentación)
 
Valeriy Yastremskiy #:

ya ha habido temas sobre este asunto. En una cadena y el número de cadenas a contar. En realidad, primero hay que contar el número de dígitos antes del punto decimal. Puedes convertirlo en un número entero. Y también es un poco complicado llevar)))) a una cadena.

Sí, yo también quería hacer eso, sólo la conversión de doble a cadena se hace con la precisión especificada, si no se especifica la precisión, 8 dígitos por defecto.

 
Valeriy Yastremskiy #:

ya ha habido temas sobre este asunto. En una cadena y el número de cadenas a contar. En realidad, primero hay que contar el número de dígitos antes del punto decimal. Puedes convertirlo en un número entero. Y es igual de incómodo de encadenar))))

La conversión de enteros, sí, es probablemente la única. A mí también se me ocurrió, pero me pareció demasiado complicado hacer algún tipo de ciclo de multiplicación o división por 10. Todavía no lo he pensado bien.
 
MakarFX #:
//+----------------------------------------------------------------------------+
//| Модификация ордеров                           |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
 double
   BuyPriceMax = 0, BuyPriceMin = 0, BuyPriceMaxLot = 0, BuyPriceMinLot = 0, 
   SelPriceMin = 0, SelPriceMax = 0, SelPriceMinLot = 0, SelPriceMaxLot = 0;

   int
   BuyPriceMaxTic = 0, BuyPriceMinTic = 0, SelPriceMaxTic = 0, SelPriceMinTic = 0;

   double
   op = 0, lt = 0, order_lots = 0;

   int
   tk = 0, b = 0, s = 0;
   price = 0;tp = 0;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderMagicNumber() == Magic)
            if(OrderSymbol() == Symbol() &&  OrderType() == otype)
              {
               op = NormalizeDouble(OrderOpenPrice(), Digits());
               lt = NormalizeDouble(OrderLots(), 2);
               tk = OrderTicket();
               if(otype == OP_BUY)
                 {
                  b++;
                  if(op > BuyPriceMax || BuyPriceMax == 0)
                    {
                     BuyPriceMax    = op;
                     BuyPriceMaxLot = lt;
                     BuyPriceMaxTic = tk;
                    }
                  if(op < BuyPriceMin || BuyPriceMin == 0)
                    {
                     BuyPriceMin    = op;
                     BuyPriceMinLot = lt;
                     BuyPriceMinTic = tk;
                    }
                 }
               
               if(otype == OP_SELL)
                 {
                  s++;
                  if(op > SelPriceMax || SelPriceMax == 0)
                    {
                     SelPriceMax    = op;
                     SelPriceMaxLot = lt;
                     SelPriceMaxTic = tk;
                    }
                  if(op < SelPriceMin || SelPriceMin == 0)
                    {
                     SelPriceMin    = op;
                     SelPriceMinLot = lt;
                     SelPriceMinTic = tk;
                    }
                 }
               if (otype == OP_BUY || otype == OP_SELL) 
                  {
                   price += OrderOpenPrice() * OrderLots();
                   order_lots += OrderLots();
                  }
              }
//*************************************************************//
double   AwerageBuyPrice = 0, AwerageSelPrice = 0, avg_price = 0;
      if(b >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
         AwerageBuyPrice = NormalizeDouble((BuyPriceMax*BuyPriceMaxLot + BuyPriceMin*BuyPriceMinLot)/
         (BuyPriceMaxLot + BuyPriceMinLot) + TakeProfitMinMaxOrder* Point(), Digits());
      if(s >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
         AwerageSelPrice = NormalizeDouble((SelPriceMax * SelPriceMaxLot + SelPriceMin * SelPriceMinLot)/ 
         (SelPriceMaxLot + SelPriceMinLot) - TakeProfitMinMaxOrder* Point(), Digits());
      if (Drawdown < DrawdownClosingMinMaxOrder) 
         avg_price = NormalizeDouble(price / order_lots, Digits);
//*************************************************************//
   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderMagicNumber() == Magic)
            if(OrderSymbol() == Symbol())
              {
               op  = NormalizeDouble(OrderOpenPrice(), Digits());
               tp = NormalizeDouble(OrderTakeProfit(), Digits());
               lt  = NormalizeDouble(OrderLots(), 2);
               tk  = OrderTicket();

                  if(otype == OP_BUY && b >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
                    {
                     if(tk == BuyPriceMaxTic || tk == BuyPriceMinTic)
                        if(Bid < AwerageBuyPrice && tp != AwerageBuyPrice)
                           if(!OrderModify(tk, op, OrderStopLoss(), AwerageBuyPrice, 0, clrRed))
                              Print("OrderModify error #", GetLastError());

                     if(tk != BuyPriceMaxTic && tk != BuyPriceMinTic && tp != 0)
                        if(!OrderModify(tk, op, 0, 0, 0, clrRed))
                           Print("OrderModify error #", GetLastError());
                    }
                  if(otype == OP_SELL && s >= 2  && Drawdown >= DrawdownClosingMinMaxOrder)
                    {
                     if(tk == SelPriceMaxTic || tk == SelPriceMinTic)
                        if(Ask > AwerageSelPrice && tp != AwerageSelPrice)
                           if(!OrderModify(tk, op, OrderStopLoss(), AwerageSelPrice, 0, clrRed))
                              Print("OrderModify error #", GetLastError());

                     if(tk != SelPriceMaxTic && tk != SelPriceMinTic && tp != 0)
                        if(!OrderModify(tk, op, 0, 0, 0, clrRed))
                           Print("OrderModify error #", GetLastError());
                    }
                 if (Drawdown < DrawdownClosingMinMaxOrder)    
                 if (otype == OP_BUY) tp = NormalizeDouble (avg_price + TakeProfitGroupOrder*Point, Digits);
                 if (otype == OP_SELL) tp = NormalizeDouble (avg_price - TakeProfitGroupOrder*Point, Digits); 
                    {
                    if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                      Print("Ордера успешно модифицированы!");
                      else Print("Ошибка модификации ордеров!");
                    } 
             } 
}
 
Valeriy Yastremskiy #:

¿Hay algo que no sepa? Tampoco es posible obtener datos de barras de otros instrumentos por la hora del probador, se recibirán por la hora actual. Por eso no puedo probar la multidivisa ni siquiera en la parte de cálculo en 4ka.

Siempre he pensado que el probador de MT4 emula completamente el entorno de un instrumento, y MT5 todo el entorno que está disponible.

¿O no es así?

Valery, presta atención a la línea

  sd = (int)MarketInfo("EURJPY", MODE_DIGITS);

en mi código... He estado usando las funciones hexagonales durante mucho tiempo, pero aquí hay una función similar

SymbolInfoInteger("EURJPY", SYMBOL_DIGITS);

dio un stackey 0.

Por lo tanto, piensa en dónde está el error... Y como mt4 se niega a dar soporte, puedes asumir que nunca será arreglado...

Hay que comprobar todo lo demás. Hace tanto tiempo que no me ocupo de ello que no quiero ni acordarme.

 

Alexey Viktorov #:

Llevo mucho tiempo utilizando las funciones de los viernes

¿Pueden sugerirme dónde puedo aprender MQL5 (en ruso)?