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

 
khorosh:

La funzione non è mia - l'ho presa online, ma non l'ho usata. Guardato ora con attenzione - manca un operatore.

Il modo corretto è questo:


Sbagliato di nuovo! L'EA suonerà di nuovo ad ogni tick, perché Fun_New_Bar() restituirà sempre true. La domanda è: perché abbiamo bisogno di Fun_New_Bar() se restituisce sempre true?
 
drknn:


E non funzionerà - devi aver scritto il programma in modo sbagliato. E questo perché non avete idea di come funzionerà il vostro codice. Scomponiamo il tutto. Il corpo dell'Expert Advisor:

Arriva un nuovo tick e viene chiamata la funzione Fun_New_Bar(). Se restituisce true al programma principale, apparirà Alert. Altrimenti, l'EA termina il suo lavoro con il ritorno e aspetta un nuovo tick. Tutto si ripete su un nuovo tick.

Dite che il codice non funziona? Ora guardate cosa avete nel vostro sottoprogramma.

Viene dichiarata una funzione booleana. Poiché è una funzione e non una procedura, dovrebbe restituire qualcosa al programma principale da cui è chiamata. Poiché la funzione è booleana, dovrebbe restituire un valore booleano. Dove avete una stringa che restituisce qualcosa al programma principale? Questo significa che all'inizio del programma, dato che non viene restituito nulla dalla funzione, le parentesi dell'espressione if(Fun_New_Bar()) saranno sempre false e l'avviso non apparirà mai.

Andiamo oltre. Perché avete dichiarato datetime New_Time=0; come statico? Qual è il suo ragionamento? Avete dichiarato una variabile e l'avete immediatamente inizializzata con zero. Al prossimo tick, accadrà la stessa cosa - la variabile sarà dichiarata e inizializzata di nuovo da zero. If(New_Time!=Time[0]){ Questa linea controlla se il valore della variabile non è uguale all'ora corrente. Beh, sì, la variabile ha zero, ma il tempo corrente non è zero. La condizione è soddisfatta, il valore attuale del tempo viene scritto nella variabile, il parametro New_Bar diventa vero. Al prossimo tick , New_Time non sarà più uguale a Time[0], controllerà di nuovo con successo la disuguaglianza e le due operazioni successive saranno eseguite. In altre parole, quando si verifica la condizione if(New_Time!=Time[0]), l'espressione tra parentesi sarà vera ad ogni tick. SEMPRE. Il che porta alla domanda: se è sempre vero, perché diavolo dovrebbe esserci questo assegno? Forse dovremmo semplicemente rimuoverlo? Perché dovremmo assegnare New_Time=Time[0] e New_Bar=true, se queste due variabili non sono usate da nessuna parte? Perché diavolo abbiamo bisogno di questi due incarichi? Vuoi giocare? O sei troppo pigro per pensare?


Prova questo codice. Sembra che funzioni, ma vediamo se è giusto o sbagliato. Se qualcosa è sbagliato, correggetelo:

//--------------------------------------------------------------------
int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
return; // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
Alert("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------

 
kolyango:


Prova questo codice. Sembra funzionare, basta vedere se è giusto o sbagliato:

No, non lo è - ho tutto scritto per voi. Non capisci niente?
 

kolyango: Ti mostrerò il codice giusto. Guarda.

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

int MyChandle;// количество свеч на графике
//+------------------------------------------------------------------+
//|                  Блок инициализации                                |
//+------------------------------------------------------------------+
int init(){
  MyChandle=0;// ну или можно вот так : MyChandle=Bars;

  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                              |
//+------------------------------------------------------------------+
int deinit(){
  if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                            |
//+------------------------------------------------------------------+
int start(){
  if(MyChandle<Bars){
   Alert("Было свеч = ", MyChandle," Стало свеч = ",Bars);

   MyChandle=Bars;
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                       |
//+------------------------------------------------------------------+
 
drknn:
No, non è giusto - ho il codice tutto scritto per voi. Non capisci niente?


Ma guarda, sembra funzionare correttamente! Ho controllato sul timeframe M1:

int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}

 
kolyango:


Ma guarda, sembra funzionare correttamente! L'ho controllato sull'orario M1:



Guarda, puoi leggere o no - te l'ho detto sopra - non è il codice giusto - segnalerà su ogni tick, non una volta su una nuova candela. Vedi sopra - ti ho dato il codice giusto. Di cos'altro non hai bisogno per essere felice? Per sapere perché il tuo codice è sbagliato? L'ho già spiegato, è sbagliato perché per tutto il tempo la subroutine restituisce vero e solo vero. L'avviso apparirà ad ogni spunta! Programmare non è un gioco di indovinelli - bisogna pensare.
 
drknn:

Sbagliato di nuovo! L'EA suonerà di nuovo ad ogni tick, poiché Fun_New_Bar() restituirà sempre true. La domanda è: perché diavolo abbiamo bisogno di Fun_New_Bar() se restituisce sempre true?
Funziona correttamente - ho controllato sul grafico. Quando
New_Time=Time[0]

функция Fun_New_Bar() не будет возвращать истину
 
drknn:

kolyango: Ti mostrerò il codice giusto. Guarda.

E la variante che utilizza Bars è meno preferibile, perché il valore di Bars può cambiare non solo a causa della comparsa di una nuova barra.
 

drknn:
... Программирование - это не игра в угадайки - тут думать надо...

... Beh, almeno a volte ... :-)))

 
khorosh:
E la variante che usa Bars è meno preferibile, perché il valore di Bars può cambiare non solo a causa della comparsa di una nuova barra.


Quindi, illuminatemi - il numero di candele sul grafico può cambiare in relazione a qualcos'altro se non la comparsa di una nuova barra? :)))))

Oh, sì, è vero - il caricamento della storia. :) Comunque, la sua funzione suonerà ad ogni ticchettio - non ricorda il tempo correttamente.

Motivazione: