Aiuto per la codifica - pagina 62

 

...

Devi fare 2 cose
: - dichiarare la variabile "period" come double (MQL a volte si comporta stranamente quando nella divisione viene usata una variabile di tipo intero)

- inizializzare la variabile "period" (in questo momento non è inizializzata ed è per questo che l'ultimo passo non ha funzionato)

Dopo di che otterrete qualcosa di simile a questo:

Buon fine settimana

chenairbin:
#proprietà indicator_separate_window

#proprietà indicator_buffers 1

#proprietà indicatore_colore1 Rosso

#proprietà indicator_maximum 100

#Proprietà indicatore_livello1 70

#Proprietà indicatore_livello2 50

#Proprietà indicatore_livello3 30

#proprietà indicatore_minimo 0

//---- parametri di ingresso

extern int rsiperiod = 14 ;

extern int Shortperiod = 5 ;

extern int Middleperiod = 8 ;

extern int Longperiod = 13;

extern int mamode = 2 ;

//---- buffer

double RSI[]

double ShortRSI[]

double MiddleRSI[]

double LongRSI[]

doppio SMRSI[];

int periodo ;

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

//| Funzione di inizializzazione dell'indicatore personalizzato |

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

int init()

{

//---- indicatori

IndicatoreBuffer(5);

SetIndexBuffer(0,SMRSI);

SetIndexBuffer(1,RSI);

SetIndexBuffer(2,ShortRSI);

SetIndexBuffer(3,MiddleRSI);

SetIndexBuffer(4,LongRSI);

//---- nome per DataWindow e l'etichetta della sottofinestra dell'indicatore

IndicatorShortName("SMRSI("+rsiperiod+", "+Shortperiod+", "+Middleperiod+", "+Longperiod +", "+mamode+")");

SetIndexDrawBegin(0,rsiperiodo+Lungoperiodo);

period=Shortperiod+Middleperiod+Longperiod;

return(0);

}

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

//|Funzione di iterazione dell'indicatore personalizzata

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

int start()

{

int counted_bars=IndicatorCounted();

int i,limit;

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

if(counted_bars>0) counted_bars--;

limite = Bars-counted_bars;

for( i=limite; i>=0; i--) RSI=iRSI(NULL,0,rsiperiodo,0,i);

for( i=limit; i>=0; i--) ShortRSI=iMAOnArray(RSI,0,Shortperiod,0,mamode,i);

for( i=limit; i>=0; i--) MiddleRSI=iMAOnArray(RSI,0,Middleperiod,0,mamode,i);

for( i=limit; i>=0; i--) LongRSI=iMAOnArray(RSI,0,Longperiod,0,mamode,i);

for( i=limit; i>=0; i--) { if(period!=0) SMRSI=(Shortperiod/period)*ShortRSI+(Middleperiod/period)*MiddleRSI+(Longperiod/period)*LongRSI;}

return(0);

}

//+------------------------------------------------------------------+
File:
smrsi.gif  33 kb
_test0.mq4  3 kb
 

n_n

mladen:
Devi fare 2 cose
: - dichiarare la variabile "period" come double (MQL a volte si comporta stranamente quando nella divisione viene utilizzata una variabile di tipo intero)

- inizializzare la variabile "period" (al momento non è inizializzata ed è per questo che l'ultimo passo non ha funzionato)

Dopo di che otterrete qualcosa di simile a questo:

Buon fine settimana

Grazie!

 

Ciao,

ho scaricato l'indicatore allegato nel sito mql4. Ho provato a fare un EA basato su questo indicatore ma quando inizio il backtest dopo alcuni secondi la piattaforma va in crash e penso che sia un difetto dell'indicatore perché sta usando molta cpu.

Quindi chiedo se è possibile alleggerire il codice per risolvere questo problema.

Grazie per la vostra disponibilità.

cronex_taichi.mq4

File:
 

dasio

L'ho testato con questo snippet e funziona bene. Non conosco i parametri che hai usato quindi questo è solo chiamare un indicatore di default, ma non c'è nessun problema in questo modo

int init()

{

return(0);

}

int start()

{

Comment(iCustom(NULL,0,"Cronex Taichi",0,0));

return(0);

}

dasio:
Ciao,

Ho scaricato l'indicatore allegato nel sito mql4. Ho provato a fare un EA basato su questo indicatore ma quando inizio il backtest dopo alcuni secondi la piattaforma va in crash e penso che sia un difetto dell'indicatore perché sta usando molta cpu.

Quindi chiedo se è possibile alleggerire il codice per risolvere questo problema.

Grazie per la vostra disponibilità.

cronex_taichi.mq4
 
mladen:
dasio

L'ho testato con questo snippet e funziona bene. Non conosco i parametri che hai usato quindi questo è solo chiamare un indicatore predefinito, ma non c'è nessun problema in questo modo

int init()

{

return(0);

}

int start()

{

Comment(iCustom(NULL,0,"Cronex Taichi",0,0));

return(0);

}

Grazie per la tua risposta,

quello che vedo è che nella storia l'indicatore è stato caricato ripetutamente così sposto il codice di icustom solo in un nuovo evento candela ma il problema persiste ancora.

Non so perché.

Comunque grazie per la tua disponibilità.

 

Ciao,

ho trovato il problema. Ora è tutto ok.

Ho un altro problema con un altro ea.

Ho questi due codici e la funzione Lotti() mi restituirebbe il numero di lotti per un ordine finale.

Quando lo compilo ricevo Posizioni Internal Error. Cosa c'è di sbagliato? Grazie;

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

int intPOS=0;

bool boolTerm=false;

while(boolTerm==false)

{

if(OrderSelect(intPOS,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

intPOS++;

}

else

boolTerm=true;

}

return(intCount);

}

[/PHP]

[PHP]int Lotti(){

int Lotti;

int Posizioni=OTBM(MagicNumber);

switch (Posizioni)

{

case 0 : Lotti=0.1; break;

case 1 : Lotti=0.2; break;

case 2 : Lotti=0.4; break;

case 3 : Lotti=0.8; break;

case 4 : Lotti=1.6; break;

case 5 : Lotti=3.2; break;

case 6 : Lotti=6.4; break;

case 7 : Lotti=12.8; break;

}

return(Lotti);

}
 

Provate a sostituire OTBM() con questo :

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if(OrderSelect(i,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

}

}

return(intCount);

}

[/PHP]

dasio:
Hi,

i found the problem. Now all its ok.

I have another problem with another ea.

I have this two code and the function Lotti() would be return me the number of lot for an ordersend.

When i compile it i receive Posizioni Internal Error. What's wrong? Thank you;

int OTBM(int intMagic)//OrdersTotalByMagic

{

int intCount=0;

int intPOS=0;

bool boolTerm=false;

while(boolTerm==false)

{

if(OrderSelect(intPOS,SELECT_BY_POS))

{

if(OrderMagicNumber()==intMagic) intCount++;

intPOS++;

}

else

boolTerm=true;

}

return(intCount);

}

[PHP]int Lotti(){

int Lotti;

int Posizioni=OTBM(MagicNumber);

switch (Posizioni)

{

case 0 : Lotti=0.1; break;

case 1 : Lotti=0.2; break;

case 2 : Lotti=0.4; break;

case 3 : Lotti=0.8; break;

case 4 : Lotti=1.6; break;

case 5 : Lotti=3.2; break;

case 6 : Lotti=6.4; break;

case 7 : Lotti=12.8; break;

}

return(Lotti);

}
 

Ciao, -.-"

Non trovo pace con questi codici eheheh.

Ho un problema con una funzione che deve darmi come risultato il profitto di tutti gli ordini aperti ma penso che non funzioni perché la condizione non è mai stata rispettata. Di seguito il codice:

.....

if(Profit()>=0.....[/PHP]

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

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

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}
 

dasio

Prova così :

.....

if(Profit()>=0.....[/PHP]

double Profit()

{

int total=OrdersTotal();

double profit=0;

for(int i=0; i<total-1; i++)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}[/PHP]

dasio:
Hi, -.-"

I do not find peace with these codes eheheh.

I have a problem with a function that have to result me the profit of all openorder but i think it's not work because the condition never been respected. Below the code:

[PHP].....

if(Profit()>=0.....

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

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

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}
 
mladen:
dasio

Prova così:

.....

if(Profit()>=0.....[/PHP]

[PHP]double Profit()

{

int total=OrdersTotal();

double profit=0;

for(int i=0; i<total-1; i++)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue;

profit+=OrderProfit();

}

return(profit);

}

In questo modo controllo gli ordini che non sono aperti con magicnumber specificato, giusto? Ho bisogno di controllare l'ordine con un simbolo specifico e un numero magico. Non so se è importante ma ho trovato l'errore in strategy tester

Motivazione: