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

 
trader781:
Tendrás la última perdiendo, qué hacer con ella y qué parámetros ajustar para ti, creo que lo descubrirás

Gracias, creo que lo tengo.

¿Cómo puedo hacer que el lote vuelva a su valor original después de la toma de beneficios?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
no funciona así)
 
wishmast:

Gracias, creo que lo tengo.

¿Cómo consigo que el lote vuelva a su valor original después de la toma de beneficios?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
no funciona así)

Tengo el siguiente esquema

if (OrdersTotal()==0)

{

abierto con lote inicial

}

si no

...

es decir, si no hay pedidos, no se abrirá con el lote antiguo

Por supuesto, es posible memorizar cada orden, pero no nos dicen cómo hacerlo.
 
Vitalie Postolache:
Un contador debe ponerse en marcha y volver a su valor inicial cuando se alcanza un determinado umbral:

Gracias.

Ayúdame a resolver un problema.
Hay 3 posiciones de compra, apareció una posición de venta, necesitamos cerrar la posición de venta y la posición de compra más antigua. Deberían mantenerse dos posiciones de compra.
Los tengo todos cerrados.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

 

Explique por qué la función OrderProfit()<0 no funciona?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

quiero ver cuántos stoploss por día de la semana

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()>0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

y aquí creo que es la misma razón por la que no funciona

 
wishmast:

Explique por qué la función OrderProfit()<0 no funciona?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

quiero ver cuántos stoploss por día de la semana

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()<0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

y aquí tomo que es la misma razón por la que no funciona

Porque DayOfWeek() devuelve el número de orden del día de la semana de la última hora conocida del servidor.

Y necesita el día de la semana de la hora de cierre del pedido: TimeDayOfWeek(OrderCloseTime());

 
Artyom Trishkin:

Porque DayOfWeek() devuelve el número de orden del día de la semana de la última hora conocida del servidor.

Y necesita el día de la semana de la hora de cierre del pedido: TimeDayOfWeek(OrderCloseTime());

Pero el resultado es el mismo, ya que si se ignorasi(OrderProfit()<0) y hay un bucle, las variables obtienen valores grandes.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

¿Y qué pasa con el bucle con un lote? Lo he copiado mal aquí, he corregido el signoif(OrderProfit()>0&&OrderType()<2), pero no cambia la esencia, el bucle funciona correctamente sin esta condición.

 
wishmast:

Pero el resultado es el mismo, ya quesi se ignora(OrderProfit()<0) y hay un bucle, las variables tienen valores grandes.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

¿Y sobre el bucle con un lote? Lo he copiado mal aquí, he corregido el signoif(OrderProfit()>0&&OrderType()<2), pero no cambia la esencia, el bucle funciona correctamente sin esta condición.

¿Dónde se declaran el día 1 y el día 2?
 
Artyom Trishkin:
¿Dónde se declaran el día 1 y el día 2?
como global, al principio, antes de OnTick () y antes de todas las funciones
 
Artyom Trishkin:
¿Dónde se declaran el día 1 y el día 2?

Sospecho que estoy seleccionando mal el orden, no funciona(OrderProfit()<0), tengo que ser más específico sobre el orden que necesito. No sé por qué se salta una orden cuando la última se cerró en Take-Point y no hay otras. ¿Quizás, si quiero buscar en el historial, el bucle debería construirse de otra manera?

for(int w=OrdersHistoryTotal()-1; w>=0; w--)
      {
      if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))

La razón es que los Asesores Expertos construyen bucles con condiciones similares y funcionan como se requiere, pero funcionan usandoOrdersTotal().

for(int n=OrdersTotal()-1;n>=0;n--)            
         {                                          
         if(OrderSelect(n,SELECT_BY_POS))            
            {                                        
            if(OrderMagicNumber()==magic)                  
               {
               if(OrderType()>OP_SELL)
 
sile:
Gracias.

Ayúdame a resolver un problema.
Hay 3 posiciones de compra, apareció una posición de venta, necesitamos cerrar la posición de venta y la posición de compra más antigua. Deberían mantenerse dos posiciones de compra.
Todos ellos están cerrados.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

Esto no puede resolverse en un solo ciclo. En este bucle, se deben memorizar los tickers de las órdenes a eliminar en el array, en el siguiente bucle, se deben eliminar por tickers.

Además, tienes un lío con las llaves, estás trabajando con órdenes fuera del bloqueOrderSelect{}, esto es incorrecto.