[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 309

 
Zhunko grazie mille, tutto torna indietro con un boomerang e anche il bene.
 
artmedia70:
Esattamente. La variabile globale Reason ottiene un valore, ma non lo ottiene in deinit(), ma in init() in modo che quando si esegue init(), si può vedere il motivo dell'ultima deinizializzazione ed eseguire una certa azione basata sul valore. Ma non funziona come dovrebbe.

Vi è stato detto come fare. È in deinit() che si scopre il motivo dell'ultima deinizializzazione e lo si passa attraverso una variabile dichiarata globalmente. In init() si controlla il valore della variabile e si scopre il motivo dell'ultima deinizializzazione. Funziona!!!

PS Apparentemente non tutti si rendono conto che init()/deinit() non cambiano i valori delle variabili dichiarate globalmente a meno che non sia esplicitamente dichiarato nelle dichiarazioni all'interno delle funzioni.

In realtà, è meglio non chiudere gli ordini in init(). Lì, MarketInfo() spesso non funziona come previsto.

int    DeinitReason = 0; // определяем переменную на глобальном уровне
...
int init ()
{
...
      if ( DeinitReason == 3) // если смена таймфрейма
...
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
 
Mislaid:
Vi è stato detto come fare. È in deinit() che si scopre il motivo dell'ultima deinizializzazione e lo si passa attraverso una variabile dichiarata globalmente. In init() si controlla il valore della variabile e si scopre il motivo dell'ultima deinizializzazione. Funziona!!!
Ho capito che Artyom ha un problema specifico con il passaggio da TF M5. C'è un errore. Dovremmo controllare se questo è il caso. Forse è un bug in MT4.
 
Zhunko:
Questo ha suggerito cosa fareste con questa funzione. Una funzione come questa viene di solito eseguita attraverso la storia.

Non posso nemmeno immaginare di eseguire la funzione in un ciclo...
 
hoz:

Non posso immaginare che la funzione venga eseguita in un ciclo...

Non c'è di che:
for(i=OrdersTotal()-1;i>=0;i--){
    Print(GetOrderInfo(i,OrderMagic,.....));// вызов пользовательской функции 
}

for(i=0;i<OrdersTotal();i++){/// вызов функции "ордерс тотал" на каждой итерации

}
 
Zhunko:
Ho capito che Artem ha un problema con il passaggio da M5 TF. C'è un errore. Vorrei controllare se è così. Forse è un bug di MT4.

No, non è un bug. Ecco l'EA. Cambiato timeframes da M1 a H1

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   Print("DeinitReason ",DeinitReason);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+ 
19:20:02 111 CADJPY,M15: inizializzato
19:20:09 111 CADJPY,M15: DeinitReason 3
19:20:09 111 CADJPY,M15: deinizializzato
19:20:09 111 CADJPY,M15: uninit reason 3
19:20:09 Supertrend[1] CADJPY,M15: deinitialized
19:20:09 Supertrend[1] CADJPY,M15: uninit reason 3
19:20:09 HLC CADJPY,M15: deinizializzato
19:20:09 HLC CADJPY,M15: uninit reason 3
19:20:09 AMA ottimizzato1 CADJPY,M15: deinizializzato
19:20:09 AMA ottimizzato1 CADJPY,M15: uninit reason 3
19:20:09 AMA ottimizzato1 CADJPY,M15: deinizializzato
19:20:09 AMA ottimizzato1 CADJPY,M15: uninit reason 3
19:20:09 Supertrend[1] CADJPY,H1: inizializzato
19:20:09 HLC CADJPY,H1: inizializzato
19:20:09 AMA ottimizzato1 CADJPY,H1: inizializzato
19:20:09 AMA ottimizzato1 CADJPY,H1: inizializzato
19:20:09 111 CADJPY,H1: inizializzato
 
Mislaid:

No, non è un bug. Ecco l'EA. Cambiato timeframes da M1 a H1

Questo è buono! Ho anche molte ragioni per la deinizializzazione.

Mislaid:

In realtà, è meglio non chiudere gli ordini in init(). Lì MarketInfo() spesso non funziona come previsto.

Sì, non si può. È scritto nell'aiuto.

hoz:

Non posso nemmeno immaginare che la funzione venga eseguita in un ciclo...
È la routine.
 
Zhunko:

Questo è buono! Perché anch'io ho molto legato alle ragioni della deinizializzazione.

Sì, non si può. È scritto nell'aiuto. È una cosa comune.

Ecco la variante finale da controllare. Il precedente non ha avuto molto successo, perché init()/deinit() a volte non fanno amicizia con print()

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

int    DeinitReason = 0; // определяем переменную на глобальном уровне
bool firststart = true;
int init ()
{
}

int deinit()
  {
//----
   DeinitReason = UninitializeReason( );
   firststart = true;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if ( firststart )
  {
      Print( "DeinitReason ", DeinitReason, " ", Period( ) );
      firststart = false;
  }
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Mi sono chiesto come scrivere una funzione. L'idea è che quando N candele tornano indietro in una certa direzione, dovrebbe calcolare il numero di candele. MA. Per questo ci sono diverse condizioni, o più precisamente sarà un elenco di loro nel tempo.

Diciamo che la tendenza, per esempio, è diretta verso il basso,... ...un pullback sale. Voglio, se 5 candele sono salite, e ogni candela era rialzista, e, per esempio, la dimensione di ogni candela era più grande dii_sizeOfCurrBar, e alcune altre condizioni, allora produrre il numero di barre continuamente rialziste, e restituire qualche risultato dalla funzione.

Qual è il modo migliore per scriverlo? Al momento ho iniziato a scrivere, e ho capito che dovrei eseguirlo attraverso un ciclo per barre, e in qualche modo limitare la vista nella profondità della storia non per un numero fisso di barre, ma per barre, con quei parametri, che ci interessano per condizioni.

Ecco quello che ho, ricevuto:

int LastCandlesType()
{
   bool up,    // Свеча направлена вверх
        dn;    // Свеча направлена вниз
   int cnt;    // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-6; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром.
          continue;
      
      if (Close[i] > Open[i])                               // 
          up = true;

      cnt++;
   }
   if (cnt == 5)
       return (BULL_CANDLES);
}

Al momento stiamo solo andando dalla penultima barra alla barra con indice 6, cioè 5 barre in fila. Ma voglio che il mio Expert Advisor cerchi solo le barre che sono rialziste e non tutte in fila. Come implementarlo adeguatamente?

Ho filtrato correttamente in base alle dimensioni.

E quando tutto è già scritto, il contatore calcolerà il numero di barre continue con i parametri nht,etvsvb e se ci sono abbastanza di tali barre, verrà restituito un valore della funzione.

 
Mislaid:

Vi è stato detto come fare. È in deinit() che si scopre il motivo dell'ultima deinizializzazione e lo si passa attraverso una variabile dichiarata globalmente. In init() si controlla il valore della variabile e si scopre il motivo dell'ultima deinizializzazione. Funziona!!!

PS Apparentemente non tutti si rendono conto che init()/deinit() non cambiano i valori delle variabili dichiarate globalmente a meno che non sia esplicitamente dichiarato nelle dichiarazioni all'interno delle funzioni.

In realtà, è meglio non chiudere gli ordini in init(). Lì MarketInfo() spesso non funziona come previsto.

E dove mi vedete chiudere le posizioni in init()? Ho fatto una domanda sulla richiesta di cancellazione, ma dove li cancello - non l'ho detto, tanto meno chiesto. Perché lo pensa?