Dividir las posiciones abiertas en grupos - página 9

 
Sergey Voytsekhovsky:

Si lo he entendido bien, este es el camino correcto. Como un compañero más experimentado, por favor, aconsejar, con el fin de captar las posiciones de los recién nacidos tal filtro funcionará ??? ¿O tal vez hay una opción mejor?

Esto es para Alexey - no trabajo con OnTradeTransaction() por alguna razón.

 
Alexey Viktorov:

¿Sugiere entonces que se retrasen los otros puestos? ¿Dejar que no se mencionen? Eso no es correcto.

En mi opinión, es mejor definir una sección separada del foro en la que cada problema sería un tema independiente. El número de temas es mucho menor que el número de mensajes por tema. Así que, a pesar del considerable número de temas, no se retrasarán tanto como se retrasan ahora las cuestiones individuales y los informes de errores.

Bueno, has resaltado en rojo que no lo sabes. ¿Cuál era el problema? ¿Cómo se ha manifestado? ¿Y cuál es el nuevo método?

En cuanto a la notificación de errores: "bien o mal", pero si quieres notificarlo, lo harás. Y si no quieres, no quieres. Y cerrarse como "dejar que la gente hable de lo suyo" es una excusa.

 
Sergey Voytsekhovsky:

Si lo he entendido bien, este es el camino correcto. Como un compañero más experimentado, por favor, aconsejar, con el fin de captar las posiciones de los recién nacidos tal filtro funcionará ??? ¿O tal vez hay una opción más correcta?

En mi opinión, esta línea

         if(trans.type != TRADE_TRANSACTION_ORDER_DELETE)

innecesario. Y en general, estoy reconsiderando la operación OnTradeTransaction para la siguiente variante

  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)

En el momento de añadir una operación no tenemos un ticket de la orden que generó la operación. Pero si necesitamos una entrada para la orden y sus propiedades, como ahora necesito que el precio de apertura de la orden no desactive el paso de la rejilla debido al deslizamiento, entonces es la mejor variante. imho.

En general, soy partidario de escribir para una tarea específica. En cambio, la SB tiene una gran universalidad que requiere variables adicionales que a veces son absolutamente innecesarias.

 
Artyom Trishkin:

Bueno, has resaltado en rojo lo que no sabías. ¿Cuál era el problema? ¿Cómo se manifestaba? ¿Y cuál era el nuevo método?

Y sobre los mensajes de error: "bien o mal", pero si quieres denunciarlo, lo harás. Y si no quieres, no quieres. Y cerrarse como "dejar que la gente hable de lo suyo" es una excusa.

En algún lugar de mis viejos discos todavía tengo los antiguos terminales. Si los encuentro, te enseñaré la antigua biblioteca y la nueva. Entonces tendremos una conversación de fondo. Por lo demás, recuerdo que no lo haces, así que ¿de qué hay que hablar? Cómo explicar, mostrar lo que ahora no existe.
 
Alexey Viktorov:

En mi opinión, esta línea

innecesario. En general, estoy reconsiderando la operación OnTradeTransaction para la siguiente variante

En el momento de añadir una operación no hay ningún ticket de la orden que generó la operación. Pero si necesitamos una entrada de una orden y sus propiedades, como ahora necesito el precio de apertura de la orden, para que el paso de la rejilla no sea derribado debido al deslizamiento, entonces esta es la mejor opción. imho.

En general, soy partidario de desarrollar para una tarea concreta. Y el LU ha metido la universalidad, que requiere variables adicionales, a veces absolutamente innecesarias.

Muy agradecido por indicar la dirección correcta. Lo hice de esta manera (abajo, parece que funciona):

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
            {
               int SizeArrayPosition = ArraySize(ArrayPosition);
               ArrayResize(ArrayPosition,SizeArrayPosition+1);
               
               if(PositionSelectByTicket(trans.position)){
               ArrayPosition[SizeArrayPosition].ticket_pos = trans.position;
               ArrayPosition[SizeArrayPosition].open_price = trans.price;
               ArrayPosition[SizeArrayPosition].open_tyme  = (datetime)PositionGetInteger(POSITION_TIME);
               ArrayPosition[SizeArrayPosition].type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               ArrayPosition[SizeArrayPosition].kod_clana  = 0;
               
               Print("\n"
               "Открылась новая позиция: ticket = ",ArrayPosition[SizeArrayPosition].ticket_pos);}}}
  }

Ahora estoy desconcertando sobre cómo coger los tickers de las posiciones que se cerraron en Take Profit o por una orden directa. Sólo necesitamos ticks de ellos para eliminar estas posiciones de la matriz principal de posiciones.

 
Sergey Voytsekhovsky:

Muy agradecido por la orientación en la dirección correcta. Así lo hice (abajo, parece que funciona):

Ahora estoy desconcertando como coger los ticks de las posiciones que se cerraron en takeprofit o por orden directa. Sólo necesitamos ticks de ellos para eliminar estas posiciones de la matriz de posiciones principal.

Yo añadiría una comprobación para el símbolo y el mago.

    if(PositionSelectByTicket(trans.position) && PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == magick)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)

