[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 563

 

abeiks:

Desde hace algún tiempo he estado intentando rehacer el bloque de cierre de compra para cerrar sólo las dos últimas posiciones de compra, pero falla. ¿Puede decir cómo rehacer el bloque ?

Es más fácil y conveniente hacer una función (bloque) para cerrar una última posición. Y ejecútalo dos veces. En un bucle, o sólo en una fila.
 
abeiks:

Desde hace algún tiempo he estado intentando rehacer el bloque de cierre de compra para cerrar sólo las dos últimas posiciones de compra, pero falla. ¿Puede decir cómo rehacer el bloque ?

Hace tiempo os di un algoritmo de solución para encontrar las últimas posiciones. Y luego lo que hay que hacer con ellos es IMPORTANTE: contar, borrar, modificar los STOP. Si no eres capaz de escribir código al menos "a imagen y semejanza", no es tuyo (la programación)...
 
rigonich:



Gracias.

 
peshihod:
Es más fácil, y más conveniente, hacer una función (bloque) para cerrar una última posición. Y ejecútalo dos veces. En un bucle, o sólo en una fila.

Gracias, es una buena opción que también probaré.

 
delf:

Debo haberme expresado mal :(

Existe un algoritmo de apertura de órdenes.

Necesito, que en cualquier variante de cierre de la última orden, el siguiente se abrió en otra dirección (cuando las condiciones en consecuencia aparecen).

Todo funciona, pero si he cerrado por un stop loss, por ejemplo, para vender, y las condiciones para abrir una venta en esta dirección, la apertura continúa. Lo que necesitamos es esperar a que se den las condiciones para comprar.

Es decir, hay que comprobar la última orden cerrada, para que no coincida con la de apertura (alternancia compra-venta-compra-venta). Sólo está en funcionamiento una orden o espera de señal.

Entiendo que probablemente deberíamos usar OrdersHistoryTotal(), pero ¿cómo se vería en un EA que funcione?

Gracias.


Es probable que este sea el caso en alguna parte. Pero si hay muchas órdenes en el historial es mejor utilizar su propio libro de órdenes. https://www.mql5.com/ru/articles/1404https://www.mql5.com/ru/articles/1390
//+------------------------------------------------------------------+
//|                                                         0000.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
void CloseOrder(string signal)
   {
   int      i,Ticket=-1,error; 
   double   Price;
   datetime time=0;
   for (i=0;i<OrdersHistoryTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ", error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic
      ||OrderClosePrice()==OrderStopLoss())
         {
         if(OrderCloseTime()>time)
            {
            time=OrderCloseTime();Ticket=OrderTicket();
         }
      }
   }
   if(!OrderSelect(Ticket,SELECT_BY_TICKET,MODE_HISTORY))
      {
      error=GetLastError();Print("Ошибка OrderSelect() = ",error);
   }
   if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL&&signal=="CloseSELL")return;
   if(signal=="CloseBUY")Price=NormalizeDouble(Bid,Digits);
   if(signal=="CloseSELL")Price=NormalizeDouble(Ask,Digits);
   for (i=0;i<OrdersTotal();i++)  
      {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES));
         {
         error=GetLastError();Print("Ошибка OrderSelect() = ",error);
      }
      if(OrderSymbol()==Symbol()&&(OrderMagicNumber()==magic)
         {
         if(OrderType()==OP_BUY&&signal=="CloseBUY"||OrderType()==OP_SELL||signal=="CloseSELL")
            {
            Ticket=OrderClose(OrderTicket(),OrderLots(),Price,0,CLR_NONE);
         }
      }
      if(Ticket<0)
         {
         error=GetLastError();Print("Ошибка = ",error);
      }
   }
   return;
}
       
 
peshihod:

Una opción más estricta

Muchas gracias a todos los que han respondido, resultado conseguido, justo lo que necesitaba.
 
delf:

Debo haberme expresado mal :(

Existe un algoritmo de apertura de órdenes.

Necesito, que en cualquier variante de cierre de la última orden, el siguiente se abrió en otra dirección (cuando las condiciones en consecuencia aparecen).

Todo funciona, pero si he cerrado por un stop loss, por ejemplo, para vender, y las condiciones para abrir una venta en esta dirección, la apertura continúa. Lo que necesitamos es esperar a que se den las condiciones para comprar.

Es decir, hay que comprobar la última orden cerrada, para que no coincida con la de apertura (alternancia compra-venta-compra-venta). Sólo está en funcionamiento una orden o espera de señal.

Entiendo que probablemente deberíamos usar OrdersHistoryTotal(), pero ¿cómo se vería en un EA que funcione?

Gracias.

Si quieres aprender a programar, puedes buscar en el código de otros (para eso está CodaBase), o proceder a partir del algoritmo de la solución del problema. Pedir que escriban código por ti es la forma más desesperada de aprender. Lo más frecuente es que obtengas una solución mal codificada a tu problema, algo así como (alegóricamente) que tu vecino te llame a la puerta cada minuto y te pregunte "cómo te llamas": se trata de cálculos innecesarios (superfluos).

El algoritmo para resolver su problema puede ser el siguiente. En primer lugar, debe asegurarse de que no tiene "sus" órdenes. Este problema, si no es para el probador (donde podemos limitar la solución a la condición if (OrdersTotal() == 0), se resuelve con la búsqueda de órdenes mediante filtros de coincidencia de OrderMagicNumber() y Symbol(). A continuación, comprueba la condición (según su estrategia) para abrir la orden. Si hay una señal, entonces usando la búsqueda de OrdersHistoryTotal() (normalmente es la última de la lista), calcula el OrderType() de la última orden cerrada. Si la señal para abrir la orden y el tipo de la última orden cerrada no coinciden, abre la orden basándose en la señal.

Este enfoque implica un mínimo de cálculos y reduce en gran medida el tiempo de optimización del Asesor Experto en el probador.

 
TarasBY:
Hace tiempo os di el algoritmo para resolver la búsqueda de las últimas posiciones. Y luego no importa qué hacer con ellos: contar, borrar, modificar STOP. Si no eres capaz de escribir código al menos "a imagen y semejanza", no es tuyo (la programación)...


Sí, estoy de acuerdo, la programación no es lo mío, por eso estoy aprendiendo y preguntando aquí. Intenté añadir el cierre de posiciones a su algoritmo pero falló (todas las posiciones de compra se cerraban), así que decidí enfocar el problema desde otro ángulo y ver la solución de cerrar las dos últimas posiciones de compra en un bloque de cierre ya preparado que se me proporcionó y ofreció.

Te agradecería mucho que me indicaras cómo cerrar las dos últimas posiciones de compra. Entenderé dónde me he equivocado.

double profits_buy_2pos()
{
    int ordercount = 0, OpenOrders = OrdersTotal();
    double pr_buy = 0;
    for (int cnt = OpenOrders - 1; cnt >= 0; cnt--)   // scan all orders and positions. ..
    {
        if (!OrderSelect (cnt, SELECT_BY_POS)) return (0.0);
        if (OrderSymbol() != Symbol()) continue;
        if (OrderMagicNumber() != magic) continue;
        if (OrderType() != OP_BUY) continue;
        pr_buy += OrderProfit();
        ordercount++;
        if (ordercount == 2) break;
    } 
    Print ("::::::::::::::::::::::::: pr_buy2 = ", pr_buy);   
    Print ("::::::::::::::::::::::::: ordercount = ", ordercount);    
    return (pr_buy);   
}

 
TarasBY:

Si quieres aprender a programar, analiza el código de otras personas (para eso está CodaBase) o sigue el algoritmo para la tarea en cuestión. Pedir que escriban código por ti es la forma más desesperada de aprender. La mayoría de las veces no obtendrá el mejor código para su tarea, algo así como (alegóricamente) cuando su vecino cada minuto llama a su timbre y le pregunta "¿cómo se llama?" - se trata de cálculos innecesarios (superfluos).

Estoy completamente de acuerdo con usted. Tienes razón al 100%. Este es el camino correcto y he tratado de seguirlo. Sin embargo, el estudio de MQL4 sin los libros de texto y la lectura sin motivo no condujo a nada. De todos modos, tuve que analizar el código de otra persona, ya que no podía poner mis propias ideas locas en el programa en su mayor parte. He empezado a construir la estrategia en ....excel (me resulta más cercano y comprensible). En cuanto a los fundamentos de la estrategia, ha sido muy exitosa y clara (en la historia, por supuesto). Pero además debería tener en cuenta las peculiaridades de la negociación: el spread flotante, el swap, las peculiaridades de la casa de bolsa, es difícil encajar todo esto en fórmulas exel. Así que decidí analizar la diferencia entre el beneficio en Excel y MQL. Francamente hablando, la diferencia es demasiado, no a mi favor. Todavía no lo sé, voy a analizar cada posición, tal vez el Asesor Experto se equivocó, pero eso depende de mí.

De todos modos, la buena gente de este foro me ha ayudado en la solución de un problema específico, que gran humano gracias por.

 
Ekburg:

no, el problema de cambiar el número de orden de una posición cuando una de ellas está cerrada se ha solucionado, lo he comprobado más de una vez pensando que podía haber un error ahí, pero todo está bien ahí, la orden requerida está seleccionada y el stoploss se calcula correctamente para ella, pero la orden no quiere ser modificada...

El error 1 se genera sólo si todos los parámetros pasados a la funciónOrderModify( ) son iguales a todos los parámetros del pedido que se está modificando, que usted( por número de ticket) o la funciónOrderSelect() seleccionaron para su modificación. Ejemplo de uso del cheque:

Sólo "Funciones útiles de KimIV".

Función ModifyOrder()https://www.mql5.com/ru/forum/131859