[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 131

 

He rehecho un trozo de código sobre lo que pregunté ayer. Ahora todo está como debería estar. A continuación hay 3 funciones para mostrar lo que se utiliza para obtener la señal original, ya que esto es sólo el comienzo de lo que estoy escribiendo.

//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   
   DeletePendingOrders();
   
   if (signal == SIGNAL_BUY)
       if (!OpenBuy(fastMa, slowMa))
          return(false);
   
   if (signal == SIGNAL_SELL)
       if (!OpenSell(fastMa, slowMa))
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
       if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

Aquí está la función de compra:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
//   if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )
   {
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
   }
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

Aquí está la línea:

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

tenemos una posición que se abre al precioND(fastMa + i_thresholdFromMa * pt), pero no se abre en absoluto. ¿Por qué?

Llevo 2 días luchando, no sé qué hacer. En el código, todo es igual. No he hecho ningún cheque de verdad, ahora los hago de probador.

Aquí hay una captura de pantalla, por ejemplo,

Un conjunto

En el gráfico se puede ver que el precio no es más alto que fastMa (rojo), y más bajo en general. Pero en el código se indica explícitamente la condición de que la orden pendiente debe estar al precio:

ND(fastMa + i_thresholdFromMa * pt)

¿Cuál es la trampa, profesionales? Ya no sé qué hacer...

 

Hola.He escrito un indicador basado en el indicador, el indicador original Señal-Señal muestra sus valores en todas las barras anteriores cuando se adjunta al gráfico (se aplica a todas las barras, a partir de la barra [1]), pero el indicador creado a partir de él (se aplica a la barra [0]) muestra sus valores sólo cuando se adjunta al gráfico, sus valores son correctos pero en las barras anteriores "vacío", por favor, dígame cómo solucionarlo.

Mi código:

#property indicator_separate_window
#property indicator_minimum -7
#property indicator_maximum 7
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DarkOrange
#property indicator_width1  2
#property indicator_width2  2
#property indicator_level1 0.0
//--- buffers
double UpMapBuffer[];
double DnMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,UpMapBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,DnMapBuffer);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int vb;   // внутренний бар
    int i;

    for(i=1;i<Bars-34-1;i++)                                               
     {
      double AO_Sig_Sig_1 = iCustom(NULL,0,"Signal-Signal",0,i);                           
      double AO_Sig_Sig_2 = iCustom(NULL,0,"Signal-Signal",0,i+1);
      
      if((High[i]<=High[i+1])&&(Low[i]>=Low[i+1])&&(AO_Sig_Sig_1==AO_Sig_Sig_2))  vb++;
            
      if((AO_Sig_Sig_1!=AO_Sig_Sig_2)||(i>3+vb)) break;                                                                
     }
         
    i=i*(AO_Sig_Sig_1); 
            
    if(MathAbs(i)>3+vb) i=0;                  

    if(i>0)            
     {
      UpMapBuffer[0]=i;
     }
    else
     {
      UpMapBuffer[0]=0;
     } 
         
    if(i<0)         
     {
      DnMapBuffer[0]=i;
     }
    else
     {
      DnMapBuffer[0]=0;
     }          
                      
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Víctor, creo que deberías poner una pausa en Asc + distancia, y en la condición especificar la proporción de Asc y Mashka, entonces será lo que quieras. Pruébalo.

 
hoz:


Se puede ver en el gráfico que el precio no está por encima de fastMa (la pulsera roja), sino por debajo del todo. Pero en el código se indica explícitamente la condición de que la pausa debe ser al precio:

¿Cuál es la trampa, profesionales? Ya no sé qué hacer...

Tal vez en el momento en que se hizo el pedido, la MA era más baja que la que se dibuja ahora. Intenta tomar los valores de MAA no desde la 0ª barra sino desde la 1ª.
 
borilunad:

Víctor, creo que deberías poner una pausa en Asc + distancia, y en la condición especificar la proporción de Asc y Mashka, entonces será lo que quieras. Pruébalo.


Boris, eso es lo que hice:

//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
      // if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
       if ( (MathAbs(Ask - fastMa) <= 0.1 * pt ) || ( MathAbs(Ask - fastMa) <= 0.1 * pt) )
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

Y aquí está el puesto vacante:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
      
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

Todo parece correcto. Pero sigue ahí.

Sepulca:
Tal vez en el momento en que se hizo el pedido, el MAHA era inferior al que ahora se dibuja. Intente tomar los valores de la MA de la 1ª barra en lugar de la 0ª.


Lo he probado, no hay diferencia. Lo puse en su lugar... Lo que me importa es lo que ocurre en este momento, no lo que ocurría antes.

Aquí hay una captura de pantalla (si el valor recibido de la máquina no es 0, sino 1) :

¿Dónde está la lógica?

 

Víctor, por eso escribo las condiciones al principio, para poder ver todo, así es más fácil encontrar los errores lógicos, sobre todo cuando aún no hay suficiente conocimiento y experiencia, entre los que me cuento por mucho tiempo. Los profesionales manipulan fácilmente las funciones, los archivos y las bibliotecas, y probablemente han olvidado cómo dominaron gradualmente toda esta sabiduría. Pero no podemos aprender la teoría sin la práctica, y depende mucho más del carácter de cada persona.

 
hoz:


Boris, eso es lo que hice:

Y aquí está la apertura del puesto:

Todo parece estar bien. Pero sigue ahí.


Lo he probado, no hay diferencia. Lo puse en su lugar... Lo que me importa es lo que está pasando en este momento, no lo que pasó antes.

Aquí hay una captura de pantalla (si el valor recibido de la máquina no es 0, sino 1) :

Por último, dime exactamente lo que quieres hacer... Por ejemplo: la MAA tal y tal está subiendo y está por encima de la MAA tal y tal y el precio está por encima/por debajo de la MAA tal y tal y si es cierto, entonces coloque una orden pendiente a tal y tal distancia. Le daré un algoritmo aproximado. Porque es difícil dirigirte en la dirección correcta, cuando tus fragmentos de código están arrancados del contexto. Y el problema es para el quinto grado (exagerado).


Encuanto al resaltado: trabaja en precios abiertos, entonces no verás los MACs redibujándose en la barra cero

 
artmedia70:

... es difícil indicarle la dirección correcta...

En mi opinión, no es difícil, pero sí muy fácil de "dirigir" o mandar, pues el compañero es demasiado celoso en su lucha contra los sobres y las estanterías, sin molestarse en estudiar el libro de texto y la documentación. :-)

 
Roman.:

En mi opinión, no es difícil, pero sí muy fácil de "dirigir" o mandar, pues el compañero es demasiado celoso en la lucha contra los sobres y las estanterías, sin molestarse en estudiar el libro de texto y la documentación. :-)

Hombre, prácticamente no hay trampas ... No hay milagros.
Así que un hombre se ha rodeado de estas piedras y las mueve, las mueve.
 
Sepulca:


Muchas gracias, es exactamente lo que se necesita)
Razón de la queja: