Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1662

 
Taras Slobodyanik #:

¿Por qué se necesitan 3 métodos?
es suficiente para hacer todo en un solo

  • comprobado el orden

- modificado
- no modificado

¡Esto es interesante!

Taras, digamos que tenemos tres órdenes de compra con TP y SL, entonces en una orden modificamos el SL.

Pregunta: ¿Cómo puedo encontrar la orden que ha sido modificada?

 
Taras Slobodyanik #:

¿Por qué se necesitan 3 métodos?
es suficiente para hacer todo en un solo

  • comprobado el orden

- modificado
- no modificado

Ya hay dos, uno controla el tamaño del array a través de OrdersTotal() donde se almacenan los tickets de los pedidos modificados, y el otro busca los tickets en este array. Pero ahora he cambiado el código en otro lugar, no relacionado con todo esto, y por alguna razón me da un error (array overrun).
 
MakarFX #:

¡Interesante!

Taras, digamos que hay tres órdenes de compra con TP y SL, entonces en una orden se cambió el SL.

Pregunta: ¿Cómo puedo encontrar la orden que ha sido modificada?

Obviamente, el SL (o TP) se cambió por una razón, ¿no?
Deberíamos comprobarlo en función de algunas condiciones.

Entonces, en la siguiente comprobación, esta condición se definirá como "cumplida": el pedido ya ha sido modificado.


Si estamos hablando de una modificación manual, alguien cambiará algo sin el conocimiento de EA, entonces por supuesto necesitamos recoger una estructura de array y compararla constantemente con las órdenes de mercado.

 
Taras Slobodyanik #:

¿Por qué necesitas 3 métodos?
es suficiente para hacer todo en un solo

  • comprobado el orden

- modificado
- no modificado

El orden no es 1, digamos que son 10. Escribo el ticket de cada modificado en un array. Pero hasta ahora esto es un problema.
 
MakarFX #:

Eliminado

MakarFX, ¡gracias! Ahora no hay una primera orden extra de no señal, pero ahora por alguna razón la primera orden de señal (normal) está entrando 2 velas antes)) Adjunté una captura de pantalla del probador a mi mensaje, pero incluso a pesar de esta primera orden - lo más importante está hecho, muchas gracias de nuevo) Con los magos lo consiguió, entonces voy a hacer una variable externa y cuando se adjunta el espert a un gráfico de par de divisas en particular, voy a cambiar el número para cada par individualmente.

Archivos adjuntos:
 
Nerd Trader #:
La orden no es 1, hay 10 órdenes. Escribiré la entrada de cada uno de los modificados en el array. Pero hasta ahora, esto es un problema.

no importa cuántas órdenes haya - siempre que no haya que modificar el TP/SL, según las condiciones = la orden ya ha sido modificada.

 
SanAlex #:

ese es bueno para divertirse en el probador.

y este es para ti, como un regalo - para ganar dinero.

\\\\\\\\\\\\\\\\\\\\\\\\\\

Lo he puesto en marcha para probarlo, veremos cómo funciona esta noche.

\\\\\\\\\\\\\\\\\\\\\\\\\\\

comprobado cómo cambia el patrón en todos los gráficos - ¡todo ha funcionado! -Cómo el beneficio global alcanzó el objetivo.


SanAlex, muy interesante, definitivamente voy a investigar este EA en detalle, ¡gracias!

 

¡Chicos, buen día en el código de asesorar, aquí hay un gráfico de la derecha de los dos oficios menos compra - está cubierto por una venta, venta de compra, de acuerdo con el algoritmo debe entrar en la compra, pero ¿por qué - a continuación, estos dos fi-ciones, que se ven y producen un comercio menos el más reciente en la historia - mostrar tanto en el plus! Cómo escribir y donde el error - esta inversión TS, en el promedio - estos mismos f-i funcionan correctamente, en definitiva, después de la menos-venta - tienen que abrir comprar, pero no se abre, porque En otras palabras, debería abrir la compra si mi orden está perdiendo, pero la compra no se abre, porque f-i piensa que si la operación está perdiendo la mayor parte de la ventaja, este f-iia informe TRUE, de lo contrario es falso, pero ambos informan TRUE. Por favor, ayúdame a decidir.



// проверка предыдущего минусового селл
bool Calc_Loss_SELL()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) ==  DEAL_TYPE_BUY)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в селл разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В БАЙ разрешен ",TotalLot);
            break;
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