Aquí hay un fragmento de mi código donde se detecta el cierre de la posición.

    if(!PositionSelectByTicket(trans.position))
     {
      HistorySelectByPosition(trans.position);
      ulong ordTicket = HistoryOrderGetTicket(0);
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {

También podemos dividir por razones de cierre de la enumeración ENUM_DEAL_REASON

En otro Asesor Experto

    if(!PositionSelectByTicket(trans.position))
     {
      if(trans.symbol == _Symbol && HistorySelectByPosition(HistoryDealGetInteger(trans.deal, DEAL_POSITION_ID)))
       {
        int dealTotal = HistoryDealsTotal();
        long posMagic = 0;
        ulong dealTicketIN = HistoryDealGetTicket(0);
        if(HistoryDealGetInteger(dealTicketIN, DEAL_ENTRY) == DEAL_ENTRY_IN)
          posMagic = HistoryDealGetInteger(dealTicketIN, DEAL_MAGIC);
        if(posMagic == magick)
         {
          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
           {

En el primer caso necesito un pedido, en el segundo basta con un trato. En general, cuando necesito algo, lo escribo.

 
Alexey Viktorov:

También añadiría una comprobación para el símbolo y la magia

Aquí hay un fragmento de mi código donde se detecta el cierre de la posición.

También podemos dividir por razones de cierre de la enumeración ENUM_DEAL_REASON

Aquí en otro Asesor Experto

En el primer caso necesito orden, en el segundo caso el comercio es suficiente. En general, lo escribiré cuando lo necesite.

Buenas noches. Su capacidad de respuesta y su consideración me honran. Muy agradecido. Como dicen los jóvenes: respeto y respeto.

Gracias por sus buenos consejos. Por un lado, no son muy necesarios en este momento, mi Asesor Experto no tiene ni probablemente tendrá competidores porque es de alta frecuencia, muchas posiciones pequeñas. Se está asfixiando solo, ¿dónde más puede competir con los demás? Por supuesto, si se llega a eso, tendrá uno en el terminal y en la cuenta. La segunda es probablemente inverosímil, no sé mucho todavía, pero tal vez ahorre un poco de recursos.

Tus ejemplos son buenos, definitivamente los guardaré, pero no tengo billete, ni orden, ni trato. Más concretamente, tengo cientos de ellas y no sé cuál va a cerrar ahora. Me has sugerido que piense que el hecho de cerrar una posición puede ser sacado de mis cálculos y voy a intentar hacerlo ahora.

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)

Mi Asesor Experto será un generador de posiciones y sabe abrir posiciones activamente y cerrarlas al mismo tiempo. Lo único que hay que hacer es encontrar esta posición (el ticket de posición) en el array/estructura y eliminarlo. Así que es así.

Y como la máquina de escribir, voy a tratar de utilizar un código de ejemplo de la referencia, en la sección de esta función, se llama allí:

//|OnTradeTransaction_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp.
//|https://www.mql5.com |||
//+------------------------------------------------------------------+
#property copyright"Copyright 2018, MetaQuotes Software Corp."
#enlace de propiedad"https://www.mql5.com"
#versión de la propiedad"1.00"
#property description"Ejemplo de escucha de eventos de TradeTransaction"

 
Sergey Voytsekhovsky:

Buenas noches. Su capacidad de respuesta y su consideración me honran. Muy agradecido. Como dicen los jóvenes, respeto y respeto.

Gracias por sus sabios consejos. No enciendo Magik y el símbolo casi conscientemente, en primer lugar, porque no son muy necesarios ahora mismo, mi Asesor Experto no tiene ni probablemente tendrá competidores, porque tiene una alta frecuencia, un gran número de posiciones mínimas. Se está asfixiando solo, ¿dónde más puede competir con los demás? Por supuesto, si se llega a eso, tendrá uno en el terminal y en la cuenta. La segunda es probablemente inverosímil, no sé mucho todavía, pero tal vez ahorre un poco de recursos.

Tus ejemplos son buenos, definitivamente los guardaré, pero no tengo billete, ni orden, ni trato. Más concretamente, tengo cientos de ellas y no sé cuál va a cerrar ahora. Me has sugerido que piense que el hecho de cerrar una posición puede ser sacado del sistema y descontado de mis cálculos.

Mi Asesor Experto será un generador de posiciones y sabe abrir posiciones activamente y cerrarlas al mismo tiempo. Lo único que hay que hacer es encontrar esta posición (el ticket de posición) en el array/estructura y eliminarlo. Así que es así.

Y como máquina de escribir, voy a tratar de usar el código de ejemplo de la referencia, en la sección de esta función, se llama allí:

Siempre es agradable compartir mis pequeños conocimientos con alguien que está averiguando algo por su cuenta a partir de la documentación en base a estos consejos. © I.A. Krylov. El Cuco alaba al Gallo por alabar al Cuco. )))

Si estás escribiendo un EA únicamente para ti, por supuesto que puedes tomarte algunas libertades. Si no crees que es necesario comprobar el símbolo y el mago, entonces no lo hagas.

Sobre lo destacado:

Hay de todo, el ticket de posición, el ticket de pedido y el ticket de transacción. Y ni siquiera es difícil tirar de un comercio y / o posición de apertura de la orden. Todo está en la estructura MqlTradeTransaction


    if(!PositionSelectByTicket(trans.position)) // Если позицию выбрать не получилось, значит она закрыта
     {
      HistorySelectByPosition(trans.position); // Получим список ордеров и сделок относящихся к этой, конкретной позиции
      ulong ordTicket = HistoryOrderGetTicket(0); // Получили тикет ордера который породил сделку и позицию.
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {
 
Если позицию выбрать не получилось, значит она закрыта 
Ой-ли? 
 
Алексей Тарабанов:

Alexey, todo se refiere únicamente al manejo de eventos OnTradeTransaction

Se ha producido un evento, se ha ejecutado una operación que cierra una posición. La posición ya se ha perdido en este momento. Esto puede confirmarse seleccionando la lista de pedidos y ofertas (no presente en el código) y leyendo

          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
Y ten en cuenta que estamos hablando de una cuenta hadge donde la posición suele tener sólo dos órdenes y dos operaciones.