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

 
komposter:
rid:

El resultado sigue siendo el mismo. Con la última variante sólo se cierra la última posición abierta.

Ahora elimine return después de OrderClose, y observe el resultado ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Lo hice como se me indicó. Y ocurrió un milagro. Todas las posiciones abiertas se cierran con la señal del indicador. ¿Pero por qué?
 
rid:
komposter:
rid:

El resultado sigue siendo el mismo. Con la última variante sólo se cierra la última posición abierta.

Ahora elimine return después de OrderClose, y observe el resultado ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Lo hice como se me indicó. Y ocurrió un milagro. Todas las posiciones abiertas se cerraron según la señal del indicador. ¿Pero por qué?
Su devolución interrumpió el ciclo de procesamiento.
 
Lo tengo. Gracias a todos los que han respondido.
 
KimIV:

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 de trabajo con las posiciones.
Por favor, Igor, describe tu funcionalidad con un poco más de detalle. Quiero entenderlo, pero debido a mis modestos conocimientos pierdo el hilo al principio.
 
rid писал (а):
Por favor, Igor, describe tu función con más detalle. Quiero entenderlo, pero debido a mis modestos conocimientos puedo perder el hilo al principio.

Este fue un ejemplo extraído de un EA en funcionamiento. Asignación de funciones:

  1. La función GetTradeSignal() rellena la matriz ms[] con señales comerciales. Cada experto tiene su propio relleno de la función GetTradeSignal(), por supuesto.
  2. La función ExistPositions() devuelve el indicador de presencia de la posición.
  3. La función ClosePositions() cierra una o más posiciones en presencia de una señal correspondiente en la matriz ms[]. Antes de cerrar, se comprueba la presencia de una posición mediante la condición if (ExistPositions("", -1, Magic)).
  4. La función OpenPosition() abre una posición al precio actual en presencia de una señal correspondiente en la matriz ms[]. La posición puede abrirse sólo si no hay señal.

Tácticas:

  1. Si hay posiciones y hay una señal de cierre, entonces cierra las posiciones.
  2. Si no hay posiciones y hay una señal para abrir una posición, entonces abra una posición.

¿Ves lo fácil que es? :-)

 
Sí, gracias. Veré lo que puedo averiguar.
 

¡Hola a todos! ¡Feliz Navidad!

Ha surgido otro problema. He revisado la teoría, pero aún no he encontrado una salida. Por alguna razón, necesito cerrar las posiciones abiertas en mi Asesor Experto utilizando la función en lugar de utilizar las paradas (Stop Loss y Take Profit). Lo he hecho. ¡Funcionó! Sin embargo...

Al intentar insertar en un Asesor Experto la librería para el cálculo de lotes (B-lots), ¡me encontré con que empezó a funcionar de manera desconocida! Si no hubiera utilizado MM, la curva de balance (después de la optimización) iba constantemente hacia arriba con una reducción apenas perceptible, ¡después de añadir MM obtuve una fuerte caída en picado! Además. Incluso si eliminamos la biblioteca de lotes B y simplemente aumentamos el tamaño del lote de 0,1 a 0,2, volvemos a ver una fuerte caída. Incluso cuando el depósito inicial se incrementa en varias veces ..... Es decir, no es ni la biblioteca ni el tamaño del depósito, sino que la detracción era miserable para empezar... . Yo entro en el mercado así:

//---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if (Long)    {  //выключатель вкл   
if (!ExpertOrder( MagicLong ))     {//если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicLong,0,Blue); 
    if(ticket<0){Print("Ошибка открытия ордера BUY #",GetLastError());return(0);}
              }
              }
Aquí todo es claro y comprensible. Luego cierro las posiciones utilizando la función OrderClose(. ...). Así:
for (int v=0; v<OrdersTotal(); v++)               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))  {           
        if (OrderSymbol()==Symbol() )                   { 
//-----------------------------------------------------             
if (ExpertOrder( MagicLong ))  {
  if(OrderProfit() > tp)   { OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); return(0);}
  if(OrderProfit() <= -sl) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); return(0);}
                               }
}}}
Cuando establezco inicialmente el lote=0,1, el diseño funciona bien. Cuando intento cambiar el tamaño del lote (aumentar) o cuando intento activar la biblioteca MM, el funcionamiento se rompe. No puedo entender por qué... He utilizado "Lots" en lugar de OrderLots(), pero nada ha cambiado. Por favor, dígame.
 
rid:
Con el lote inicial=0,1 el diseño funciona bien. Cuando intento cambiar el tamaño del lote (aumentar) o cuando intento habilitar la biblioteca MM, el funcionamiento se rompe. No puedo entender por qué... He utilizado "Lots" en lugar de OrderLots(), pero nada ha cambiado. Por favor, ¿me aconseja?
Tenemos que ver cómo el EA actúa de forma diferente.
¿Se abren/cierran los pedidos a la misma hora que antes?
 

No. Al aumentar el lote de 0,1 a 0,2 las operaciones comienzan a producirse con más frecuencia, ¡más del doble! Con los mismos parámetros externos... Es extraño. ¡Pero no soy demasiado perezoso! Lo hice así:

He eliminado el cierre de posiciones mediante la función OrderClose, y he previsto el cierre normal mediante Stop Loss y Take Profit en la función ticket=OrderSend(... ... ...). En este caso, el bloque MM ha funcionado como es debido. Parece que todo depende de la función

if(OrderProfit() > tp)    { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  }
¿Tal vez habría que cambiar el valor de "tp" al aumentar el lote?
 
¿Apuntamos con el dedo al cielo? ;)

El error está en el código. Dónde - no lo sé, porque ni siquiera hay un código. Llama a los clarividentes de la siguiente rama ;)
Razón de la queja: