Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 29

 
yaaarik777:

¡Buenos días a todos! ¿Puede usted por favor aconsejar cómo establecer un borrado de órdenes en un EA?

La situación es la siguiente:

Colocamos 2órdenes pendientes en diferentes direcciones, en cuanto una de ellas se dispara, la otra se elimina y deja de estar expuesta.

Estaría muy agradecido por cualquier ayuda.

Gracias.

Por ejemplo:

//-------------------------------------------------------------------+
//   удаляет отложенные ордера по type                               +
//+------------------------------------------------------------------+

void DeleteOrders(int type)
{
  int cnt = OrdersTotal();
  for (int i=cnt-1; i>=0; i--) {
        if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
        //По желанию
        if (OrderSymbol() != Symbol()) continue;
        //По желанию
        if (OrderMagicNumber() != mn) continue;
        
        if (OrderType() != type) continue;
        
        if (type == OP_BUYSTOP || type == OP_SELLSTOP)
            {
            bool Del_1 = OrderDelete(OrderTicket());
               if(!Del_1)
                  Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
               else
                  Print("Ордер успешно удален.");
            }
        if (type == OP_BUYLIMIT || type == OP_SELLLIMIT)
            {
            bool Del_2 = OrderDelete(OrderTicket());  
               if(!Del_2)
                  Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
               else
                  Print("Ордер успешно удален.");
            }
  }
}
//+------------------------------------------------------------------+
 

Y antes de eso, determinar que hay una posición y es el momento de matar la orden extra

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
 
Vladimir Zubov:

Por poner un ejemplo:

//-------------------------------------------------------------------+
//   удаляет отложенные стоп ордера SELLSTOP или BUYSTOP по type     +
//+------------------------------------------------------------------+

void DeleteOrders(int type)
{
  int cnt = OrdersTotal();
  for (int i=cnt-1; i>=0; i--) {
        if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
        //По желанию
        if (OrderSymbol() != Symbol()) continue;
        //По желанию
        if (OrderMagicNumber() != mn) continue;
        
        if (OrderType() != type) continue;
        
        if (type == OP_BUYSTOP || type == OP_SELLSTOP)
            {
            bool Del_1 = OrderDelete(OrderTicket());
               if(!Del_1)
                  Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
               else
                  Print("Ордер успешно удален.");
            }
        if (type == OP_BUYLIMIT || type == OP_SELLLIMIT)
            {
            bool Del_2 = OrderDelete(OrderTicket());  
               if(!Del_2)
                  Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
               else
                  Print("Ордер успешно удален.");
            }
  }
}
//+------------------------------------------------------------------+

¿Cuál es la segregación por tipo? ¿Qué hace? ¿Habría alguna diferencia si se escribiera así?

if (type > 1 && type < 6)
   {
     bool Del_1 = OrderDelete(OrderTicket());
     if(!Del_1)
     Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
     else
     Print("Ордер успешно удален.");
   }
 
¿Por qué las barras son diferentes en mt4 y mt5 en mi iPhone? Aunque el horario de apertura y cierre de los bares es el mismo. Esto es claramente un obstáculo porque la línea no se rompió ayer a las 14:00 en MT4.
Archivos adjuntos:
image.png  82 kb
image.png  81 kb
 
¿Ya no se admite la versión del terminal?(( Si es así, ¿dónde puedo descargar una que funcione?
 
MetaGSss:
¿Por qué las barras son diferentes en mt4 y mt5 en mi iPhone? Aunque el horario de apertura y cierre de los bares es el mismo. Evidentemente, le impide superar la línea de ayer a las 14:00 en MT4.
Quieren que sepas de antemano por dónde va a ir el precio
 
MetaGSss:
¿Por qué las barras son diferentes en mt4 y mt5 en mi iPhone? Aunque el horario de apertura y cierre de los bares es el mismo. Esto es claramente un obstáculo, porque ayer en mt4 la línea no se rompió a las 14:00.
la difusión es para la gente extrema por supuesto)))
 
MetaGSss:
¿Por qué las barras son diferentes en mt4 y mt5 en mi iPhone? Aunque el horario de apertura y cierre de los bares es el mismo. Obviamente interfiere porque la línea no se rompió ayer a las 14:00 en MT4.
los símbolos también son ligeramente diferentes)
 

- последние четыре строчки в общем понятны, вопрос лишь в функции PlaySound,  код которой необходимо вставить после каждой строчки "Print("..." в таком виде: 

bool PlaySound(

string payment // nombre del archivo

)

; ...

¿O también se convierte de alguna manera

?

Declare

bool PlaySound( en la cabecera del programa - tendrá la oportunidad de activar y desactivar el sonido en el archivo de conjunto extern bool Play = TRUE;

además, ¿qué imprimirá Print? ¿Y en qué condiciones?

¿Qué sentido tiene esta acción? ¿Reproducir un sonido cuando se cierra la orden y escribir un comentario (en TP o SL)?






GraciasA1exPit por la respuesta detallada y clara ... "El punto de la acción" es sonar los eventos de "cierre de órdenes en Takeprofit y Staploss" = un sonido diferente para cada ...
 

Saludos. He preguntado por ahí, pero aún no he encontrado respuesta. ¿Podría decirme por qué con la siguiente entrada

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

El sistema genera constantemente errores

: billete no válido para OrderDeletefunction

Error de OrderDelete 4051

Según el libro de referencia es

Valor no válido del parámetro de la función

Aunque los parámetros parecen ser los mismos.

Aunque si se elimina la condición y se deja sólo

OrderDelete(ticketD);

OrderDelete(ticketUP);

se borra con éxito (pero lo necesito por condición). ¿Qué hago mal? Aquí está todo el asunto:

https://www.mql5.com/ru/forum/160683/page31#comment_3911573

El Asesor Experto lee los valores mínimos y máximos de las últimas X barras y coloca las órdenes según estos valores. Entonces, si el máximo o el mínimo han disminuido, debemos eliminar la orden correspondiente y abrirla con los nuevos datos.

Acabo de empezar a estudiarlo y el borrado en lugar de modificarlo lo hice para estudiar la función y me pregunté por qué no funcionaba.