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

 
d1w4m3:


Gracias por la respuesta, pero recién empiezo a aprender desde hace un par de semanas, como implementar esto en código, o decirme donde leer por favor. ¿O según Igor Kim?

Y sin embargo, abrirá una posición, no de acuerdo con el sistema, cuando acaba de comenzar su trabajo, su condición no evita este problema.

¿Y si lo piensas? ¿Por qué no evita el problema?

Cuando comienza a trabajar, y si no ha trabajado antes (en general la primera carrera), entonces no ha habido su posición todavía, y la lógica mostrará que la última posición cerrada simplemente no existe todavía. Esto significa que no ha podido cerrarse ni en la parada ni en la toma, lo que a su vez da permiso para abrir una posición en la señal.

¿No es así?

 
Artyom Trishkin:

¿Y si lo piensas? ¿Por qué no evita el problema?

Cuando empieza a funcionar, y si no ha funcionado antes (la primera vez que se ejecuta), entonces sus posiciones no han estado allí todavía, y la lógica mostrará que la última posición cerrada simplemente no está allí todavía. Esto significa que no ha podido cerrarse ni en la parada ni en la toma, lo que a su vez da permiso para abrir una posición en la señal.

¿No es así?


Esa es la cuestión: ¡por una señal! Pero la condición puede cumplirse no en la barra 2 (en cuanto el indicador haya cambiado el buffer) sino en cualquier segunda barra (después todo funciona a través del sistema, por supuesto). El problema está en la condición de abrir órdenes, ¿cómo arreglarlo pero en la segunda barra después del cambio del buffer del indicador?

void OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4);
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);
if(DN_Trend()==true)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
si (billete > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Oferta - TakeProfit*Punto, Dígitos);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Error en la venta");
}

}


 
d1w4m3:


Bueno, la cuestión es que se basa en la señal. Pero la condición puede satisfacerse no en la segunda barra (en cuanto el indicador haya cambiado el buffer) sino en cualquier segunda barra (después de eso todo funciona con el sistema, por supuesto). El problema está en la condición de abrir órdenes, ¿cómo arreglarlo pero en la segunda barra después del cambio del buffer del indicador?

void OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4);
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);
if(DN_Trend()==true)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
si (billete > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Oferta - TakeProfit*Punto, Dígitos);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Error en la venta");
}

}


Introduzca el código correctamente. Hay un botón SRC en el menú del editor de mensajes.
No he entendido nada de sus explicaciones.
 
d1w4m3:


¡Esa es la cuestión! Pero la condición puede cumplirse no en la barra 2 (en cuanto el indicador haya cambiado el buffer), sino en cualquier segunda barra (después de eso todo funciona con el sistema, por supuesto). El problema está en la condición de abrir órdenes, ¿cómo se arregla pero en la segunda barra después del cambio del buffer del indicador?

void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


1. Este es el aspecto que tendría el código si se insertara correctamente. Por algo se les ocurrió a los desarrolladores...

2. una pista sutil: ¿dónde están Open[4] y Close[4] en relación con los valores del indicador?

 
extern int TakeProfit  = 200;
extern double Lots     = 0.1;
extern int StopLoss    = 52;
extern int Magic       = 1111;
extern int Slippage    = 3;
extern int n           = 3; // На какую свечу открывать ордер
//------------------------------------------------------------------
extern int  LevelWLoss  = 1;      // Уровень безубытка
extern int  LevelProfit = 30;     // Уровень профита
//------------------------------------------------------------------
extern string    Slope  = "Параметры Slope";
extern int       period = 163; 
extern int       method = 3;                         
extern int       price  = 0;    
//------------------------------------------------------------------
double uptr, SL, TP, dntr;
int    ticket, nd;
bool   fm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit  *=10;
       StopLoss    *=10;
       Slippage    *=10;
       LevelWLoss  *=10;
       LevelProfit *=10;
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }
  }
}//if(DN_Trend()==true)

if(UP_Trend()==true)
{
   if( CountBuy() == 0  && Ask > uptr && Open[3] > uptr && Close[3] > uptr  )
  {
   ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
      if (ticket>0)
      {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
               Print("Ошибка на покупку");
       }
    }
}//if(UP_Trend()==true)

      if ( CountSell()>0  && Open[3] > uptr && Close[3] > uptr && UP_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      if ( CountBuy()>0 && Open[3] < dntr && Close[3] < dntr && DN_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
            if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      //+переход в безубыток+
   for( int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
        if(OrderSymbol()== Symbol() && OrderMagicNumber()==Magic)
          {
            if(OrderType()==OP_BUY) 
              {
                if(OrderStopLoss()-OrderOpenPrice()<LevelWLoss*Point) 
                 {
                   if(Bid-OrderOpenPrice()>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
            }
           }
         if(OrderType()==OP_SELL) 
           {
            if(OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*Point) 
              {
               if(OrderOpenPrice()-Ask>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
           }
       
        }
     }
     
//------------  комментарии -----------------+     
  if(UP_Trend()) Comment("Восходящий тренд ", uptr);
  if(DN_Trend()) Comment("Нисходящий тренд ", dntr);
 
 }
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
bool UP_Trend()
{
  if(uptr > 0 && uptr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
bool DN_Trend()
{
  if(dntr > 0 && dntr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
 

Si insertamos su condición " Esto significa que no se pudo cerrar ni en el stop ni en la toma, lo que a su vez da permiso para abrir una posición en la señal. "

Y mi señal es"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)" (junto con el desplazamiento del indicador n=3),

Resulta que si se coloca inmediatamente en el gráfico, se abrirá en una tendencia bajista, desde el momento de inicio en la 3ª vela, y luego, si hay una señal, se abrirá según sea necesario.

 
d1w4m3:

Si insertamos su condición " Esto significa que no se pudo cerrar ni en el stop ni en la toma, lo que a su vez da permiso para abrir una posición en la señal. "

Y mi señal es"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)" (junto con el desplazamiento del indicador n=3),

Resulta que si se coloca inmediatamente en el gráfico se abrirá en una tendencia bajista en el momento de inicio en la 3ª vela, y luego, si hay una señal, se abrirá según sea necesario.

No entiendo nada. ¿Qué tienes que no entiendes? ¿No puede determinar que la última posición se cerró en la parada o en la toma? ¿No encuentra un lugar en su código donde quiera comprobar esta condición?

¿O qué no puedes hacer?

¿Cómo puede abrirse en la tercera vela? ¿O explicar qué significa "se abrirá en la tercera vela"? ¿Qué significa eso?
 

cada vez que se abre una orden sobre alguna señal del indicador, ¿cómo almaceno el tipo de esta señal en una variable?

Hay un fallo (cuando ejecuto el EA), la orden no se abre al inicio de una tendencia (no según un cambio de color del indicador), porque mi condición no se refiere a velas concretas, sino que dice que si la tendencia es alcista o bajista se abre al inicio de 3 velas


 

Buenas tardes a todos.

Me pregunto cómo analizar las estadísticas de trabajo en EXCEl

¿Quién puede decirme lo que puede ser extraído a través de DDE de mt4 y donde puedo obtener todas las funciones permitidas para la transferencia a Excel

Estaré muy agradecido por la ayuda

 
Maxim Shershnev:

Buenas tardes a todos.

Me pregunto cómo analizar las estadísticas de trabajo en EXCEl

¿Quién puede decirme lo que puede ser extraído a través de DDE de mt4 y donde puedo obtener todas las funciones permitidas para la transferencia a Excel

Estaré muy agradecido por la ayuda

Hay todo lo que necesitas. El formato de registro .csv escribe en excell
Файловые операции - Справочник MQL4
Файловые операции - Справочник MQL4
  • docs.mql4.com
Файловые операции - Справочник MQL4
Razón de la queja: