Fechamento das posições. No sinal indicador. - página 3

 
goldtrader:

primeiro, é incorreto comparar Stochast_ real e integer 75, e segundo, é mais correto comparar sua diferença com zero.

Penso que, nesta situação, um erro de 8 casas decimais não afetará o resultado.
 

Outro problema surge com o Bloco de Fechamento de Posição. Coloquei este bloco em meu Expert Advisor preferido. Só abre negócios estritamente na direção da tendência (meus parabéns por isso...)

Mas dependendo da força da tendência, o Expert Advisor é (e o faz!) consistentemente capaz de abrir vários negócios, - um após o outro! É aqui que eu preciso do bloco de posições de fechamento ao sinal do indicador. Mas aqui está o problema! Quando e se várias posições são abertas dentro de uma tendência e a correção contra a tendência começa, o indicador no bloco dá um sinal para fechar. Como eu preciso.

Entretanto, por alguma razão, nem todas as posições em aberto estão fechadas. Basicamente, apenas a mais antiga. As que foram abertas mais tarde não reagem ao sinal de fechamento - mas continuam o movimento. E mais, - "a história se repete como uma farsa"! Com cada sinal de fechamento, apenas um, a primeira posição aberta é fechada, e os outros continuam a se mover! O lote de todas as posições é constante.

Aqui está o gráfico do modo visual. O fechamento pelo sinal do indicador é marcado com um triângulo verde. Vê-se claramente que apenas uma posição é fechada a cada vez pelo sinal. Eu gostaria que todas as posições abertas fossem fechadas! Por favor, me avise, qual é a razão?

Um lembrete de 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:

Outro problema surge com o Bloco de Fechamento...

Onde está o laço no OrderTotal() ?
 
granit77:
Onde está o laço no OrderTotal() ?
Mesmo que haja um, é de 0 a OrderTotal()-1, e deve ser o contrário ;)
 

Não, esse não é o caso aqui. As ordens são definidas - 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);}

E esta versão do código é mais confortável para mim! Porque minhas posições longas e curtas abrem independentemente uma da outra.

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

No entanto, ainda é o mesmo com o fechamento padrão. ...

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:

No entanto, ainda é o mesmo com o fechamento padrão. ...

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_

Talvez você queira tentar fazer um loop inverso de OrdersTotal a 0. Isso deve ajudar.
 

Como fazer isso? A propósito, aqui está o gráfico - com o "padrão" acima: Tudo é o mesmo - apenas uma posição fecha no sinal do indicador -

 
rid:

Como você faz isso?

Segundo komposter e Vinin, em vez de:
para (int v=0; v<OrderTotal(); v++)

escrever:
para (int v=OrdensTotal()-1; v>0; v--)

Funciona para mim.
 
granit77:
livrar:

Como você faz isso?

Se acreditarmos em komposter e Vinin, ao invés disso:
para (int v=0; v<OrderTotal(); v++)

escrever:
para (int v=OrdensTotal()-1; v>0; v--)

Funciona para mim.

Você está absolutamente certo. Embora a KimV tenha scripts e bibliotecas que implementam tudo isso. Talvez você devesse procurá-lo em seu fórum.