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

 

No meu caso foi "<=", mas os valores estocásticos mudam muito fortemente mesmo a cada tick - há mais quatro casas decimais, ou seja, em um tick os valores podem mudar de (por exemplo) 75.0003 para 74.0900.

Portanto, o sinal "=" pode ser omitido sem nenhum medo. Mas é claro, para não pensar - acho que vou pensar.

 
Olhado para o especialista - tudo parece estar correto. Não foi possível verificá-lo - sem indicador.
Tente adicionar Imprimir antes do OrderClose e veja se o sinal de fechamento aparece.
 

Feito. Adicionado. Não, .....! O Aviso de Encerramento não aparece no diário de bordo.

//********* Закрытие позиций ****************************************
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_ 
 //****************************************************************************

Eu não entendo! Coloquei este bloco em outro EA. E um terceiro. ... . Mas a situação não mudou! As posições não são fechadas. Embora raramente, raramente (uma ou duas vezes na história = 1 ano) e pisca um triângulo verde próximo na carta visual. Mas não deveria ser assim! As posições, a julgar pelo código, devem fechar como um vaivém de máquina de costura!

O indicador NOnLagMA é carregado

Arquivos anexados:
 

Talvez este bloco não deva funcionar? Afinal de contas, temos paradas no código quando abrimos: - stoploss e takeprofit. E talvez todas as outras condições de fechamento sejam ignoradas por este motivo?

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

Você terá que lidar com isso de alguma outra forma.

 
rid:

Eu não entendo nada!

O bloco de fechamento de posição estava dentro da cláusula "se(OrdersTotal() == 0)".
Você deveria estar mais atento).

Aqui está a função start() da variante de teste (sem SL e TP, com mensagens corretas e sem deslizamento desnecessário):
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);
      }



Mas eu não usaria este EA em uma conta real se eu fosse você. Deve ser colocado em ordem, ou em "prontidão", se você quiser ;)
 

Sim, é claro. Obrigado por sua ajuda! Entendo seu comentário sobre meu erro.

E tomaram nota de suas recomendações. Ainda há um longo caminho a percorrer antes da verdadeira comercialização...

p.s/ Tudo está funcionando.... ! E como funcionou!

 
Compreensivelmente, os lucros não são aumentados por tais fechamentos. Mas o saque..... Muitas vezes diminui significativamente.
 
komposter:
Eu não olhei para o código.
Mas uma coisa é certa: em vez de "if(Stochast_1>75 && Stochast_0<75)" eu faria "if(Stochast_1>75 && Stochast_0<=75)".

Uma maneira melhor seria: if(Stochast_1-75.0>0 && Stochast_0-75.0<=0) para evitar conversões desnecessárias dos tipos int e duplo.
 
E como evitar int e dobrar desnecessariamente. ? Não consigo pensar em nenhum. Além disso, podemos substituir os números por parâmetros externos - extern int Up_lim = 80; extern int Low_lim = 20;
 
rid:
E como evitar int e dobrar desnecessariamente. ? Eu não consigo entender. Além disso, em vez de números, podemos usar parâmetros externos int Up_lim = 80; extern int Low_lim = 20;

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

Comparação de números reais'.