[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 294

 
CreAndr:
Tengo una pregunta sobre la red de arrastre, que me puede decir. Parece ser el arrastre correcto para alcanzar el punto de equilibrio, pero no funciona.

Aquí hay una búsqueda: https://www.mql5.com/ru/forum/131859

Para insertar el código en el texto, pulse el botón SRC encima del campo de entrada de texto.

 
DhP:

Aquí hay una búsqueda: https://www.mql5.com/ru/forum/131859

Para insertar el código en el texto, pulse el botón SRC encima del campo de entrada de texto.


Gracias.
 
CreAndr:
Tengo una pregunta sobre la red de arrastre, quién me puede decir. Parece que el arrastre es correcto hasta el punto de equilibrio, pero no funciona.


Lista de razones en orden descendente de importancia:

1. El ordenador no está encendido

2. Metatrader no está activado.

3. El script de la carta no está instalado

4. Asesores expertos no habilitados

5. No hay nada que arrastrar.

6. Algo en el código está mal.

 
Roger:


Enumerar las razones en orden descendente de importancia:

1. El ordenador no está encendido

2. Metatrader no está activado.

3. El script de la carta no está instalado

4. Asesores expertos no habilitados

5. No hay nada que arrastrar.

6. Algo en el código está mal.

¡Gran respuesta, Roger, pero el ordenador está encendido, también lo está Metatrader, el EA está unido al gráfico, los EAs están habilitados, las operaciones se abren y por lo tanto hay algo que rastrear! Pero lo que está mal en el código, esa era la pregunta.
 
artmedia70:
Usar OrderOpenTime()
Para - ¿por qué lo necesitamos entonces?


Entonces, sí, pero el número de orden lo tengo bastante corto, pero con OrderOpenTime no entiendo qué hacer, tengo que poner la hora de apertura en algún sitio, comparar con la siguiente orden de la lista, si el tiempo es mayor, reescribir la variable, etc. Todavía no entiendo el algoritmo.


bool DeleteOrders()
{
   for(int i=0 ; i <=OrdersTotal() ; i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(Symbol()==OrderSymbol())
            {
            if(OrderType()!= OP_SELL)
               {
               int ticket=OrderTicket();
               OrderDelete(ticket);
               return(true);
               }
            }
         }
      }
return(false);
} 
 
CreAndr:
Gran respuesta, Roger, pero el ordenador está habilitado, también lo está MetaTrader, el EA está unido al gráfico, los EAs están habilitados, las operaciones están abiertas y, por tanto, ¡hay algo que rastrear! Pero lo que está mal en el código, esa era la pregunta.


Al principio no había código, lo adjuntaste después.

Probablemente porque has puesto trailing en la función de apertura de la orden, es decir, las condiciones para la apertura de una orden llegan, la orden se abre, pero no puede llegar más lejos.

 
Pyro:

Entonces, sí, pero por número de orden me quedé bastante corto, pero con OrderOpenTime no entiendo qué hacer, tengo que poner la hora de apertura en algún sitio, comparar con la siguiente orden de la lista, si el tiempo es mayor, reescribir la variable, etc. Todavía no entiendo el algoritmo.


El número de serie no es fiable, nada está garantizado en esta numeración, sólo para el probador. Un par de páginas antes, había escrito un código para buscar la última orden cerrada. Es muy sencillo, hemos mirado el billete, luego hemos elegido el orden o la posición según el billete, y ya está:

  int lastclosetime=-1;
  int lastcloseticket=-1;
  int lastdealtype=0;

  for (int i=0; i<OrdersHistoryTotal(); i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; 
    if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 
    {
      if (lastclosetime<OrderCloseTime()) 
      {
        lastclosetime=OrderCloseTime();
        lastcloseticket=OrderTicket();
      }
    }
  }

  if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 
  {
    if (OrderType()==OP_BUY) lastdealtype=1;
    if (OrderType()==OP_SELL) lastdealtype=-1;   
  }
 
Figar0:


El número de pedido no es fiable, nadie garantiza nada en esta numeración, sólo para el probador. Un par de páginas antes escribí un código para encontrar la última orden cerrada, lo mismo para las abiertas. Todo es sencillo, hemos pasado por él, recordamos el billete, luego elegimos una orden o una posición por el billete, y ya está:

Gracias, es muy sencillo. Lo investigaré.
 
Roger:


Al principio no había código, lo añadieron después.

Probablemente porque has puesto trailing en la función de apertura de la orden, es decir, las condiciones para la apertura de la orden se dan, la orden se abre, pero no puede llegar más lejos.

Ya veo, gracias.
 
Figar0:


El número de pedido no es fiable, nadie garantiza nada en esta numeración, sólo para el probador. Un par de páginas antes escribí código para encontrar la última orden cerrada, lo mismo para las abiertas. Es muy sencillo, hemos mirado el ticket, luego hemos elegido una orden o una posición por el ticket y ya está:

El código está mal.

En primer lugar, aquí está esto:

if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 

Si el símbolo de orden es igual al símbolo dado en la variable de símbolo o la magia de orden es igual a la magia... Por lo tanto, si se selecciona cualquier orden con el símbolo y el magik es diferente o falta, se cumplirá la condición. Porque es esto o aquello. En consecuencia, deberíamos sustituir o por o, o mejor, separar las comprobaciones en cadenas separadas - el bucle será más rápido, lo que es crucial para la optimización.

Además... Pick by ticket: El parámetro pool se ignora, es decir, no tiene sentido escribirlo aquí.

if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 

Una vez que la orden ha sido seleccionada con éxito por ticket, debemos comprobar de qué lista de órdenes ha sido seleccionada: las de mercado o las cerradas. Para ello, tenemos que comprobar la hora de cierre de la orden, y si es superior a cero, entonces la orden se ha cerrado definitivamente. Este parámetro es siempre igual a cero para las posiciones abiertas. En mi opinión, después de elegir la última orden, deberíamos comprobar su tipo inmediatamente y escribirlo en la variable.

La función tendrá ahora este aspecto:

int   GetTypeLastClosePos(int symbol, int magic)   // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int   i, lastclosetime=0, 
         lastdealtype=-1;

   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в истории
         if (OrderSymbol()!=symbol)          continue;   // Если его символ не равен переданному в функцию - идём к следующему
         if (OrderMagicNumber()!=magic)      continue;   // Если его магик не равен переданному в функцию - идём к следующему
         if (OrderType()>1)                  continue;   // Если ищем только Бай и Селл, значит если больше единицы - к следующему
         // ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типу
         if (lastclosetime<OrderCloseTime()) {           // Посмотрим время его закрытия и если оно больше предыдущего, то...
            lastclosetime=OrderCloseTime();              // ... запишем его как предыдущее
            lastdealtype=OrderType();                    // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
            }
         }
      else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",GetLastError());  // Посмотрим номер ошибки
         break;                                                // Выходим из цикла перебора ордеров
         }
      }
   return(lastdealtype);
}

Ahora, si queremos comprobar sólo la compra o la venta del gráfico actual y cuál de ellas fue la última cerrada, debemos llamar a esta función de la siguiente manera:

int LastPoseType=GetTypeLastClosePos(Symbol(), Magic);
if (LastPoseType==OP_BUY) {
   // ... код, если последний закрытый Buy ...
   }
if (LastPoseType==OP_SELL) {
   // ... код, если последний закрытый Sell ...
   }
else {// ... код обработки ошибки ... }

Para el manejo de errores podemos, en principio, crear una variable global, por ejemplo int err; y en el cuerpo de la propia función almacenar el número de error en esta variable:

else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         err=GetLastError();                                                     // Посмотрим номер ошибки
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",err);       // Сообщим об ошибке и в какой ф-ции она произошла
         break;                                                                  // Выходим из цикла перебора ордеров
         }

A continuación, para procesar el error después de llamar a la función ...

GetTypeLastClosePos(Symbol(), Magic);

... y se produce un error, su número se almacenará en la variable err y en el bloque de procesamiento se procesará este número.

else {
   if (err==???) {
      // обработка этой ошибки
      }
   if (err==???) {
      // обработка этой ошибки
      }
// ... и т.д. ...
   }

Mejor aún, utilice el interruptor