Cierre de posiciones. Señal indicadora de encendido.

 

¡Buenas noches! Ha surgido un problema.

Necesito cerrar una posición. Por la señal del indicador. Además, necesito poder cerrar la posición mediante Stop Loss o Take Profit. (Por si acaso la señal del indicador llega demasiado tarde. - Esto ocurre a menudo):

if                    (... ... ...  )         
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,
                                               NULL,MAGIC ,0,CLR_NONE);

Posteriormente, para cerrar las posiciones abiertas estipulo:

for (int v=0; v<OrdersTotal(); v++)                          {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))             {           
        if (OrderSymbol()==Symbol()) && OrderMagicNumber()==MAGIC)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY)                   { 
      if (Stochast_1>75 &&  Stochast_0<75)     {
                   OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); 
                 return(0); // выходим
                }       
               }   
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { ... .... ....

Sin embargo, las posiciones se siguen cerrando sólo con el stoploss o el take profit. (con una única y muy rara excepción)

Aunque el indicador en el gráfico muestra - que casi todas las posiciones abiertas deben ser cerradas sólo por la señal del indicador. Por favor, dígame - donde puede haber un error ... ?

 

Suelo implementar este tipo de funcionalidad:

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions() {
  double sl=0, tp=0;
  int    ms[2];
 
  ArrayInitialize(ms, 0);
  GetTradeSignal(ms);
  if (ExistPositions("", -1, Magic)) {
    if (ms[1]>0) ClosePositions("", OP_BUY , Magic);
    if (ms[1]<0) ClosePositions("", OP_SELL, Magic);
  } else {
    if (ms[0]>0) {
      if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      OpenPosition(OP_BUY, sl, tp, Magic);
    }
    if (ms[0]<0) {
      if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      OpenPosition(OP_SELL, sl, tp, Magic);
    }
  }
}
Como puede ver, se escriben funciones que realizan acciones bastante específicas. Y luego estas funciones se combinan de tal manera que se implementan las tácticas deseadas para trabajar con las posiciones.
 
Probablemente algo con Stochast_1, Stochast_0, todo lo demás está bien
 
Gracias, KIM IV. Intentaré averiguarlo.
 
Integer:
Probablemente algo con Stochast_1, Stochast_0, todo lo demás está bien


No..... Los estocásticos están bien. (trabajar en los precios de apertura)

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);
 
La compra se cierra con una oferta. En este caso, el cierre se activa sólo si una cotización que difiere del diferencial especificado resulta estar en el último flujo de cotizaciones. Si dicha cotización aún no ha logrado (por antigüedad) salir de la lista de cotizaciones revisada por el corredor, entonces la orden de cierre tiene una oportunidad de ser ejecutada.
 

¿Le he entendido bien? La posición de compra debe cerrarse

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

Y la posición de venta debe estar cerrada:

OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); ?
 
rid:

¿Le he entendido bien?

En general, has acertado.

 
¡Exactamente! El problema está en Ask
 

¡Todavía no quiero cerrar posiciones por el estocástico! ¡Lo hice bien! He insertado un interruptor en los parámetros externos. Al final del código - ¡bloque separado para cerrar posiciones! He proporcionado un triángulo verde para el cierre.

La táctica es sencilla: cruce de las fronteras del canal formado por MAs lentas con desviaciones hacia arriba y hacia abajo. El código es muy sencillo. El Asesor Experto se descarga a continuación.

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
//********* Закрытие позиций ****************************************
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_

¿Puede alguien echarle un vistazo? Y dime qué pasa....

¿Quizás al abrir un pedido las ofertas y los askchi están mal configurados? Siempre he estado confundido con esto:

ticket=OrderSend(Symbol(),... ....
Archivos adjuntos:
 
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)".