Come codificare? - pagina 322

 

Ciao,

la mia richiesta è solo per informazione, per il momento.

Se ho un indicatore che crea un grafico offline senza calcolare il passato ma solo i dati live è possibile allegarlo nel template di strategy tester e creare un grafico offline con i dati della storia?

Grazie.

 
mladen:
jayjonbeach,

Stai testando il valore di trendCurr più e più volte nel ciclo senza cambiarlo (quindi restituirà sempre NONE)

Prova a mettere iCustom() nel ciclo e poi testa quel valore. Qualcosa del genere:

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

Caro signore. Ho solo due parole su questo, ma vanno ripetute...

GRAZIE, GRAZIE e GRAZIE!!!

In effetti, il tuo codice ha funzionato perfettamente, e scommetto che mi hai risparmiato altre 12 o molte altre ore di esame di altri cicli 'for', prove ed errori, ecc. prima di imbattermi finalmente in quello che hai postato.

In realtà pensavo di voler testare trendCurr più e più volte nel ciclo, ma ora vedo l'errore grazie a te, e vedo come la tua soluzione di cambiare lo Stepbartotest con "i" sia davvero la soluzione perfetta, l'uso di "i" qui è effettivamente la chiave eppure non sembra del tutto ovvio, almeno per un principiante come me potrebbe essere passato del tempo prima di cap irlo...

Mentre il tuo codice ha funzionato come previsto, il mio intero blocco non lo è, c'è un risultato non voluto molto interessante nell'avere questo ciclo eseguito all'interno dei criteri LONG:

if(ventunoEMA > cinquantacinqueEMA)

{

if (trendCurr>0) // controlla la corrente del filtro Step

{

if (Bid > TwentyOneEMA)

{

for(int i=0; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

}

}

Quello che succede ora, è che quando gli if sono soddisfatti, il ciclo viene testato e se è vero compra, altrimenti non fa nulla, ottimo. Tuttavia, l'intero blocco di codice si comporta come un ciclo "while", poiché finché if(TwentyOneEMA > FiftyFiveEMA) è vero, il resto del codice sottostante continua a funzionare, e se le altre condizioni diventano tutte vere, il babbeo compra! Vedo l'errore evidente della mia struttura di codice qui.... (Sto pensando che un altro ciclo for simile potrebbe testare le EMA, per assicurarsi che l'incrocio delle EMA sia NUOVO)

Questo però non è necessariamente un male (come alcune analisi implicherebbero), infatti questo è un po' come quello che era il mio prossimo obiettivo, in un modo diverso, ha bisogno di molti più test ma per ora ho intenzione di lasciare questa revisione in atto su questo bot e iniziare le prossime revisioni su una copia.

Quello che volevo fare dopo averlo fatto guardare al passato, era che se il ciclo passato risultava falso, volevo che controllasse le 10 barre successive per un segnale Step, e se diventava vero, effettuava il trade (stavo pensando di usare un ciclo while per questo?). Quindi questo sta già accadendo, tranne che non c'è un limite di 10 barre nel suo look forward, e non sono sicuro di come dovrei strutturare il tutto per funzionare correttamente. (Penso che potrei controllare il segnale Step, e se vero cercare un nuovo incrocio MA nelle ultime 10 barre, ma devo ripetere tutto il blocco per questo e penso che ci debba essere un modo migliore più efficiente/elegante)

Grazie ancora per il tuo aiuto, questo mi tornerà MOLTO utile nella codifica futura, ne sono sicuro.

 

Salve,

Ho provato a modificare l'indicatore allegato. Praticamente quando un everage mobile tocca il prezzo si allarma e cambia il timeframe dove viene toccato. Ho messo un ritardo nell'allarme che è rispetto ma dopo un allarme se cambio il timeframe lo ingnore.

Si può aggiustare?

Graziemedie_mobili.mq4

File:
 

dasio

Con gli indicatori non puoi cambiare questo. Gli indicatori resettano l'ambito globale e le variabili statiche ai valori di default quando lo fai, quindi non puoi mantenere alcuni valori quando cambi il time frame o il simbolo. Potresti usare le variabili globali (quelle gestite con le funzioni "GlobalVariable...") ma questo renderebbe il tuo codice molto complicato (per più istanze, più simboli, ...) e secondo me non ne vale la pena

dasio:
Ciao,

Provo a modificare l'indicatore allegato. Praticamente quando un everage mobile tocca il prezzo si allarma e cambia il time frame dove viene toccato. Ho messo un ritardo nell'allarme che è rispetto ma dopo un allarme se cambio il timeframe lo ingnore.

Si può aggiustare?

Graziemedie_mobili.mq4
 

...

Solo un'aggiunta al post precedente: una cosa che non è molto conosciuta - gli EA stanno trattando queste variabili (ambito globale e variabili statiche) in modo diverso - non vengono resettate quando si cambia il time frame o il simbolo. Ecco un EA molto, molto semplice che mostrerà a coloro che sono interessati come questi valori non vengono resettati negli EA come negli indicatori

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

Questo è anche causa di alcuni errori in alcuni Eas (se l'EA non tiene conto del fatto che la variabile non viene resettata quando si cambia il time frame o il simbolo, possono verificarsi alcuni errori molto strani nel lavoro dell'EA)

 
mladen:
dasio Dal codice non riesco a vedere qual è l'intenzione del codice. Comunque, ecco un codice in cui puoi scegliere se vuoi usare il vero range come valore "base" dell'indicatore (è la prima parte del tuo codice) o vuoi usare la seconda parte del tuo codice come valore "base

Un'altra volta grazie mladen.

È possibile aggiungere un'altra linea basata su questa condizione?

Disegnare una linea orizzontale = all'everage dei Work[] che sono > di Avg[] sempre in base ai giorni del periodo?

Grazie a voi

 

Modifica del segnale

Ciao Mladen,

Voglio aggiungere un segnale di stop alla vendita o di stop all'acquisto a questo codice.....e.g. se la linea del segnale stocastico è sopra il principale, stop alla vendita e.t.c, l'ho aggiunto al codice ma non funziona... pls help

se(Periodo()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// avvisi

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0])

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&nowenCCI<b4enCCI)&&(nowtrCCI<0&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0])

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}

 

Puoi provare qualcosa del genere:

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
Ciao Mladen,

Voglio aggiungere un segnale di stop alla vendita o di stop all'acquisto a questo codice.....e.g. se la linea del segnale stocastico è sopra il principale, stop alla vendita e.t.c, l'ho aggiunto al codice ma non funziona... pls help

se(Periodo()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// avvisi

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0])

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&nowenCCI<b4enCCI)&&(nowtrCCI<0&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0])

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
 

Bene, sono di nuovo bloccato. Sto cercando di correggere l'EA dal guardare nel futuro a causa del modo in cui il mio codice era strutturato.

Il mio codice di segnale inizia con un "if", e finché questo è vero, il resto del codice seguente continua ad essere eseguito, come dovrebbe (questo non era un problema prima di inserire il primo ciclo for, ma ora lo è). Quindi ho provato un mucchio di cose diverse per correggere questo, ma niente funziona Ho anche controllato il manuale ma non c'era niente che spiccava, forse due cicli "for" nello stesso blocco non sono permessi?

Ecco quello che penso sia il mio sforzo migliore (mostrando solo LONG per brevità), nessun errore ma l'EA non fa operazioni, quindi probabilmente ho sbagliato di nuovo il ciclo:

if (NumOrders == 0)

{

if(VentunoEMA > CinquantacinqueEMA+Separazione)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

se (testValue1 < testValue2-Separazione2)

{

se (Bid TwentyOneEMA) // filtro notizie

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

Nota Ho provato if (testValue1 < testValue2-Separation2) continue; ma ha segnalato 'continue' come un errore Se 2 loop non sono permessi, allora immagino che il mio prossimo compito di aggiungere un altro loop potrebbe essere sbagliato...

 
jayjonbeach:
Bene, sono di nuovo bloccato. Sto cercando di correggere l'EA dal guardare nel futuro a causa del modo in cui il mio codice era strutturato.

Il mio codice di segnalazione inizia con un "if", e finché questo è vero, il resto del codice seguente continua ad essere eseguito, come dovrebbe (questo non era un problema prima di inserire il primo ciclo for, ma ora lo è). Quindi ho provato un mucchio di cose diverse per correggere questo, ma niente funziona Ho anche controllato il manuale ma non c'era niente che spiccava, forse due cicli "for" nello stesso blocco non sono permessi?

Ecco quello che penso sia il mio sforzo migliore (mostrando solo LONG per brevità), nessun errore ma l'EA non fa operazioni, quindi probabilmente ho sbagliato di nuovo il ciclo:

if (NumOrders == 0)

{

if(VentunoEMA > CinquantacinqueEMA+Separazione)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

se (testValue1 < testValue2-Separazione2)

{

se (Bid TwentyOneEMA) // filtro notizie

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

Nota Ho provato if (testValue1 < testValue2-Separation2) continue; ma ha segnalato 'continue' come un errore Se 2 loop non sono permessi, allora immagino che il mio prossimo compito di aggiungere un altro loop potrebbe essere sbagliato...

Ok, penso di aver capito, era il modo in cui ho strutturato il ciclo for, perché le cose non stavano andando a "finire" direttamente dopo questo primo ciclo, aveva bisogno di essere strutturato in modo leggermente diverso rispetto al 2° ciclo, almeno questa è la conclusione a cui sono arrivato guardando alcuni altri bot. Un rapido test mostra il seguente funzionamento, ma ci sono altri test da fare

NumOrders = CalculateCurrentOrders();

if (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

se (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

{

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

se (testValue1 <! testValue2-Separazione2)

{

Print("No Trade");

break;

}

if (Bid TwentyOneEMA) continue; // news filter

for(int j=0; j<=lookback; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}