Cierre de posiciones. Señal indicadora de encendido. - página 2

 

En mi caso era "<=", pero los valores del estocástico cambian muy fuertemente incluso con cada tick - hay cuatro decimales más, es decir, en un tick los valores pueden cambiar de (por ejemplo) 75,0003 a 74,0900.

Por lo tanto, el signo "=" puede omitirse sin ningún temor. Pero claro, para no pensar - creo que lo haré.

 
Miré al experto - todo parece estar correcto. No pude comprobarlo - no hay indicador.
Pruebe a añadir Print antes de OrderClose y vea si aparece la señal de cierre.
 

Hecho. Añadido. ¡No, .....! La notificación de cierre no aparece en el libro de registro.

//********* Закрытие позиций ****************************************
if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNum)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=75 && Stochast_0<75)     {
         Print ( OrderClose(OrderTicket(),OrderLots(),Bid,3,Green)); // закрываем позицию
                 return(0); // выходим
         
              }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=25 && Stochast_0>25)    {
               Print  (OrderClose(OrderTicket(),OrderLots(),Ask,3,Green)); // закрываем позицию
                 return(0); // выходим
       
              }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************

¡No lo entiendo! He puesto este bloque en otro EA. Y un tercero. ... . Pero la situación no ha cambiado. Los puestos no están cerrados. Aunque rara vez, rara vez (una o dos veces en la historia = 1 año) y parpadea un triángulo verde cerca en el gráfico visual. Pero no debería ser así. Las posiciones, a juzgar por el código, deberían cerrarse como una lanzadera de máquina de coser.

Indicador NOnLagMA en la descarga

Archivos adjuntos:
 

¿Tal vez este bloque no debería funcionar? Al fin y al cabo, en el código tenemos stops al abrir: - stoploss y takeprofit. ¿Y tal vez todas las demás condiciones de cierre se ignoran por esta razón?

ticket=OrderSend(Symbol(),0,Lots,Ask,Slippage,Bid-SL_long*Point,Ask+TP_long*Point, NULL,MagicNum, 0,CLR_NONE);

Tendré que lidiar con ello de alguna otra manera.

 
rid:

¡No entiendo nada!

El bloque de cierre de posición estaba dentro de la cláusula "if(OrdersTotal() == 0)
Deberías estar más atento).

Aquí está la función start() de la variante de prueba (sin SL y TP, con mensajes correctos y sin deslizamientos innecesarios):
int start()
  {
 
 if(Time[0] <= prevtime) 
       return(0);
 prevtime = Time[0];
  if (UseTrailing) TrailPositions();   
//----
   double NLg_Signal_0 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,0); 
   double NLg_Signal_1 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,1); 
   double NLg_long0    =iCustom(NULL,0,"NonLagMA_v5",0,NLg_buy,0,0,0,0,DV_buy,0,0);
   double NLg_short0   =iCustom(NULL,0,"NonLagMA_v5",0,NLg_sell,0,0,0,0,DV_sell,0,0);
 
  if (OrdersTotal()   == 0)//если нет открытых позиций
  { 
//---------проверяем условие на покупку-----------------      
       if   ( 
              (NLg_Signal_1<=NLg_long0)  &&
              (NLg_Signal_0>NLg_long0)  )
       { 
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера BUY" ); prevtime = Time[1]; }
       }
    //---------проверяем условие на продажу----------------- 
         if  (   
              (NLg_Signal_1>=NLg_short0)  &&
              (NLg_Signal_0<NLg_short0)  )
       { 
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера SELL" ); prevtime = Time[1]; }
       }
   }
//------------------------------------------------------------------
//********* Закрытие позиций ****************************************
if (AutoClose) 
{  
    //----переменные для закрытия позиций ----
    double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
    double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
    //----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNum)   { 
    //-----------------------------------------------------                  
    if (OrderType() == OP_BUY) { 
          if(Stochast_1>75 && Stochast_0<75)     {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                     return(0); // выходим
                    }       
         }  
     //--------------------------------------------------------
    if (OrderType() == OP_SELL) { 
          if(Stochast_1<25 && Stochast_0>25)    {
                     OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                     return(0); // выходим
                    }       
         }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************   
   return(0);
      }



Pero yo no usaría este EA en una cuenta real si fuera usted. Hay que ponerlo en orden, o en "disposición", si se quiere ;)
 

Sí, por supuesto. Gracias por su ayuda. Entiendo su comentario sobre mi error.

Y he tomado nota de sus recomendaciones. Todavía hay un largo camino por recorrer antes de que el comercio real...

p.s/ Todo está funcionando.... ¡! ¡Y cómo ha funcionado!

 
Es comprensible que los beneficios no aumenten con estos cierres. Pero la reducción..... A menudo disminuye significativamente.
 
komposter:
No he mirado el código.
Pero una cosa es segura: en lugar de "if(Stochast_1>75 && Stochast_0<75)" yo haría "if(Stochast_1>75 && Stochast_0<=75)".

Una forma mejor sería: if(Stochast_1-75.0>0 && Stochast_0-75.0<=0) para evitar conversiones innecesarias de los tipos int y double.
 
Y cómo evitamos los innecesarios int y double. ? No se me ocurre ninguno. Además, en lugar de números podemos utilizar parámetros externos - extern int Up_lim = 80; extern int Low_lim = 20;
 
rid:
Y cómo evitamos los innecesarios int y double. ? No puedo entenderlo. Además, en lugar de números podemos utilizar parámetros externos extern int Up_lim = 80; extern int Low_lim = 20;

En primer lugar, es incorrecto comparar Stochast_ real y entero 75, y en segundo lugar, es más correcto comparar su diferencia con cero.

Comparación de números reales".