Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1481

 
Alexey Viktorov #:

Puedes escribirlo como quieras, lo principal es escribir un carácter inexistente para obtener un error....

¡¡¡Pero no me tires zapatillas!!! No me sale el código de error. ((((

void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   string symb = "BrooklinUSDrfd";
   PositionSelect(symb);
   PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = ", symb, GetLastError());
  }

Saludos, Vladimir.

 
MrBrooklin #:
Error = "
El especificador %lu debería estar ahí
 
Artyom Trishkin #:
Debería haber un especificador allí

Gracias Artem, ¡¡¡ha funcionado!!! ¡Muchas gracias a todos!

Saludos, Vladimir.

 

En resumen, resuelto el problema descrito aquí de una manera diferente:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   if(!PositionSelect(_Symbol))
      PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = %lu", _Symbol, GetLastError());
   int pos_total = PositionsTotal(); // объявим переменную для хранения количества открытых позиций
   if(pos_total > 0) // если есть открытые позиции
     {
      for(int i=0; i<pos_total; i++) // запустим цикл и переберём все открытые позиции
        {
         if(PositionGetSymbol(i) == _Symbol) // выберем все открытые позиции по текущему символу
           {
            ulong  pos_id = PositionGetInteger(POSITION_IDENTIFIER);
            double pos_price = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = PositionGetDouble(POSITION_TP);
            double pos_sl = PositionGetDouble(POSITION_SL);
            PrintFormat("Позиция #%d цена = %G тейк-профит = %G стоп-лосс = %G", pos_id, pos_price, pos_tp, pos_sl);
           }
        }
     }
  }
//+------------------------------------------------------------------+

Saludos, Vladimir.

 

¡Buenas tardes a todos!

Estoy intentando crear una función que abra una posición adicional (sin stop and take) a una posición abierta existente. He escrito el código:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Add_Pos_Buyl()
  {
   for(int i=pos_total-1; i<pos_total; i++) // ищем последнюю по списку открытую позицию
     {
      PositionGetTicket(i); // получим тикет позиции по индексу в списке открытых позиций
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && // если совпадает символ открытой позиции
         PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && // если совпадает тип открытой позиции
         PositionGetInteger(POSITION_MAGIC) == Magic_Number) // и если совпадет мэджик
        {
         double pos_price_open=PositionGetDouble(POSITION_PRICE_OPEN); // объявим и инициализируем переменную для цены открытой позиции
         if(// тут задано условие для открытия позиции)
           {
            double new_price_pos=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            trade.Sell(0.01,_Symbol,new_price_pos,0,0);
           }
        } 
     }
  }

pero por alguna razón no ve la posición abierta. Traté de encontrar el problema con el depurador, pero después de iniciar el bucle de inmediato sale de la función sin ver lo que está escrito en su interior. Puse el punto de interrupción en PositionGetTicket(i). ¿Podría decirme de nuevo dónde tengo un error en mi código?

Saludos, Vladimir.

 
MrBrooklin posición abierta existente. He escrito el código:

pero por alguna razón no ve la posición abierta. He tratado de encontrar el problema con el depurador, pero después de iniciar el bucle de inmediato sale de la función sin ver lo que está escrito en su interior. Puse el punto de interrupción en PositionGetTicket(i). ¿Podría decirme de nuevo dónde tengo un error en mi código?

Saludos, Vladimir.

¿Qué es pos_total?

 
Alexey Viktorov #:

¿A cuánto equivale pos_total?

Hola Alexey, la variable pos_total=PositionsTotal(), pero estaba puesta a nivel global. Ahora la he movido dentro de la función y resulta que ese era el problema. Todo funcionaba. ¿Cual es el problema? ¡¡¡No he entendido nada del truco!!!

Ahora, por experimentar, he vuelto a mover pos_total al nivel global y ha vuelto a dejar de funcionar, pero al ponerlo dentro de la función, ¡¡¡funciona como debe!!!. ¡¡¡¡Menudos milagros, bueno, al menos para mi!!!! )))

Resulta que una variable a nivel global no puede ser inicializada por una función? ¿Es así?

Saludos, Vladimir.

 
MrBrooklin #:

Hola Alexey, la variable pos_total=PositionsTotal(), solo estaba puesta a nivel global. Ahora la he movido dentro de la función y resulta que ese era el problema. Todo funcionaba. ¿Cual es el problema? ¡¡¡No entiendo nada de la broma!!!

Ahora, por experimentar, he vuelto a mover pos_total al nivel global y ha vuelto a dejar de funcionar, pero al ponerlo dentro de la función, ¡¡¡funciona como debe!!!. ¡¡¡¡Menudos milagros, bueno, al menos para mi!!!! )))

Resulta que una variable a nivel global no puede ser inicializada por una función? ¿Es eso cierto?

Saludos, Vladimir.

A veces se puede, pero no todas las variables. En este caso, cuando ejecutas el EA, todavía no ve las posiciones abiertas y la variable es igual a cero....

En realidad, ayer experimenté con el muestreo de posiciones y llegué a la conclusión de que PositionsTotal() se necesita sólo para determinar el número de posiciones. Y este número es necesario sólo para limitar el bucle.

Aquí está tal bucle

  int i = 0;
  while(bool(posTicket = PositionGetTicket(i)) && !IsStopped())
   {
    string posSymbol = PositionGetString(POSITION_SYMBOL);
    double posPrice = PositionGetDouble(POSITION_PRICE_OPEN),
           pos_tp = PositionGetDouble(POSITION_TP),
           pos_sl = PositionGetDouble(POSITION_SL);
    printf("%s Ticket %d цена = %g тейк-профит = %g стоп-лосс = %g", posSymbol, posTicket, posPrice, pos_tp, pos_sl);
    i++;
   }


funciona incluso si antes se obtiene una lista de órdenes o de operaciones del historial. Uno de estos días voy a comprobar si la selección de órdenes pendientes interferirá con él.


Y en tu caso es más fácil escribir sin bucle

      PositionGetTicket(PositionsTotal()-1); // получим тикет позиции

si necesitas la última posición...

 
Alexey Viktorov #:
En este caso, al iniciar el EA, éste no ve posiciones abiertas todavía y la variable es igual a cero ...

Estaría de acuerdo contigo, pero aquí está el problema - cuando puse la variable pos_total en el nivel global, el EA no vio posiciones abiertas durante todo el periodo de prueba, aunque se abrieron más de 50 posiciones durante este periodo. ¡No lo entiendo! Resulta que esta opción no funciona?

Saludos, Vladimir.

 
Alexey Viktorov #:

En tu caso es más fácil escribir sin bucle

si necesitas la última posición...

Estoy de acuerdo, si no tuviera varias posiciones abiertas en un símbolo diferente y en diferentes direcciones. Me refiero a comprar y vender. ¡Pero gracias por la sugerencia de todos modos!

Saludos, Vladimir.