Non ricalcola 0 bar per la stessa ragione per cui non si parte da 0.
Il mio 0 bar non è calcolato secondo la formula.
Buffer[0]=price[0];
E poi in base al movimento del prezzo, l'indicatore si metterà in pari con la tendenza
Per esempio se il prezzo si è allontanato dall'indicatore e non si muoverà, allora durante il"periodo" di candela l'indicatore recupererà il prezzo, questa è una sorta di alternativa alla MA per me
Il mio primo indicatore. Voglio scalare il simbolo da 0 a 100. Lo sto facendo bene? E come fare in modo che la barra corrente non venga ricalcolata (nel tester va a scatti, ma non sul grafico)
#property indicator_separate_window#property indicator_minimum 0#property indicator_maximum 100#property indicator_buffers 1#property indicator_plots 1//--- plot Label1#property indicator_label1 "Main"#property indicator_type1 DRAW_LINE#property indicator_color1 clrRed#property indicator_style1 STYLE_SOLID#property indicator_width1 1//--- indicator buffersdouble MainBuffer[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
IndicatorSetString(INDICATOR_SHORTNAME,"NormSymbol");
IndicatorSetInteger(INDICATOR_DIGITS,2);
ArrayInitialize(MainBuffer, EMPTY_VALUE);
//---return(0);
}
//+------------------------------------------------------------------+//| 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[])
{
int first,bar,nLowBar=0,nHighBar=0;
int nVizCount = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
if(prev_calculated==0) // проверка на первый старт расчёта индикатора
{
first=0; // стартовый номер для расчёта всех баров
}
else
{
first=prev_calculated-1; // стартовый номер для расчёта новых баров
}
//---- основной цикл расчёта индикатораfor(bar=first; bar<rates_total; bar++)
{
nLowBar =ArrayMinimum(low, bar, nVizCount);
nHighBar=ArrayMaximum(high, bar, nVizCount);
if(nLowBar>0 && nHighBar>0 && high[nHighBar]-low[nLowBar]!=0)
{
MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))*100;
}
else
{
MainBuffer[bar]=EMPTY_VALUE;
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
Konstantin83: come fare in modo che la barra corrente non venga ricalcolata
Memorizza il tempo di apertura della barra corrente e lo confronta con lo stesso valore del tick in arrivo. Ricalcola il valore della barra corrente solo quando i valori non corrispondono.
Memorizza il tempo di apertura della barra corrente e lo confronta con lo stesso valore del tick in arrivo. Ricalcola il valore della barra corrente solo quando i valori non corrispondono.
Non ho notato altro. Gli articoli suggeriscono una struttura simile. C'è un controllo per la divisione per zero.
Sì, per evitare di ricalcolare, si può anche confrontare prev_calculated e rates_total, per quanto mi ricordo.
Sapete perché l'indicatore non traccia la linea dopo aver chiuso il terminale e riavviato il terminale? Se si passa a un altro lasso di tempo, verrà disegnato.
Konstantin83: Sapete perché dopo aver chiuso il terminale con l'indicatore e riavviato il terminale l'indicatore non traccia una linea? Se si passa a un altro lasso di tempo, verrà disegnato.
Il terminale ha bisogno di un po' di tempo per "alzarsi", sincronizzare i suoi database con il server, ecc. all'avvio. Se l'indicatore viene lanciato nello stesso momento, potrebbero non esserci dati per il calcolo dell'indicatore. Provate la soluzione più semplice: inserire un ritardo di due o tre secondi in OnInit().
In generale, è auspicabile stampare tutte le informazioni importanti quando si cerca un'area problematica. Come
Cambiato in questo
Sembra funzionare.i vostri array non sono serializzati.
Ecco perché è questo.
Buffer[i+1]=Buffer[i]+delta;sbirciare nel futuro
Non ricalcola 0 bar - per la stessa ragione - il tuo inizio - non parte da 0.
i vostri array non sono serializzati.
Ecco perché è questo.
sbirciare nel futuro.
Non ricalcola 0 bar per la stessa ragione per cui non si parte da 0.
Il mio 0 bar non è calcolato secondo la formula.
E poi in base al movimento del prezzo, l'indicatore si metterà in pari con la tendenza
Per esempio se il prezzo si è allontanato dall'indicatore e non si muoverà, allora durante il"periodo" di candela l'indicatore recupererà il prezzo, questa è una sorta di alternativa alla MA per me
lazarev-d-m:
è una specie di alternativa al MA per me
Il mio primo indicatore. Voglio scalare il simbolo da 0 a 100. Lo sto facendo bene? E come fare in modo che la barra corrente non venga ricalcolata (nel tester va a scatti, ma non sul grafico)
Memorizza il tempo di apertura della barra corrente e lo confronta con lo stesso valore del tick in arrivo. Ricalcola il valore della barra corrente solo quando i valori non corrispondono.
Metterei questo nel blocco di inizializzazione:
e le variabili sarebbero dichiarate al livello globale del programma:
Memorizza il tempo di apertura della barra corrente e lo confronta con lo stesso valore del tick in arrivo. Ricalcola il valore della barra corrente solo quando i valori non corrispondono.
Metterei questo nel blocco di inizializzazione:
Non ho notato altro. Gli articoli suggeriscono una struttura simile. C'è un controllo per la divisione per zero.
Sì, per evitare di ricalcolare, si può anche confrontare prev_calculated e rates_total, per quanto mi ricordo.
Non ho notato altro. Gli articoli suggeriscono una struttura simile. C'è un controllo per la divisione per zero.
Sì, per evitare di ricalcolare, si può anche confrontare prev_calculated e rates_total, per quanto mi ricordo.
Il terminale ha bisogno di un po' di tempo per "alzarsi", sincronizzare i suoi database con il server, ecc. all'avvio. Se l'indicatore viene lanciato nello stesso momento, potrebbero non esserci dati per il calcolo dell'indicatore. Provate la soluzione più semplice: inserire un ritardo di due o tre secondi in OnInit().
In generale, è auspicabile stampare tutte le informazioni importanti quando si cerca un'area problematica. Come
Yedelkin:
Non ho ancora trovato alcun aiuto per il trading dal vivo - prova solo ad aprire e chiudere una posizione in un conto demo.
Eccolo: https://www.mql5.com/ru/forum/6343/page96#comment_419028