[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 1085
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
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?
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("Сформировался новый бар"); // Вывод на экран
}
}
//--------------------------------------------------------------------
Prova questo codice. Sembra funzionare, basta vedere se è giusto o sbagliato:
kolyango: Ti mostrerò il codice giusto. Guarda.
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);
}
Ma guarda, sembra funzionare correttamente! L'ho controllato sull'orario M1:
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?
New_Time=Time[0] функция Fun_New_Bar() не будет возвращать истину
kolyango: Ti mostrerò il codice giusto. Guarda.
drknn:
... Программирование - это не игра в угадайки - тут думать надо...
... Beh, almeno a volte ... :-)))
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.