Come codificare? - pagina 119

 

Sto cercando di capire se questo è sbagliato;

for (int i=qqea_alert_x_candles_ago; i>0; i--) {

// int i = 1;

qqea_up = iCustom(NULL,0, "QQE Alert v3",0,i);

qqea_down = iCustom(NULL,0, "QQE Alert v3",1,i);

se (qqea_up < qqea_down) {

se (i == 1) qqeacross = True;

qqea_long = True;

qqea_short = Falso;

} else if (qqea_up > qqea_down) {

se (i == 1) qqeacross = True;

qqea_long = False;

qqea_short = True;

}

}

}

dovrebbe controllare il segnale valido fino alle barre "qqea_alert_x_candles_ago" indietro, ma poi ha (i == 1) che i==1 accade solo una volta?

 
matrixebiz:
Sto cercando di capire se questo è sbagliato;

for (int i=qqea_alert_x_candles_ago; i>0; i--) {

// int i = 1;

qqea_up = iCustom(NULL,0, "QQE Alert v3",0,i);

qqea_down = iCustom(NULL,0, "QQE Alert v3",1,i);

Stampa("qqea_up: ", qqea_up, "qqea_down: ", qqea_down);

se (qqea_up < qqea_down) {

se (i == 1) qqeacross = True;

qqea_long = True;

qqea_short = Falso;

} else if (qqea_up > qqea_down) {

se (i == 1) qqeacross = True;

qqea_long = Falso;

qqea_short = True;

}

}

}

dovrebbe controllare il segnale valido fino alle barre "qqea_alert_x_candles_ago" indietro, ma poi ha (i == 1) che i==1 accade solo una volta?

Al valore nominale il tuo codice sembra a posto, cioè assumendo che "qqea_alert_x_candles_ago" > 0.

Il tuo problema, se questo non funziona, è più che probabile in relazione a iCustom.

Affinché questa funzione funzioni correttamente, dovete passare un elemento di input per ogni elemento di input nell'indicatore attuale. Se non lo fate, o passate i tipi di dati sbagliati, allora iCustom non restituirà nulla.

Ho aggiunto un'istruzione di stampa nel codice sopra. Usatela per determinare se i valori restituiti da iCustom contengono effettivamente qualcosa.

Grazie,

Hiachiever

 

Aiuto necessario con il codice per contare le barre

Il mio EA ha una serie di opzioni per calcolare lo stoploss di una posizione aperta. Una di queste opzioni è quella di utilizzare il minimo dell'ultimo numero "x" di barre di prezzo.

La linea di codice attualmente usata nell'EA per calcolare lo stoploss (SL) di questa opzione per una posizione lunga è:

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars è una variabile inserita esternamente.

Il problema che ho è che voglio che il valore di StopLossBars aumenti ad ogni barra contata da quando la posizione è stata aperta fino a quando una delle mie altre condizioni per lo stoploss supera questa condizione. Credo che una linea di codice come

StopLossBars = StopLossBars + BarsCountedSincePositionOpened

farebbe il trucco. Sfortunatamente la mia codifica è piuttosto limitata al cut'n'paste e non so come calcolare o codificare BarsCountedSincePositionOpened.

Qualcuno potrebbe dirmi come fare, per favore?

 
hiachiever:
Al valore nominale il tuo codice sembra a posto, cioè assumendo che "qqea_alert_x_candles_ago" > 0.

Il vostro problema se questo non funziona è più che probabile in relazione a iCustom.

Affinché questa funzione funzioni correttamente, dovete passare un elemento di input per ogni elemento di input nell'indicatore attuale. Se non lo fate, o passate i tipi di dati sbagliati, allora iCustom non restituirà nulla.

Ho aggiunto un'istruzione di stampa nel codice sopra. Usatela per determinare se i valori restituiti da iCustom contengono effettivamente qualcosa.

Grazie,

Hiachiever

Il codice è di un altro EA ma stavo pensando che quando il ciclo va a "qqea_alert_x_candles_ago" > 1 allora questa istruzione "if (i == 1) qqeacross = True;" sarebbe Falso ora, giusto? Quando dovrebbe rimanere True fino a i>qqea_alert_x_candles_ago.

 

Aiutare

Cari tutti,

Ho ricevuto questa codifica da un collega. Mi ha detto che dovrebbe essere un ottimo indicatore che segnala le entrate SMA in alto o in basso. Qualcuno può aiutarmi a creare un indicatore con questo codice qui sotto.

/*[[

Nome := SMA Su e Giù

Finestra separata := no

Primo Colore := Blu

Primo tipo di disegno:= Linea

Usa i secondi dati := Sì

Secondo colore := Rosso

Secondo tipo di disegno := Linea

]]*/

Ingressi : MAPeriod(10), Bandwide_UP(20),Bandwide_DOWN(20);

Variabili : shift(0), cnt(0), sum(0), loopbegin1(0), loopbegin2(0), first(True), prevbars(0);

Variabili : MA(0);

SetLoopCount(0);

// controlli iniziali

Se MAPeriod < 1 allora Exit;

// controlla il caricamento di barre aggiuntive o la ricarica totale

Se Bars 1 Allora first = True;

prevbars = Bars;

// loopbegin1 e loopbegin2 impediscono il conteggio delle barre contate escludendo la corrente

Se primo Allora inizia

loopbegin1 = Bars-MAPeriod-1;

Se loopbegin1 < 0 allora Exit; // non ci sono abbastanza barre per il conteggio

loopbegin2 = Bars-MAPeriod-1;

If loopbegin2 < 0 Then Exit; // non ci sono abbastanza barre per il conteggio

first = False; // questo blocco deve essere valutato solo una volta

Fine;

// convergenza-divergenza

loopbegin1 = loopbegin1+1; // anche la barra corrente deve essere ricontata

Per shift = loopbegin1 giù fino a 0 iniziare

MA = iMA(MAPeriod,MODE_SMA,shift);

SetIndexValue(shift,(MA+Bandwide_UP*point));

SetIndexValue2(shift,(MA-Bandwide_DOWN*point));

loopbegin1 = loopbegin1-1; // previene il riconteggio delle barre precedenti

Fine;

Cordiali saluti,

Rogerio

 

aiuto necessario con il codice

Ho bisogno di aiuto con il seguente codice al momento apre un ordine solo se AC è sopra o sotto lo zero e voglio che si apra se il rosso cambia in verde e viceversa

doppio AC1 = iAC(NULL, 0, Current + 0);

doppio AC2 = iAC(NULL, 0, Current + 1);

se ((AC1 < AC2)) Ordine = SIGNAL_CLOSEBUY;

 
matrixebiz:
Il codice è di un altro EA ma stavo pensando che quando il ciclo va a "qqea_alert_x_candles_ago" > 1 allora questa dichiarazione "if (i == 1) qqeacross = True;" sarebbe Falso ora, giusto? Quando dovrebbe rimanere True fino a i>qqea_alert_x_candles_ago.

No, non è corretto.

Nel ciclo for si parte da 6 e si decrementa fino a 1. Questo significa che nel ciclo finale l'esecuzione del ciclo for effettua il controllo"if (i == 1) qqeacross = True;". Il risultato finale è che l'output sarà vero se qqeacross si è verificato.

L'unico problema che questo può presentare è se qqeacross è stato impostato a true in un looop precedente. Per superare questo problema dovreste avere qqeacross = false; prima del ciclo for. In questo modo puoi assicurarti che se qqeacross = true, allora è stato impostato dal ciclo appena completato.

Grazie,

hiachiever

 
Pussy Galore:
Il mio EA ha una serie di opzioni per calcolare lo stoploss di una posizione aperta. Una di queste opzioni è quella di utilizzare il minimo dell'ultimo numero "x" di barre di prezzo.

La linea di codice attualmente utilizzata nell'EA per calcolare lo stoploss (SL) di questa opzione per una posizione lunga è

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars è una variabile inserita esternamente.

Il problema che ho è che voglio che il valore di StopLossBars aumenti ad ogni barra contata da quando la posizione è stata aperta fino a quando una delle mie altre condizioni per lo stoploss supera questa condizione. Credo che una linea di codice come

StopLossBars = StopLossBars + BarsCountedSincePositionOpened

farebbe il trucco. Sfortunatamente la mia codifica è piuttosto limitata al cut'n'paste e non so come calcolare o codificare BarsCountedSincePositionOpened.

Qualcuno potrebbe dirmi come fare, per favore?

Il modo per farlo è creare una variabile nell'ambito globale (cioè prima di init)

ad esempio

int BarCount;

int init ()

Poi nel vostro codice di stop loss usate il seguente:

if (BarCount<Bars)

{

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars++;

BarCount=Bars;

}

Questo incrementerà StopLossBars di 1 ad ogni nuova barra.

L'unica altra aggiunta al tuo codice sarebbe quella di resettare 'StopLossBars' al suo valore di default originale quando viene aperta una nuova operazione.

Grazie,

Hiachiever

 
denis68:
Ho bisogno di aiuto con il seguente codice, al momento apre un ordine solo se AC è sopra o sotto lo zero e voglio che si apra se il rosso cambia in verde e viceversa

doppio AC1 = iAC(NULL, 0, Current + 0);

doppio AC2 = iAC(NULL, 0, Current + 1);

se ((AC1 < AC2)) Ordine = SIGNAL_CLOSEBUY;

Bene, quello che ho fatto è stato aprire o visualizzare gli altri due buffer nel codice dell'indicatore rimuovendo queste due linee;

// SetIndexLabel(1,NULL);

// SetIndexLabel(2,NULL);

Poi con il mio AC modificato ho fatto una chiamata iCustom;

double ac1 = iCustom(NULL, 0, "AcceleratorMod", 1, 1);

double ac2 = iCustom(NULL, 0, "AcceleratorMod", 2, 1);

double ac11 = iCustom(NULL, 0, "AcceleratorMod", 1, 2);

double ac22 = iCustom(NULL, 0, "AcceleratorMod", 2, 2);

bool acbuy = ac2==0 && ac11==0; // Il rosso cambia in verde

bool acsell = ac1==0 && ac22==0; // Il verde cambia in rosso

Spero che questo aiuti

 

matrixebiz cosa intendi per rimuovere queste due linee; e come faccio, non posso entrare nel codice dell'indicatore AC che ho provato,