Chiusura delle posizioni. Segnale indicatore acceso. - pagina 2

 

Nel mio caso era "<=", ma i valori Stochastic cambiano molto fortemente anche ad ogni tick - ci sono quattro posti decimali in più, cioè in un tick i valori possono cambiare da (per esempio) 75.0003 a 74.0900.

Quindi, il segno "=" può essere omesso senza alcun timore. Ma naturalmente, per non pensare - penso che lo farò.

 
Guardato l'esperto - tutto sembra essere corretto. Non ho potuto controllarlo - nessun indicatore.
Prova ad aggiungere Print prima di OrderClose e vedi se appare il segnale di chiusura.
 

Fatto. Aggiunto. No, .....! L'avviso di chiusura non appare nel registro.

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

Non capisco! Ho messo questo blocco in un altro EA. E un terzo. ... . Ma la situazione non è cambiata! Le posizioni non sono chiuse. Anche se raramente, raramente (una o due volte sulla storia = 1 anno) e lampeggia un triangolo verde vicino sul grafico visivo. Ma non dovrebbe essere così! Le posizioni, a giudicare dal codice, dovrebbero chiudersi come la navetta di una macchina da cucire!

Indicatore NOnLagMA nel download

File:
 

Forse questo blocco non dovrebbe funzionare? Dopo tutto, abbiamo degli stop nel codice quando apriamo: - stoploss e takeprofit. E forse tutte le altre condizioni di chiusura sono ignorate per questo motivo?

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

Dovrete occuparvene in qualche altro modo.

 
rid:

Non capisco niente!

Il blocco di chiusura della posizione era dentro la clausola "if(OrdersTotal() == 0)".
Dovresti essere più attento).

Ecco la funzione start() della variante di test (senza SL e TP, con messaggi corretti e senza slittamenti inutili):
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);
      }



Ma non userei questo EA su un conto reale se fossi in te. Dovrebbe essere messo in ordine, o in "prontezza", se volete ;)
 

Sì, certo. Grazie per il vostro aiuto! Capisco il tuo commento sul mio errore.

E ho preso nota delle vostre raccomandazioni. C'è ancora molta strada da fare prima del vero commercio...

p.s/ Tutto funziona .... ! E come ha funzionato!

 
I profitti non sono comprensibilmente aumentati da tali chiusure. Ma l'estrazione..... Spesso diminuisce significativamente.
 
komposter:
Non ho guardato il codice.
Ma una cosa è certa: invece di "if(Stochast_1>75 && Stochast_0<75)" farei "if(Stochast_1>75 && Stochast_0<=75)".

Un modo migliore sarebbe: if(Stochast_1-75.0>0 && Stochast_0-75.0<=0) per evitare conversioni inutili dei tipi int e double.
 
E come evitare int e double non necessari. ? Inoltre, invece di numeri possiamo usare parametri esterni - extern int Up_lim = 80; extern int Low_lim = 20;
 
rid:
E come evitare int e double non necessari. ? Non riesco a capirlo. Inoltre, al posto dei numeri possiamo usare parametri esterni extern int Up_lim = 80; extern int Low_lim = 20;

In primo luogo, non è corretto confrontare Stochast_ reale e 75 intero, e in secondo luogo, è più corretto confrontare la loro differenza con zero.

'Confronto tra numeri reali'.