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

 
goldtrader:

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

Creo que en esta situación un error de 8 decimales no afectará al resultado.
 

Otro problema surge con el bloque de cierre de posiciones. Puse este bloque en mi Asesor Experto favorito. Sólo abre tratos estrictamente en la dirección de la tendencia (mi enhorabuena por ello...)

Pero dependiendo de la fuerza de la tendencia, el Asesor Experto es (¡y lo hace!) capaz de abrir constantemente varias operaciones, ¡una tras otra! Aquí es donde necesito el bloque de posiciones de cierre a la señal del indicador. Pero aquí está el problema: cuando se abren varias posiciones dentro de una tendencia y comienza la corrección contra la tendencia, el indicador del bloque da una señal de cierre. Como lo necesito.

Sin embargo, por alguna razón, no se cierran todas las posiciones abiertas. Básicamente, sólo la más temprana. Las que se han abierto más tarde no reaccionan a la señal de cierre, sino que continúan el movimiento. ¡Y además, - "la historia se repite como una farsa"! Con cada señal de cierre, sólo se cierra una, la posición abierta más antigua, y las demás siguen moviéndose. El lote de todos los puestos es constante.

Aquí está el gráfico del modo visual. El cierre por la señal del indicador se marca con un triángulo verde. Se ve claramente que sólo se cierra una posición cada vez por la señal. Me gustaría que se cerraran todos los puestos abiertos. Por favor, aconséjeme, ¿cuál es la razón?

Un recordatorio del código :

/********* Закрытие позиций ****************************************
if (AutoClose) {  
//----------------------------------------------------------------------
if (ExpertOrder(MagicLong)) {   //есть открытые ордера на покупку
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);//закрываем позицию
                 return(0); // выходим         
              }  }
 //--------------------------------------------------------
if (ExpertOrder(MagicShort)) {   //есть открытые ордера на продажу
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем позицию
                 return(0); // выходим
              }  } 
 //-------------------------------------------------------                       
}  //if (AutoClose)
 
rid:

Otro problema surge con el bloque de cierre...

¿Dónde está el bucle de OrdersTotal()?
 
granit77:
¿Dónde está el bucle de OrdersTotal()?
Aunque haya uno, es de 0 a OrdersTotal()-1, y debería ser al revés ;)
 

No, ese no es el caso aquí. Las órdenes se definen de forma diferente:

//---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                           |
// true  - есть ордера данного эксперта;                                           |
//---------------------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
bool result=false;
int  _OrdersTotal=OrdersTotal();
if (_OrdersTotal>0) { for (int jk=0; jk<_OrdersTotal; jk++) {    
      if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderMagicNumber()==VersionID) 
          { result=true;  break; }//Найден ордер принадлежащий эксперту
        else  { result=false; } 
       } } } else { result=false; }  
//---------------------        
return(result);}

Y esta versión del código es más cómoda para mí. Porque mis posiciones largas y cortas se abren independientemente unas de otras.

//---------проверяем условие на покупку----------------------------
if (LONG) {     //если  "выключатель" включен
 if  ( ... ... ...      )
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,
                                        Ask+TP*Point,NULL,MagicLong,0,CLR_NONE); 
 

Sin embargo, sigue siendo el mismo con el cierre estándar. ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_
 
rid:

Sin embargo, sigue siendo el mismo con el cierre estándar. ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

Puede intentar hacer un bucle inverso desde OrdersTotal hasta 0. Eso debería ayudar.
 

¿Cómo hacerlo? Por favor, escriba, si no es demasiado de una carga. Aquí está el gráfico por el camino - con el anterior "estándar": Todo es lo mismo - sólo una posición se cierra en la señal del indicador -

 
rid:

¿Cómo se hace eso?

Según komposter y Vinin, en lugar de:
for (int v=0; v<OrdersTotal(); v++)

escribir:
for (int v=OrdersTotal()-1; v>0; v--)

A mí me funciona.
 
granit77:
rid:

¿Cómo se hace?

Si hay que creer a komposter y a Vinin, en cambio:
for (int v=0; v<OrdersTotal(); v++)

escribir:
for (int v=OrdersTotal()-1; v>0; v--)

A mí me funciona.

Tienes toda la razón. Aunque KimV tiene scripts y bibliotecas que implementan todo esto. Tal vez deberías buscarlo en su foro.