Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1730

 
anrei2002 #:

Le frecce irrilevanti sono scomparse immediatamente!!!

Non mi aspetto che tu capisca, ho avuto un cliente con un problema simile, non sono riuscito a spiegarglielo per un anno, c'era un indicatore diverso, ma anche con una sbirciatina. Sembra essere un ragazzo intelligente, ma apparentemente la sua sete di profitto ha davvero spento la sua logica e il suo pensiero... Alla fine si è reso conto di tutto quando ha svuotato un sacco di soldi. Non so cosa fare... Se si resetta, l'indicatore smette di funzionare. Se si resetta, rimangono solo le frecce di destra, ma nella storia... Ho visto molti di questi indicatori

 
MakarFX #:
Mostra quello che hai già fatto.
#proprietà descrizione "Oscillatore stocastico"
#proprietà rigorosa

#proprietà indicator_separate_window
#proprietà indicatore_minimo 0
#proprietà indicatore_massimo 100
#proprietà indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
#property indicator_level1 20.0
#proprietà indicator_level2 80.0
#property indicator_levelcolor clrSilver
#proprietà indicator_levelstyle STYLE_DOT
//--- parametri di ingresso
input int InpKPeriod=5; // input K Period
input int InpDPeriod=3; // input D Period
input int InpSlowing=3; // rallentamento

ingresso stringa PARA_Ref = "$USDX";
//input string PARA_Ref = "ETHUSD";


//--- buffer
doppio ExtMainBuffer[];
doppio ExtSignalBuffer[];
doppio ExtHighesBuffer[];
doppio ExtLowesBuffer[];

doppio cl[];
doppio hi[];
doppio lo[];



//---
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'indicatore personalizzato
//+------------------------------------------------------------------+
int OnInit(void)
{
stringa short_name;
//--- 2 buffer aggiuntivi sono usati per il conteggio.
IndicatorBuffers(4);
SetIndexBuffer(2, ExtHighesBuffer);
SetIndexBuffer(3, ExtLowesBuffer);
//--- linee indicatrici
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMainBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtSignalBuffer);
//--- nome per DataWindow e etichetta della sottofinestra dell'indicatore
short_name="Stochastic_Mult_1("+IntegerToString(InpKPeriod)+", "+IntegerToString(InpDPeriod)+", "+IntegerToString(InpSlowing)+")";
IndicatoreNomeCorto(nome_corto);
SetIndexLabel(0,short_name);
SetIndexLabel(1, "Signal");
//---
draw_begin1=InpKPeriod+InpSlowing;
draw_begin2=draw_begin1+InpDPeriod;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin2);
//--- inizializzazione fatta
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Oscillatore stocastico
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int i,k,pos,n;

//--- controllare il conteggio delle barre
if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
ritorno(0);
//--- contando da 0 a rates_total
ArraySetAsSeries(ExtMainBuffer,false);
ArraySetAsSeries(ExtSignalBuffer,false);
ArraySetAsSeries(ExtHighesBuffer,false);
ArraySetAsSeries(ExtLowesBuffer,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(close,false);

//---
pos=InpKPeriod-1;
se(pos+1<prev_calcolato)
pos=prev_calcolato-2;
else
{
for(i=0; i<pos; i++)
{
ExtLowesBuffer[i]=0.0;
ExtHighesBuffer[i]=0.0;
}
}
//--- calcola HighesBuffer[] e ExtHighesBuffer[]
for(i=pos; i<rates_total && !IsStopped(); i++)
{
doppio dmin=1000000.0;
doppio dmax=1000000.0;
for(k=i-InpKPeriod+1; k<=i; k++)
{
n = i-k;
if(dmin>iLow(PARA,0,n)* iLow(PARA_Ref,0,n)) // originale: if(dmin>low[k])
dmin=iLow(PARA,0,n)* iLow(PARA_Ref,0,n); // originale: dmin=low[k];
if(dmax<iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n)) // originale: if(dmax<high[k])
dmax=iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n); // originale: dmax=high[k];

}
ExtLowesBuffer[i]=dmin;
ExtHighesBuffer[i]=dmax;
}
//--- linea %K
pos=InpKPeriod-1+InpSlowing-1;
se(pos+1<prev_calcolato)
pos=prev_calcolato-2;
else
{
for(i=0; i<pos; i++)
ExtMainBuffer[i]=0.0;
}
//--- ciclo principale
for(i=pos; i<rates_total && !IsStopped(); i++)
{
doppio sumlow=0.0;
doppio sumhigh=0.0;
for(k=(i-InpSlowing+1); k<=i; k++)
{
n = i-k;
sumlow +=((iClose(PARA,0,n) * iClose(PARA_Ref,0,n))-ExtLowesBuffer[k]); // originale: sumlow +=(close[k]-ExtLowesBuffer[k]);
sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
}
se(sumhigh==0.0)
ExtMainBuffer[i]=100.0;
else
ExtMainBuffer[i]=sumlow/sumhigh*100.0;
}
//--- segnale
pos=InpDPeriod-1;
se(pos+1<prev_calcolato)
pos=prev_calcolato-2;
else
{
for(i=0; i<pos; i++)
ExtSignalBuffer[i]=0.0;
}
for(i=pos; i<rates_total && !IsStopped(); i++)
{
doppio sum=0.0;
for(k=0; k<InpDPeriod; k++)
sum+=ExtMainBuffer[i-k];
ExtSignalBuffer[i]=sum/InpDPeriod;
}
//--- OnCalculate fatto. Restituisce il nuovo prev_calcolato.
return(rates_total);
}
//+------------------------------------------------------------------+
 
