Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 828

 
Saludos. La cuestión es más bien lógica.
El llamado sistema antimartingale, con un límite en el número de incrementos. Si se cierra con beneficio, el siguiente lote se incrementa en un factor. Si hay una pérdida, o si el número de posiciones rentables en una fila excede el número especificado, el lote es igual al lote inicial.
Una vez superado el número especificado de posiciones rentables, ¿cómo empiezo el ciclo de aumento de nuevo?
int K_U_=5;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);//лот последней закрытой позиции
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }


/

 
lil_lil:
Saludos. La cuestión es más bien lógica.
El llamado sistema antimartingale, con un límite en el número de incrementos. Si se cierra con beneficio, el siguiente lote se incrementa en un factor. Si hay una pérdida, o si el número de posiciones rentables en una fila excede el número especificado, el lote es igual al lote inicial.
Una vez superado el número especificado de posiciones rentables, ¿cómo empiezo el ciclo de aumento de nuevo?


/

Ejemplo en el código deStop Loss Take Profit: el tamaño del lote se almacena (se sobreescribe, se aumenta y se restablece al mínimo) en la variable "ExtLot", que se declara a nivel global del programa (en la cabecera). OnTradeTransaction() capta las operaciones del tipo "Market Exit" y comprueba cómo se cerró la operación: en Take Profit o Stop Loss:

         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               ExtLot*=2.0;
            else if(deal_reason==DEAL_REASON_TP)
               ExtLot=m_symbol.LotsMin();
           }

Si en el Stop Loss, duplicamos el lote, si en el Take Profit, reajustamos el tamaño del lote a su valor mínimo.


Nota: en el propio Asesor Experto el cálculo de Stop Loss y Take Profit es un poco incorrecto - pero el código será republicado pronto.

 
Vladimir Karputov:

Ejemplo en el código deStop Loss Take Profit: el tamaño del lote se almacena (se sobreescribe, se incrementa y se restablece al mínimo) en la variable "ExtLot" declarada a nivel global del programa (en la cabecera). OnTradeTransaction() capta las operaciones del tipo "Market Exit" y comprueba cómo se cerró la operación: en Take Profit o Stop Loss:

Si en el Stop Loss, duplicamos el lote, si en el Take Profit, reajustamos el tamaño del lote a su valor mínimo.


Nota: en el Asesor de Expertos es ligeramente incorrecto el cálculo de Stop Loss y Take Profit - pero pronto republicado código.

Calculo el número de operaciones rentables que van seguidas, si supera las 5, entonces vuelvo al lote inicial, la posición 6 se abre con el lote inicial y la posición 7 debería abrirse con volumen = lote 6 multiplicado por el coeficiente, etc. Cuando haya 5 posiciones más rentables, vuelva al lote inicial.

Las posiciones rentables son 20 seguidas. Sus lotes deben ser 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


 
lil_lil:

Calculo el número de operaciones rentables seguidas, si supera las 5, entonces vuelvo al lote inicial, la posición 6 se abre con el lote inicial y la posición 7 debería abrirse con volumen = lote 6 multiplicado por el coeficiente, etc. Cuando haya 5 posiciones más rentables, vuelva al lote inicial.

Las posiciones rentables son 20 seguidas. Sus lotes deben ser 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16


Es necesario utilizar una variable estática en la función de recuento de lotes. Así es como funciona:

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   static int counter=0;
   for(int i=0;i<18;i++)
     {
      Print(counter);
      counter++;
      if(counter==5)
         counter=0;
     }
  }
//+------------------------------------------------------------------+

Resultado:

0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
Archivos adjuntos:
Test_1.mq5  2 kb
 
Vladimir Karputov:

Es necesario utilizar una variable estática en la función de recuento de lotes. Así es como funciona:

Resultado:

Reinicio según tu ejemplo, pero no consigo el orden de aumento del lote

Hay 20 posiciones rentables, seguidas. Sus lotes deberían ser 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 pero debería ser1, 2, 4, 8,16, 1, 1, 1, 1,............

¿Qué ocurre?

int K_U_=5;  double   Lots=1.0;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }
  
//+------------------------------------------------------------------

int CountProfit(const string Symb,const long MagicNumber=0)
  {
    int counter=0;
   ulong Ticket;

   if(HistorySelect(0,LONG_MAX))
      for(int i=HistoryDealsTotal()-1; i>=0; i--){
      
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {
            if(HistoryDealGetDouble(Ticket,DEAL_PROFIT)>0)
            counter++; else
               break;
           }
           }
   if(counter==K_U_)
      counter=0;
   return(counter);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LotLastCloPos(const string Symb,const long MagicNumber=0)
  {
   ulong Ticket;
   double lot_=0;

   if(HistorySelect(0,LONG_MAX))
      for(int i=0; i<HistoryDealsTotal(); i++)
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {

            lot_=HistoryOrderGetDouble(Ticket,ORDER_VOLUME_INITIAL);

           }

   return(lot_);
  }
 
lil_lil:

Estoy poniendo a cero según tu ejemplo, pero no consigo el orden de aumento del lote

Hay 20 posiciones rentables, seguidas. Sus lotes deberían ser 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 y resulta que1, 2, 4, 8,16, 1, 1, 1, 1, 1,............

¿Qué pasa?

Entonces, ¿todavía no quiere utilizar OnTradeTransaction de forma normal? Entonces, ¿prefiere solicitar EXACTAMENTE todo el historial de operaciones (desde 1970)? ¿Por qué?

 
Vladimir Karputov:

¿Así que no quiere trabajar correctamente con OnTradeTransaction? Entonces, ¿prefiere solicitar ABSOLUTAMENTE TODO el historial comercial (desde 1970)? ¿Por qué?

Encontré una razón, paréntesis.

Cómo que no quiero, qué tiene que verOnTradeTransaction con mi pregunta ;)

 

Ahora veo, dos posts antes de mi pregunta, un ejemplo del cálculo.

Gracias.

 
lil_lil:

Encontré la razón, paréntesis.

Cómo que no quiero, qué tiene que verOnTradeTransaction con mi pregunta;)

Sólo pido el historial comercial

HistorySelect(0,LONG_MAX)

significa solicitar todo, todo, todo el historial de esa cuenta comercial desde 1970. Esto es muy poco óptimo:

  • ¿y si hay miles de operaciones en esa cuenta?
  • ¿Y si (Dios no lo quiera) haces esta petición en cada tic?

 

Por favor, comparta las funciones que funcionan con el historial de operaciones.

Necesito obtener información sobre la fecha de la última operación de apertura, cierre, volumen, resultado financiero y su tipo (compra o venta).

Si tienes alguna función similar, por favor compártela.

Razón de la queja: