Come codificare? - pagina 296

 

È possibile aggiungere colore, stile e peso alle linee dei livelli dell'indicatore?

Ciao,

Mi sto chiedendo se qualcuno può dirmi se è possibile aggiungere colore, stile e peso alle linee dei livelli degli indicatori?

Come inizio vorrei specificare sia lo stile che il colore ai livelli RSI e mi sto chiedendo se si può fare questo aggiungendo più codice per esempio alla linea: #property indicator_level1 70 ?

Se possibile, apprezzerei molto se qualcuno potesse mostrarmelo.

Grazie,

Laurus

 

...

Sì, è possibile

Utilizzare le seguenti proprietà:

#property indicator_levelcolor

#property indicator_levelstyle

#property indicator_levelwidth

[/PHP]

If you use indicator_levelwidth greater than 1, only indicator_levelstyle that metatrader will allow is STYLE_SOLID (solid line). Also, you can specify only one color, style and width for all levels (if you need more than one color, style or width for levels, you either have to use buffers or objects - horizontal line, for example)

You can use the SetLevelStyle() function too for that purpose,with same limitations as described above

[PHP]

void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)

Laurus12:
Ciao,

Mi sto chiedendo se qualcuno può dirmi se è possibile aggiungere colore, stile e peso alle linee dei livelli dell'indicatore?

Come inizio vorrei specificare sia lo stile che il colore ai livelli RSI e mi sto chiedendo se è possibile farlo aggiungendo altro codice per esempio alla linea: #property indicator_level1 70 ?

Se possibile, apprezzerei molto se qualcuno potesse mostrarmelo.

Grazie,

Laurus
 

Grazie per la tua risposta Mladen, il tuo aiuto è sempre molto apprezzato.

Quello che hai scritto è esattamente quello che temevo. Quando si tratta di funzioni parte è ancora sopra la mia testa.

Se dai un'occhiata all'immagine vedi come vorrei che fosse. Come compromesso ho usato linee orizzontali regolari, ma dato che disegno linee di tendenza con l'indicatore stesso non è una buona soluzione.

Grazie,

Laurus

File:
 

...

Guardando la tua immagine, sembra che sia l'unica soluzione che puoi applicare (usando gli oggetti). Usare i buffer di disegno semplicemente prosciugherebbe i tuoi buffer di disegno e non potresti disegnare tutti i valori che stai usando su quell'indicatore. A volte stiamo ancora "pagando" la decisione di metatraders 4 di avere solo 8 buffer di disegno

Laurus12:
Grazie per la tua risposta Mladen, il tuo aiuto è sempre molto apprezzato.

Quello che hai scritto è esattamente quello che temevo. Quando si tratta di funzioni è ancora oltre la mia testa.

Se dai un'occhiata alla foto vedi come vorrei che fosse. Come compromesso ho usato linee orizzontali regolari, ma dato che disegno linee di tendenza con l'indicatore stesso non è una buona soluzione.

Grazie,

Laurus
 

La DLL esterna restituisce strani risultati

Ciao!

Qui sotto c'è un esempio molto semplice di una chiamata a una DLL esterna. Il log del diario dovrebbe mostrare numeri crescenti a partire da 0 quando viene usato con lo strategy tester.

Tuttavia, il risultato è piuttosto strano. La prima riga del journal log mostra un numero grande (cioè 18472) e poi aumenta correttamente per un po' fino a quando non inizia a saltare circa 10, a volte oltre 100, passi alla volta.

Qualcuno potrebbe spiegarmi la ragione di questo e come correggerlo?

Grazie!

// MyExpert.mql //

#import "MyDLL.dll"

int Test();

#import

void start(){

Print(Test());

}[/CODE]

// MyDLL.def //

LIBRARY MyDLL

EXPORTS

Test

[CODE]

// MyDLL.dll //

int i= 0;

int __stdcall Test() {

i++;

return i;

}
 

interessante problema di codice per l'indicatore

Ciao ragazzi,

Sto cercando di imparare la programmazione di MT4, e in questo momento sto sviluppando un indicatore di rilevamento PinBar, che mi dice di comprare o vendere. Ho sviluppato questo indicatore specialmente per il grafico a 4 ore, a causa delle regole speciali per comprare o vendere. La regola per il rilevamento è la seguente:

Corpo della candela <= 35% della lunghezza della candela.

Almeno 1 stoppino della candela >= 50 % della lunghezza della candela.

Finora non ho problemi a rilevare queste barre con l'indicatore.

Tuttavia, la prossima regola mi dice di comprare o vendere.

Ingrandisco il grafico a 1 ora e guardo le 4 barre che hanno creato la pinbar sul grafico a 4 ore.

Ho usato la funzione iClose per prendere il valore della chiusura della prima e dell'ultima barra di quella formazione sulla barra a 1 ora.

Tuttavia...come programmato ora, guardo sempre la prima e l'ultima candela sul grafico a 1 ora stesso. E questo non va bene. Devono essere la prima e l'ultima barra della formazione e non del grafico.

Ecco il codice che ho ora con le funzioni iClose sbagliate.

if ( (((100.0/CandleLength)*BodyLength)=50.0) || (((100.0/CandleLength)*LowerWick)>=50.0) ) && iClose(Symbol(),60,1) > iClose(Symbol(),60,4))

{

Buy = Close;

SetLevel(true,i+1,Close);

}

Non sono stato in grado di individuare le giuste candele a 1 ora sullo sfondo di quella particolare candela a 4 ore.

C'è qualcuno là fuori che può darmi la risposta al mio problema?

risolto:

datetime H4BarTime;

int H1BarNumber;

H4BarTime = Tempo;

H1BarNumber = iBarShift(NULL, PERIOD_H1, H4BarTime);

tx molto!

Jacob

 
mladen:
Guardando la tua immagine, sembra che sia l'unica soluzione che puoi applicare (usando gli oggetti). Usare i buffer di disegno semplicemente prosciugherebbe i tuoi buffer di disegno e non potresti disegnare tutti i valori che stai usando su quell'indicatore. A volte stiamo ancora "pagando" la decisione di metatraders 4 di avere solo 8 buffer di disegno

Scusa per la mia risposta tardiva Mladen e grazie per aver chiarito la questione. Per quanto riguarda quello che hai scritto, almeno ora lo so con certezza.

Grazie,

Laurus

 

Aiuto con i criteri di ingresso

Ciao ragazzi,

Sto cercando di fare un criterio di entrata usando le MA. Il mio criterio di entrata è semplice, voglio entrare in un trade lungo quando la MA veloce incrocia la MA lenta verso l'alto alla chiusura della candela invece della candela corrente e viceversa.

La mia situazione attuale è che il mio EA attiverà un trade lungo quando la MA veloce incrocia la MA lenta verso l'alto e viceversa, tuttavia quella candela non si è ancora chiusa, e a volte quando la candela si chiude, la MA finale potrebbe non incrociare verso l'alto, quindi non avrei dovuto attivare quel particolare trade, eppure il sistema l'ha attivato perché ha incrociato verso l'alto una volta e indietro. Questo è lo stesso per i trade brevi

Sono già alcuni giorni che mi occupo di questo senza alcun progresso. Qualcuno può fare un po' di luce su come devo procedere? Grazie.

//--- parametri di input

extern double TakeProfit=2700.0;

extern double Lots=0.1;

extern double StopLoss=2500.0;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

int Crossed (doppia linea1 , doppia linea2)

{

static int last_direction = 0;

static int current_dirction = 0;

se(linea1>linea2)current_dirction = 1; //su

if(linea1<linea2)current_dirction = 2; //giù

if(current_dirction != last_direction) //cambiamento

{

ultima_direzione = current_dirction

return (last_direction);

}

else

{

return (0);

}

}

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

//| funzione di avvio esperto |

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

int start()

{

//----

int cnt, ticket, totale

doppio shortEma, longEma;

se(Bars<100)

{

Print("barre inferiori a 100");

return(0);

}

se(TakeProfit<10)

{

Print("TakeProfit inferiore a 10");

return(0); // controlla TakeProfit

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);

totale = OrdiniTotali();

se(totale < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Il mio EA",12345,0,Verde);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

Grazie e saluti

Terrance

 

...

Terrance

Prova a cambiare queste linee:

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

In questo modo non hai nemmeno bisogno della funzione incrociata e controllerà gli incroci su una barra chiusa.

tkuan77:
Ciao ragazzi,

Sto cercando di fare un criterio di entrata usando le MA. Il mio criterio di entrata è semplice, voglio entrare in un trade lungo quando Fast MA incrocia Slow MA verso l'alto sulla chiusura della candela invece che sulla candela corrente e viceversa.

La mia situazione attuale è che il mio EA attiverà un trade lungo quando la MA veloce incrocia la MA lenta verso l'alto e viceversa, tuttavia quella candela non si è ancora chiusa, e a volte quando la candela si chiude, la MA finale potrebbe non incrociare verso l'alto, quindi non avrei dovuto attivare quel particolare trade, eppure il sistema l'ha attivato perché ha incrociato verso l'alto una volta e indietro. Questo è lo stesso per i trade brevi

Sono già alcuni giorni che mi occupo di questo senza alcun progresso. Qualcuno può fare un po' di luce su come devo procedere? Grazie.

//--- parametri di input

extern double TakeProfit=2700.0;

extern double Lots=0.1;

extern double StopLoss=2500.0;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

int Crossed (doppia linea1 , doppia linea2)

{

static int last_direction = 0;

static int current_dirction = 0;

se(linea1>linea2)current_dirction = 1; //su

if(linea1<linea2)current_dirction = 2; //giù

if(current_dirction != last_direction) //cambiamento

{

ultima_direzione = current_dirction

return (last_direction);

}

else

{

return (0);

}

}

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

//| funzione di avvio esperto |

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

int start()

{

//----

int cnt, ticket, totale

doppio shortEma, longEma;

se(Bars<100)

{

Print("barre inferiori a 100");

return(0);

}

se(TakeProfit<10)

{

Print("TakeProfit inferiore a 10");

return(0); // controlla TakeProfit

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);

totale = OrdiniTotali();

se(totale < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Il mio EA",12345,0,Verde);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

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

Grazie e saluti

Terrance
 
mladen:
Terrance

Prova a cambiare queste righe:

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = Crossed (shortEma,longEma);[/PHP]

to something like this :

[PHP] int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

if ((diff1*diff2)<0)

{

if (shortEma1>longEma1)

isCrossed = 1;

else isCrossed = 2;

}

In questo modo non hai nemmeno bisogno della funzione incrociata e controllerà gli incroci su una barra chiusa.

Ciao Mladen, ho provato quello che mi hai detto e funziona a meraviglia. Tuttavia, non capisco bene la logica dietro i codici. perché imposti lo shift di iMA a 1 e 2 e perché codifichi questo: (diff1*diff2)<0)? Scusate ma al momento sono ancora in fase di apprendimento.

Grazie e saluti

Terrance