Può essere aggiustato senza perdere la logica, ma disegnerà la freccia sull'ottava barra, o anche sulla nona (ma senza ridisegnare e senza segnali a sinistra). Vi servirà così, cioè la freccia nuova e più fresca sarà sulla nona barra. E anche il ritardo di apertura sarà di 9 battute.
 
Nikolay Ivanov #:

Non mi aspetto che tu capisca, ho avuto un cliente con un problema simile, non sono riuscito a spiegarglielo per un anno, c'era un indicatore diverso, ma anche con un dispositivo di osservazione. Sembra essere un ragazzo intelligente, ma apparentemente la sua sete di profitto ha davvero spento la sua logica e il suo pensiero... Alla fine si è reso conto di tutto quando ha svuotato un sacco di soldi. Non so cosa fare... Se si resetta, l'indicatore smette di funzionare. Se si resetta, rimangono solo le frecce di destra, ma nella storia... Ho visto molti di questi indicatori.

Non sono un programmatore, ma ancora non capisco perché la freccia non può essere corretta con l'apparizione di una nuova candela.

Il mondo è pieno di indicatori con re-crossing e funziona bene per tutti loro! La freccia si muove insieme al crossover impostato e non c'è oscillazione.

Hanno tutti lo stesso codice...

File:
02.png  15 kb
 
asdkika1 #:

Meglio scrivere quello che vuoi fare... punto per punto

 
anrei2002 #:

Non sono un programmatore, ma ancora non capisco perché la freccia non può essere corretta con la comparsa di una nuova candela?

Il mondo è pieno di indicatori con re-crossing e funziona bene per tutti loro! La freccia si muove insieme al crossover impostato e non c'è oscillazione.

Hanno tutti lo stesso codice.

Il rerolling normale è quando la barra del segnale (dove si trova la freccia) è coinvolta nel calcolo del segnale e può avere l'indice 0... Cioè, la barra attuale... Viene ridisegnato ogni tick e, rispettivamente, il segnale può anche essere ridisegnato...

Ma oltre alla 0a barra, si usa -1 -2 -3 -4 -5 -6 -7... Da dove verrà la meno 8a barra? È una cattiva forma usare anche la 0a barra... e le barre con indici meno sono semplicemente inaccettabili...

Ho scritto sopra come risolvere il problema... Funzionerà bene se aspettate il segnale a destra di 8 barre, allora sarà ok, non pensate che la freccia sarà sempre in ritardo di 9 barre, volete questo?

 
MakarFX #:

Meglio scrivere quello che vuoi fare... punto per punto

Calcolo stocastico dalla moltiplicazione di due coppie.
Ho preso l'indicatore stocastico standard e ho cambiato
dati di input (linee segnate).
Non ho mai usato OnCalculate - apparentemente è qui che il cane è sepolto.
Non funziona - non riesco a capire perché.
Speravo che non avrei dovuto
Spero di non doverlo riprogettare io stesso.
 
Nikolay Ivanov #:

L'overshooting normale è quando la barra del segnale stesso (dove si trova la freccia) è coinvolta nel calcolo per far apparire il segnale e può avere un indice di 0... Questa è la barra attuale... Viene ridisegnato ogni tick e, di conseguenza, anche il segnale può essere ridisegnato...

Ma oltre alla 0a barra, si usa -1 -2 -3 -4 -5 -6 -7... Da dove verrà la meno 8a barra? È una cattiva forma usare anche la 0a barra... e le barre con indici meno sono semplicemente inaccettabili...

Ho scritto sopra come risolvere il problema... Funzionerà correttamente se aspettate il segnale a destra di 8 barre, allora tutto andrà bene, non pensate che la freccia sarà sempre in ritardo di 9 barre, volete questo?

Ecco un esempio di un altro di questi indicatori!

Ha oltre alle frecce sul grafico, ci sono dei cerchi all'intersezione delle linee nel seminterrato.

E i cerchi, al contrario delle frecce, sono rigorosamente dietro l'intersezione delle linee! Non ci sono cerchi extra.

Perché non ci sono frecce?

File:
03.png  98 kb
EATA__Alert.mq4  20 kb
 
anrei2002 #:

Ecco un esempio di un altro di questi indicatori!

Oltre alle frecce sul grafico, ha dei cerchi all'intersezione delle linee nel seminterrato.

E i cerchi, a differenza delle frecce, sono rigorosamente dietro l'intersezione delle linee! Non ci sono cerchi extra.

Perché c'è qualcosa di sbagliato nelle frecce?

fate funzionare questo indicatore nel tester e osservate le linee e i cerchi nella visualizzazione a velocità accelerata... Se non ha senso nemmeno dopo questo, non so come altro spiegarlo semplicemente...

 
asdkika1 #:
Calcolo stocastico dalla moltiplicazione di due coppie.
Ho preso l'indicatore stocastico standard e ho cambiato
dati di input (linee segnate).
Non ho mai usato OnCalculate - immagino che sia qui il problema.
Non funziona - non riesco a capire perché.
Speravo che non avrei dovuto
Speravo di non doverlo rifare io stesso, dovrebbe essere molto semplice.

Moltiplicare cosa? Aperto? Vicino? Stoch?