Se dici che è brutto, dimmi come renderlo buono. Spostare i calcoli a OnInit?
Giusto rimprovero )) Qui, una variante del codice che è stato pubblicato qui:
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
if(prev_calculated == 0) {
limit = rates_total - 1; //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
}
else limit = rates_total - prev_calculated + 1;
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
}
return(rates_total);
Prova a farlo in questo modo. Non c'è bisogno di spostare nulla in OnInit.
Non ho pubblicato tale codice qui - non è il mio genere :)
Io uso altre costruzioni - più semplici e più chiare.
È mio, come potrebbe essere più semplice? ))) (almeno, ho anche nel mio modello il commentolimit = rates_total - 1;//--- Prima chiamata dell'indicatore o cambiamento di timeframe o caricamento di dati dalla storia) e il mio stile di formattazione - una parentesi graffa vicino a for() {
Per imparare a scrivere il tuo indicatore, prendi il modello di cui sopra e aggiungi almeno il prezzo di chiusura e ottieni il tuo primo indicatore, poi impara a fare il MAH da questo prezzo di chiusura
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
Buffer[i] = close[i];
}
Non è il tuo codice. È stato pubblicato da alcuni miei colleghi, ma non ricordo chi e dove. Era questo codice che intendevo quando ho scritto che nulla dovrebbe essere spostato a OnInit ma non il codice sorgente. Non sono stato molto chiaro.
E quale costruzione consiglieresti? Questo sembra essere molto semplice.
Ah, ecco l'autore del pezzo )))) Davanti a me. A proposito, anch'io uso questo stile di formattazione - con una parentesi graffa aperta in una riga.
Andrei Novichkov: Ah, ecco l'autore del frammento )))) Davanti a me. A proposito, anch'io uso questo stile di formattazione - con una parentesi graffa aperta in una riga.
Si esegue la procedura guidata per la creazione di un indicatore, si selezionano i tipi e i colori delle linee e si aggiungono gli input, se necessario
e questo è tutto, l'indicatore è pronto, quindi copiateil corpo daltemplate OnCalculate() e scrivete i calcoli ,
puoi scrivere il tuo primo indicatore in 1 minuto, il codice "Ciao parola I indicatore! - Ho mostrato :)
ZS: A proposito, gli indicatori possono essere trasferiti da MT4 a MT5 in questa forma, la cosa principale è impostare correttamente i buffer degli indicatori, in MT5 c'è un creep nell'indicizzazione degli array sotto i buffer.... sono solo array con il solito array )))) indicizzazione .... prima era difficile abituarsi all'indicizzazione dei buffer degli indicatori in MT4, ora al contrario è impossibile abituarsi e passare a MT5 ))))
Questo non è il vostro codice. È stato pubblicato da uno dei miei colleghi, ma non ricordo chi e dove. Era questo codice che intendevo quando ho detto che nulla dovrebbe essere spostato a OnInit ma non il codice sorgente. Non sono stato molto chiaro.
E quale costruzione consiglieresti? Questo sembra essere molto semplice.
Ah, ecco l'autore del pezzo )))) Davanti a me.
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.if(limit>1)
// если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
//--- Расчёт индикатораfor(int i=limit; i>=0 && !IsStopped(); i--)
{
// необходимые действия по расчёту индикатора
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
sì, a cosa serve il codice del modello di indicatore? eseguire la procedura guidata per creare un indicatore , scegliere i tipi e il colore delle linee e, se necessario, aggiungere gli input
e il gioco è fatto, l'indicatore è pronto, quindi copia il corpo dal modello OnCalculate()e scrivi i calcoli,
puoi scrivere il tuo primo indicatore in 1 minuto, il codice sopra è "Hello word I indicator!!!" Ho mostrato :)
PS: a proposito, in questa forma, gli indicatori possono essere trasferiti da MT4 a MT5, l'importante è impostare correttamente i buffer degli indicatori, in MT5 c'è un orrore che con gli array di indicizzazione per i buffer .... sono solo array con il solito array)))) indicizzazione .. .. prima era difficile abituarsi all'indicizzazione dei buffer degli indicatori in MT4, ora invece è impossibile abituarsi e passare a MT5))))
Niente di complicato. Un esempio di indicatore multipiattaforma (usa una classe), ma il modello può essere estratto - rimuovi la classe e tutto ciò che è superfluo che darà errori dopo - il modello multipiattaforma rimarrà.
Questo indicatore funzionerà allo stesso modo su entrambe le piattaforme senza modifiche: basta compilare con l'estensione richiesta. Ho dovuto dividere il codice in due parti: la classe e l'indicatore stesso (tutto era in un elenco)
Come creare un array di istanze di classe?
Ho fatto ClassName* className[], poi ArrayResize su di esso, ma non mi dà accesso ai metodi
La vostra classe, le cui istanze volete raccogliere in un array, deve essere ereditata da CObject.
E poi è semplice: create una lista (array) di oggetti CArrayObj, e aggiungeteci i vostri oggetti.
Cercando le parole "indicator template" e il tuo nome non si trova nulla, e tu hai già scritto qui su quel volume di Guerra e Pace.
Mi viene in mente qualsiasi combinazione di parole del post.
Beh, mi dispiace, per quanto riguarda il template dell'indicatore forse ho fatto confusione - il template a strascico è stato postato.
Mettiamola così: create un modello di indicatore nell'editor, aggiungete il numero richiesto di variabili di input e di buffer da disegnare.
Successivamente, suddividete ciò che dovete fare dal compito specifico.
Se dici che è brutto, dimmi come renderlo buono. Spostare i calcoli a OnInit?
Giusto rimprovero )) Qui, una variante del codice che è stato pubblicato qui:
Prova a farlo in questo modo. Non c'è bisogno di spostare nulla in OnInit.
Giusto rimprovero )) Qui, una variante del codice che è stato pubblicato qui:
Prova a farlo in questo modo. Non c'è bisogno di spostare nulla in OnInit.
Non ho pubblicato tale codice qui - non fa per me :)
Io uso altre costruzioni - è più semplice e più chiaro.
In OnInit() dovrebbe essere trasferito. Perché avete bisogno di assegnare un array al buffer dell'indicatore su ogni tick?
Non ho pubblicato tale codice qui - non è il mio genere :)
Io uso altre costruzioni - più semplici e più chiare.
È mio, come potrebbe essere più semplice? ))) (almeno, ho anche nel mio modello il commentolimit = rates_total - 1;//--- Prima chiamata dell'indicatore o cambiamento di timeframe o caricamento di dati dalla storia) e il mio stile di formattazione - una parentesi graffa vicino a for() {
Per imparare a scrivere il tuo indicatore, prendi il modello di cui sopra e aggiungi almeno il prezzo di chiusura e ottieni il tuo primo indicatore, poi impara a fare il MAH da questo prezzo di chiusura
Non ho pubblicato tale codice qui - non è il mio genere :)
Uso costruzioni diverse - più semplici e più chiare.
Niente deve essere copiato in OnInit(). Perché dovrei assegnare un array al buffer dell'indicatore ad ogni tick?
Non è il tuo codice. È stato pubblicato da alcuni miei colleghi, ma non ricordo chi e dove. Era questo codice che intendevo quando ho scritto che nulla dovrebbe essere spostato a OnInit ma non il codice sorgente. Non sono stato molto chiaro.
E quale costruzione consiglieresti? Questo sembra essere molto semplice.
Ah, ecco l'autore del pezzo )))) Davanti a me. A proposito, anch'io uso questo stile di formattazione - con una parentesi graffa aperta in una riga.Ah, ecco l'autore del frammento )))) Davanti a me. A proposito, anch'io uso questo stile di formattazione - con una parentesi graffa aperta in una riga.
Si esegue la procedura guidata per la creazione di un indicatore, si selezionano i tipi e i colori delle linee e si aggiungono gli input, se necessario
e questo è tutto, l'indicatore è pronto, quindi copiateil corpo daltemplate OnCalculate() e scrivete i calcoli ,
puoi scrivere il tuo primo indicatore in 1 minuto, il codice "Ciao parola I indicatore! - Ho mostrato :)
ZS: A proposito, gli indicatori possono essere trasferiti da MT4 a MT5 in questa forma, la cosa principale è impostare correttamente i buffer degli indicatori, in MT5 c'è un creep nell'indicizzazione degli array sotto i buffer.... sono solo array con il solito array )))) indicizzazione .... prima era difficile abituarsi all'indicizzazione dei buffer degli indicatori in MT4, ora al contrario è impossibile abituarsi e passare a MT5 ))))Questo non è il vostro codice. È stato pubblicato da uno dei miei colleghi, ma non ricordo chi e dove. Era questo codice che intendevo quando ho detto che nulla dovrebbe essere spostato a OnInit ma non il codice sorgente. Non sono stato molto chiaro.
E quale costruzione consiglieresti? Questo sembra essere molto semplice.
Ah, ecco l'autore del pezzo )))) Davanti a me.sì, a cosa serve il codice del modello di indicatore? eseguire la procedura guidata per creare un indicatore , scegliere i tipi e il colore delle linee e, se necessario, aggiungere gli input
e il gioco è fatto, l'indicatore è pronto, quindi copia il corpo dal modello OnCalculate() e scrivi i calcoli,
puoi scrivere il tuo primo indicatore in 1 minuto, il codice sopra è "Hello word I indicator!!!" Ho mostrato :)
PS: a proposito, in questa forma, gli indicatori possono essere trasferiti da MT4 a MT5, l'importante è impostare correttamente i buffer degli indicatori, in MT5 c'è un orrore che con gli array di indicizzazione per i buffer .... sono solo array con il solito array)))) indicizzazione .. .. prima era difficile abituarsi all'indicizzazione dei buffer degli indicatori in MT4, ora invece è impossibile abituarsi e passare a MT5))))Niente di complicato. Un esempio di indicatore multipiattaforma (usa una classe), ma il modello può essere estratto - rimuovi la classe e tutto ciò che è superfluo che darà errori dopo - il modello multipiattaforma rimarrà.
Questo indicatore funzionerà allo stesso modo su entrambe le piattaforme senza modifiche: basta compilare con l'estensione richiesta. Ho dovuto dividere il codice in due parti: la classe e l'indicatore stesso (tutto era in un elenco)
Classe:
Indicatore: