Come codificare? - pagina 271

 

Bisogno di aiuto con la funzione iCustom per questo EA può chiamare un indicatore personalizzato.

Ciao a tutti,

Vorrei aggiungere questo (Entry.mq4) indi a questo (swb grid 4.1.0.3_EA) EA con

funzione iCustom così io e noi potremmo usare questo indicatore nella strategia dell'EA.

l'EA utilizza già 3 indicatori MT4 Bande di Bollinger, Stocastico e RSI e hanno

interruttori, in modo da poter selezionare uno o tutti loro da utilizzare, selezionando VERO o FALSO

e vorrei aggiungere questo 4° indi (Entry.mq4) all'EA.

Apprezzerei molto se qualcuno potesse aiutarmi.

Grazie.

l'EA e l'indi allegato sotto.

File:
 

Noob MQL4 aiuto necessario per capire questo array

Ciao, codificatori

Qualcuno vorrebbe educarmi un po' sugli array

O forse sto avendo più problemi a capire questo ciclo come riguarda questo array.

int i=Bars;

#property copyright "Unfinished POS by Agent86"

doppio v1[];

doppio v2[];

doppio val1;

doppio val2;

int start()

{

mentre(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i);

se (val1 > 0)

{

v1=High;

}

altrimenti

{

v1=v1;

}

val2=iFractals(NULL, 0, MODE_LOWER,i);

se (val2 > 0)

{

v2=Low;

}

altrimenti v2=v2;

i--;

}

return(0);

}

È un frattale di base, eppure non riesco a fare riferimento a nessun elemento dell'array.

Voglio essere in grado di incrementare i++ in qualche modo e stampare (v1); o stampare il valore precedente allo 0 o EMPTY_VALUE.

Se sto anche andando nella giusta direzione con questo.

Sto avendo problemi.

Print (v1): sempre == 0 e stampa 0

In un certo senso capisco perché in realtà sta andando in loop fino a -1 che == 0

Come e dove potrei mettere le dichiarazioni di stampa in modo da poter vedere cosa sta succedendo?

Ho provato una moltitudine di metodi e ho reinizializzato i=0 per tentare un ciclo alternato in modo da poter fare riferimento agli elementi v1, ma tutti i tentativi sono falliti.

Fondamentalmente voglio visualizzare i frattali precedenti o contrassegnarli come A alto, B basso ecc. per un possibile uso futuro in un tipo di schema ABCD di EA

Per ora, principalmente voglio stampare v1 in modo da poter vedere cosa sta facendo.

Forse potrei progettare qualcosa per selezionare un frattale precedente come A_high e/o B_low o qualche schema simile.

Sono sulla strada sbagliata con questo?

Per favore consigliatemi

Grazie

 

Andrei invece con un ciclo FOR. I cicli while possono portare a blocchi se si dimentica di includere la i. Poiché conoscete il numero esatto di barre, è più facile da usare, in più la i non sarà mai < 0. Aiuta ad evitare confusione.

Per (int i=Bars-1;i>0;i--) {

// codice

}

Provate a impostare tutti i valori dell'array su 0, poi tornate indietro e assegnate i valori dell'indicatore. Inoltre, provate una print() direttamente dopo aver assegnato il valore dell'indicatore. Vedi se sta effettivamente restituendo qualcosa.

La vostra migliore scommessa, secondo me, è di assegnare effettivamente una dimensione all'array. Diciamo, 1000 posizioni. È improbabile che tu abbia bisogno di così tante, in più ridurrà i calcoli che stai facendo. Tutto quello che devi fare allora è eseguire un ciclo attraverso le ultime 999 barre fino a 0 e assegnare i valori. Mi sembra di ricordare che MT4 ha problemi con le inizializzazioni degli array e quant'altro.

 

Domande sulla matrice

Trader5050-Deployed:
Andrei con un ciclo FOR invece. I cicli while possono portare a blocchi se si dimentica di includere l'i--. Dal momento che conosci il numero esatto di barre, è più facile da usare, in più la i non sarà mai < 0. Aiuta ad evitare confusione.

Per (int i=Bars-1;i>0;i--) {

// codice

}

Prova a impostare tutti i valori dell'array su 0, poi torna indietro e assegna i valori dell'indicatore. Inoltre, prova una print() direttamente dopo aver assegnato il valore dell'indicatore. Vedi se sta effettivamente restituendo qualcosa.

La tua migliore scommessa, secondo me, è di assegnare effettivamente una dimensione all'array. Diciamo, 1000 posizioni. È improbabile che tu abbia bisogno di così tante, in più ridurrà i calcoli che stai facendo. Tutto quello che devi fare allora è eseguire un ciclo attraverso le ultime 999 barre fino a 0 e assegnare i valori. Mi sembra di ricordare che MT4 ha problemi con le inizializzazioni degli array e quant'altro.

Ok, grazie, lo proverò.

Anche se le dichiarazioni while funzionano bene, non mi sta aiutando a ottenere gli elementi dell'array che voglio stampare / visualizzare ecc.

Lavorerò su ciò che hai detto e farò alcuni test e posterò indietro.

Grazie

 
Trader5050-Deployed:
Io userei invece un ciclo FOR. I cicli while possono portare a blocchi se si dimentica di includere l'i--. Dal momento che conosci il numero esatto di barre, è più facile da usare, in più la i non sarà mai < 0. Aiuta ad evitare confusione.

Per (int i=Bars-1;i>0;i--) {

// codice

}

Prova a impostare tutti i valori dell'array su 0, poi torna indietro e assegna i valori dell'indicatore. Inoltre, provate una print() direttamente dopo aver assegnato il valore dell'indicatore. Vedi se sta effettivamente restituendo qualcosa.

La tua migliore scommessa, secondo me, è di assegnare effettivamente una dimensione all'array. Diciamo, 1000 posizioni. È improbabile che tu abbia bisogno di così tante, in più ridurrà i calcoli che stai facendo. Tutto quello che devi fare allora è eseguire un ciclo attraverso le ultime 999 barre fino a 0 e assegnare i valori. Mi sembra di ricordare che MT4 ha problemi con le inizializzazioni degli array e quant'altro.

Sta ancora stampando l'array con tutte le voci di 0

Strano

 

Argent86,

Ci sono un paio di errori nel tuo codice:

- gli array che stai usando non sono ancora array (se non specifichi la dimensione dell'array, come hai fatto nel codice, allora è un array dinamico e la dimensione dell'array deve essere gestita in fase di esecuzione) quindi stai avendo array di dimensione 0 (questa è la prima ragione per avere sempre 0 - è la routine di gestione degli errori di metatrader che impedisce errori fatali e restituisce 0 come risultato per tali casi - in C/C++ causerebbe un crash)

- se non specificate che l'array è "series like" (in "series like" lo 0° elemento è l'ultimo mentre negli array normali lo 0° elemento è il primo) quindi l'espressione i+1 è il prossimo elemento di un array in quel caso non il precedente. Puoi usare gli array nel modo "series like", ma poi devi fare un paio di cose in più per farlo funzionare a run-time, e anche allora quando i numeri delle barre cambiano otterrai codice strisciante, quindi è meglio usare gli array nel loro modo nativo - "C like"

- assicurati anche di iniziare almeno dalla terza barra su un nuovo tick (è lì che apparirà un nuovo frattale, non su una barra corrente)


Ecco cosa stai cercando di fare senza questi problemi
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

Accesso da MQ4 a una funzione dll con: liste di variabili-argomento

Salve,

Qualcuno sa se questo è possibile: importare una funzione dll che usa come argomento una: lista di variabili-argomento

ad esempio vprintf - Riferimento C++

int vprintf ( const char * format, va_list arg );

se sì, come si potrebbe fare?

Grazie

MJ

 

Come chiamare una funzione senza valore di ritorno

Ciao ragazzi e ragazze.

Ad un certo punto del mio programma vorrei chiamare una funzione.

Tuttavia la funzione non ha un valore di ritorno (void). Quindi come faccio a chiamare la funzione,

in modo che esegua il codice all'interno della funzione esattamente nel punto in cui la chiamo,

come se fosse scritto in quel posto stesso?

Ho fatto del codice di esempio qui sotto... dove controllo alcuni parametri, e se Ok, voglio eseguire la funzione...

Spero che qualcuno possa aiutarmi con questo, tx in anticipo, Jonkie76

//+------------------------------------------------------------------+

//| esperto inizio funzione |

//+------------------------------------------------------------------+

int start()

{

//----

se (Prezzo >= PREZZO_CHIUSO)

call function ; // A questo punto vorrei chiamare la funzione, come faccio?

else

Alert("Non fare nulla"); //

//----

return(0);

}

//+------------------------------------------------------------------+

//===================================================================+

//FUNZIONI

//===================================================================+

//----------------------- FUNZIONE DI CHIUSURA DELL'ORDINE ----------------------+

void subCloseOrder()

{

int

i,

totale = 0,

biglietto = 0,

errare = 0,

c = 0;

totale = OrdiniTotali();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

caso OP_BUY :

for(c=0;c<NumeroTentativi;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

else

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Errore di occupato

{

Sleep(5000);

continua;

}

else //errore normale

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}

 

È molto semplice. Avete solo bisogno di chiamarlo come restituirebbe qualcosa, solo che non avete bisogno di salvare alcun risultato perché non c'è alcun risultato con il tipo void. (non restituisce nulla) Come questo:

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

Usate invece "void". In questo modo:

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Void significa che non restituirà valore da una funzione e in questo modo diventa effettivamente una procedura, non una funzione

Jonkie76:
Ciao ragazzi e ragazze.

Ad un certo punto del mio programma vorrei chiamare una funzione.

Tuttavia la funzione non ha un valore di ritorno (void). Quindi come faccio a chiamare la funzione,

in modo che esegua il codice all'interno della funzione esattamente nel punto in cui la chiamo,

come se fosse scritto in quel posto stesso?

Ho fatto del codice di esempio qui sotto... dove controllo alcuni parametri, e se Ok, voglio eseguire la funzione...

Spero che qualcuno possa aiutarmi con questo, tx in anticipo, Jonkie76

//+------------------------------------------------------------------+

//| esperto inizio funzione |

//+------------------------------------------------------------------+

int start()

{

//----

se (Prezzo >= PREZZO_CHIUSO)

call function ; // A questo punto vorrei chiamare la funzione, come faccio?

else

Alert("Non fare nulla"); //

//----

return(0);

}

//+------------------------------------------------------------------+

//===================================================================+

//FUNZIONI

//===================================================================+

//----------------------- FUNZIONE DI CHIUSURA DELL'ORDINE ----------------------+

void subCloseOrder()

{

int

i,

totale = 0,

biglietto = 0,

errare = 0,

c = 0;

totale = OrdiniTotali();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

caso OP_BUY :

for(c=0;c<NumeroTentativi;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

else

{

if(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //Errore di occupato

{

Sleep(5000);

continua;

}

else //errore normale

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}