// проверка предыдущего минусового бай
bool Calc_Loss_BUY()
  {
   bool ord;
   bool TotalLot=false;
   HistorySelect(TimeCurrent()-HistoryDaysLoadI*86400,TimeCurrent());
   for(int i=HistoryDealsTotal()-1; i>=0; i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      ord=HistoryDealSelect(ticket);
      if(ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol
         && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC
         && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT
         && HistoryDealGetInteger(ticket,DEAL_TYPE) == DEAL_TYPE_SELL)
        {
         if(HistoryDealGetDouble(ticket,DEAL_PROFIT) < 0)
           {
            TotalLot=true;
            if (УСРЕДНЯЛКА) Print(" усреднение в бай разрешено ",TotalLot);
            else  Print(" ПЕРЕВОРОТ В СЕЛЛ разрешен ", TotalLot);
            break;          
           }
         else
           {
            break;
           }
        }
     }
   return (TotalLot);
  }


    //----------------------------------------------
      // проверка условий ПЕРЕВОРОТА В СЕЛЛ
      // нет поз рыночных и предыдущая сделка В БАЙ была минусовая и не было минусового селла
       Print(" Calc_Loss_BUY(): ",Calc_Loss_BUY(), " Calc_Loss_SELL(): ",Calc_Loss_SELL());
      
      if(!PositionSelect(Symbol()) && Calc_Loss_BUY() && !Calc_Loss_SELL())
        {
         m_trade.Sell(CalcLot(),_Symbol,LastTick.bid,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point - _Spread*_Point);
         Print(" ПЕРЕВОРОТ БАЯ В СЕЛЛ, Calc_Loss_BUY(): ",Calc_Loss_BUY());
        }

 
      // проверка условий ПЕРЕВОРОТА в SELL
      // нет поз рыночных и предыдущий селл был минусовой И НЕ БЫЛО МИНУСОВОГО БАЙ
      
      if(!PositionSelect(Symbol()) && Calc_Loss_SELL() && !Calc_Loss_BUY())
        {
         m_trade.Buy(CalcLot(),_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point + _Spread*_Point);
         Print(" ПЕРЕВОРОТ СЕЛЛА В БАЙ, Calc_Loss_SELL(): ",Calc_Loss_SELL());
        }

¡¡¡¡¡¡¡¡¡No consigo que se abra la compra, pero debería abrirse después de una venta ubutical!!!!!!!!!


¡En esencia, el problema se reduce a determinar el beneficio o la pérdida se cerró posición marginal, que se convirtió en una compra o venta de comercio y mirar más en su tipo!

¡AYUDA! ¡ADEMÁS!

 

¡Buenos días!

Hay dos funciones: una función para calcular toda la parrilla de órdenes y una función para cerrar las órdenes

//+------------------------------------------------------------------+
double CalculiteProfit()
{
    double oProfit = 0;
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
        {
          if (OrderType() == OP_BUY || OrderType() == OP_SELL)
          {
            oProfit += OrderProfit();
          }
        }
      }
    }
    return(oProfit);
}
//+------------------------------------------------------------------+
 double FindLastBuyPrice()
{
   int oldticket, ticket = 0;
   double oldopenprice = 0;
   
   for(int cnt = OrdersTotal()-1; cnt>=0; cnt--)
   {
    if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
     {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
        {
          oldticket = OrderTicket();
          if (oldticket > ticket)
          {
            ticket = oldticket;
            oldopenprice = OrderOpenPrice();
          } 
        }
     }
   }
   return(oldopenprice);
 }
//+------------------------------------------------------------------+

También hay condiciones para cerrar las órdenes

 double op = CalculiteProfit(); 
     if (op >= Profit)
     {
       ClosseAll();
     }

Beneficio - en los ajustes en moneda de depósito

La idea de todo esto: Después de que el cálculo de la parrilla de pedidos sea igual a cero más elBeneficio en la moneda del depósito, se cierra toda la parrilla de pedidos

Por favor, ayúdenme a cambiar el código para que haya puntos en lugar de Beneficios. Gracias.

 
Taras Slobodyanik #:

Obviamente, el sl (o tp) se cambió por una razón, ¿no?
Pero según algunas condiciones.

Por lo tanto, en la siguiente comprobación esta condición se definirá como "cumplida": el pedido ha sido modificado.


Si estamos hablando de cambios manuales, alguien cambiará algo sin el conocimiento de EA, entonces por supuesto necesitamos recoger una estructura de array y compararla constantemente con las órdenes de mercado.

Ya lo había olvidado... y al principio lo hice (menos mal que me he comprometido), pero la forma de condicionar me parecía poco fiable, quería algo más obvio para indicar un orden que se había cambiado.