![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
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.
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.
#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
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
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:Ecco cosa stai cercando di fare senza questi problemi
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:
{
...
//
//
// 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
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;
}
}
}
}