Aiuto per la codifica - pagina 320

 

Ciao a tutti,

E' da molto tempo che non venivo qui...

Sto lavorando su un'idea di EA, ho bisogno di aggiungere un indicatore ma non so come includerlo nell'EA, puoi aiutarmi per favore?

L'indicatore è Slope Directional Line, voglio che funzioni nel grafico giornaliero e che attivi gli ordini nel grafico TF inferiore, il codice dell'indicatore è:

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

//| slope directional line D.L.M.mq4 |

//| DANIEL LUCHINGER 2014 ||

//| MQL5: trading forex automatizzato, tester di strategie e indicatori personalizzati con MetaTrader ||

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

#proprietà indicator_chart_window

#proprietà indicator_buffers 2

#proprietà indicator_color1 Blue

#proprietà indicator_width1 3

#proprietà indicatore_colore2 Rosso

#proprietà indicator_width2 3

//---- parametri di ingresso

extern int period=14;

extern int method=3; // MODE_SMA

extern int price=0; // PRICE_CLOSE

//---- buffer

double Uptrend[]

double Dntrend[]

double ExtMapBuffer[]

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

//|Funzione di inizializzazione dell'indicatore personalizzata

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

int init()

{

IndicatorBuffers(3);

SetIndexBuffer(0, Uptrend);

SetIndexBuffer(1, Dntrend);

SetIndexBuffer(2, ExtMapBuffer);

ArraySetAsSeries(ExtMapBuffer, true);

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);

SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);

IndicatoreNomeCorto("Linea di direzione della pendenza");

return(0);

}

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

//| Funzione personalizzata di deinizializzazione dell'indicatore |

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

int deinit(){return(0);}

double WMA(int x, int p)

{

return(iMA(NULL, 0, p, 0, metodo, prezzo, x));

}

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

//| Funzione di iterazione dell'indicatore personalizzato |

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

int start()

{

int counted_bars = IndicatorCounted();

if(counted_bars < 0)

return(-1);

int x = 0;

int p = MathSqrt(periodo);

int e = Bars - counted_bars + periodo + 1;

doppio vect[], trend[];

se(e > Bars)

e = Bars;

ArrayResize(vect, e);

ArraySetAsSeries(vect, true);

ArrayResize(trend, e);

ArraySetAsSeries(trend, true);

for(x = 0; x < e; x++)

{

vect[x] = 2*WMA(x, periodo/2) - WMA(x, periodo);

}

for(x = 0; x < e-periodo; x++)

ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, metodo, x);

for(x = e-periodo; x >= 0; x--)

{

trend[x] = trend[x+1];

se (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;

se (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;

se (trend[x]>0)

{ Uptrend[x] = ExtMapBuffer[x];

se (trend[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];

Dntrend[x] = EMPTY_VALUE;

}

altrimenti

se (trend[x]<0)

{

Dntrend[x] = ExtMapBuffer[x];

se (trend[x+1]>0) Dntrend[x+1]=ExtMapBuffer[x+1];

Uptrend[x] = EMPTY_VALUE;

}

}

return(0);

---------------

--------------

Ho codificato nel modo seguente

double UpTrend = iCustom(NULL,1440, "slope directional line D.L.M",20,3,0,1); // dove 0 = UptrendBuffer

double DnTrend = iCustom(NULL,1440, "slope directional line D.L.M",20,3,1,1); // dove 1 = DntrendBuffer

doppio _sl = 0,_tp = 0;

{

if(haMode == 0 || haMode == 1)

{

if(UpTrend)

{label("Condizione LONG OK");

if(Close[0] >= srDown && Close[0] < srUp)

//if(StopLoss > 0) _sl = Ask - StopLoss;

_sl = srDownHT-StopLossShift;

if(TakeProfit > 0) _tp = Ask + TakeProfit;

if(tt && orders<MaxTrades)

{

openOrder(getLots(),MagicNumber,OP_BUY, _sl,_tp);

}

}}

}

}

Qualcuno può correggermi per favore perché sono sicuro che questo non funziona

Grazie

Daniel1983

 

Grazie mille Mistertools per il tuo aiuto.

Ma ...

Quello che voglio fare è applicare una media mobile al #_FullSSA_normalize corretto mtf nmc.

Questo funziona senza problemi quando lo faccio sulla M5 in modo normale con l'aiuto della MA di MT4.

E' l'unica cosa che uso da MT4 ...

Sulla M1 a volte funziona, altre volte no. Potrebbe avere a che fare con le impostazioni.

Basta guardare l'immagine, l'SSA è ok, ma non la MA ...

Ho provato a farlo da solo, ma è troppo complicato per me, anche se ho avuto solo due errori, dopo il 'mio lavoro' ...

Devo essere stato fortunato, ma tuttavia, l'SSA ha funzionato senza problemi, ma il MA non si è visto da nessuna parte.

Naturalmente, l'SSA è un'elite ....

che ho comprato qualche tempo fa e ne vale la pena ...

File:
ssa.png  72 kb
 
daniel1983:
Ciao a tutti,

È da molto tempo che non venivo qui...

Sto lavorando su un'idea di EA, ho bisogno di aggiungere un indicatore ma non so come includerlo nell'EA, potete aiutarmi per favore?

L'indicatore è Slope Directional Line, voglio che funzioni nel grafico giornaliero e che attivi gli ordini nel grafico TF inferiore, il codice dell'indicatore è:

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

//| slope directional line D.L.M.mq4 |

//| DANIEL LUCHINGER 2014 ||

//| MQL5: trading forex automatizzato, tester di strategie e indicatori personalizzati con MetaTrader ||

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

#proprietà indicator_chart_window

#proprietà indicator_buffers 2

#proprietà indicator_color1 Blue

#proprietà indicator_width1 3

#proprietà indicatore_colore2 Rosso

#proprietà indicator_width2 3

//---- parametri di ingresso

extern int period=14;

extern int method=3; // MODE_SMA

extern int price=0; // PRICE_CLOSE

//---- buffer

double Uptrend[]

double Dntrend[]

double ExtMapBuffer[]

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

//|Funzione di inizializzazione dell'indicatore personalizzata

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

int init()

{

IndicatorBuffers(3);

SetIndexBuffer(0, Uptrend);

SetIndexBuffer(1, Dntrend);

SetIndexBuffer(2, ExtMapBuffer);

ArraySetAsSeries(ExtMapBuffer, true);

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);

SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);

IndicatoreNomeCorto("Linea di direzione della pendenza");

return(0);

}

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

//| Funzione personalizzata di deinizializzazione dell'indicatore |

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

int deinit(){return(0);}

double WMA(int x, int p)

{

return(iMA(NULL, 0, p, 0, metodo, prezzo, x));

}

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

//| Funzione di iterazione dell'indicatore personalizzato |

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

int start()

{

int counted_bars = IndicatorCounted();

if(counted_bars < 0)

return(-1);

int x = 0;

int p = MathSqrt(periodo);

int e = Bars - counted_bars + periodo + 1;

doppio vect[], trend[];

se(e > Bars)

e = Bars;

ArrayResize(vect, e);

ArraySetAsSeries(vect, true);

ArrayResize(trend, e);

ArraySetAsSeries(trend, true);

for(x = 0; x < e; x++)

{

vect[x] = 2*WMA(x, periodo/2) - WMA(x, periodo);

}

for(x = 0; x < e-periodo; x++)

ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, metodo, x);

for(x = e-periodo; x >= 0; x--)

{

trend[x] = trend[x+1];

se (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;

se (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;

se (trend[x]>0)

{ Uptrend[x] = ExtMapBuffer[x];

se (trend[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];

Dntrend[x] = EMPTY_VALUE;

}

altrimenti

se (trend[x]<0)

{

Dntrend[x] = ExtMapBuffer[x];

se (trend[x+1]>0) Dntrend[x+1]=ExtMapBuffer[x+1];

Uptrend[x] = EMPTY_VALUE;

}

}

return(0);

---------------

--------------

Ho codificato nel modo seguente

double UpTrend = iCustom(NULL,1440, "slope directional line D.L.M",20,3,0,1); // dove 0 = UptrendBuffer

double DnTrend = iCustom(NULL,1440, "slope directional line D.L.M",20,3,1,1); // dove 1 = DntrendBuffer

doppio _sl = 0,_tp = 0;

{

if(haMode == 0 || haMode == 1)

{

if(UpTrend)

{label("Condizione LONG OK");

if(Close[0] >= srDown && Close[0] < srUp)

//if(StopLoss > 0) _sl = Ask - StopLoss;

_sl = srDownHT-StopLossShift;

if(TakeProfit > 0) _tp = Ask + TakeProfit;

if(tt && orders<MaxTrades)

{

openOrder(getLots(),MagicNumber,OP_BUY, _sl,_tp);

}

}}

}

}

Qualcuno può correggermi per favore perché sono sicuro che questo non funziona

Grazie

Daniel1983

Non funziona semplicemente perché la linea direzionale di pendenza è un indicatore di riverniciatura. Prendi una qualsiasi media Hull normale ("slope directional line" è una media Hull) e tutto sarà più facile

 

Grazie Mladen, apprezzo il tuo tempo.

Ho trovato attraverso i post sull'HMA, uno che hai creato con il controllo della velocità,

vorrei provarlo nell'EA, la stessa idea che volevo con l'indicatore Slope Directional,

ma con questo indicatore HMA che hai postato "Hull Moving Averages 2.0 &SR lines"

come sarebbe il codice per questo per farlo funzionare nel mio EA?

Ho scritto

input int IndicatorTF = 1440 //(indicatore in TimeFrame giornaliero)

input int HMAPeriod = 35; //(permettimi di cambiare questo parametro)

input ENUM_HMAPrice = PRICE_CLOSE; //(permettimi di cambiare questo parametro)

input int HMASpeed = 2.0; //(permettimi di cambiare questo parametro)

double trendUp = iCustom(Symbol(),IndicatorTF, "Hull moving average 2.0 & sr lines",HMAPeriod,ENUM_HMAPrice,HMASpeed,0,0);

double trendDn = iCustom(Symbol(),IndicatorTF, "Hull moving average 2.0 & sr lines",HMAPeriod,ENUM_HMAPrice,HMASpeed,1,0);

se(trendUp > 0)

{

Aprire Comprare

}

Il codice dell'indicatore è:

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

//| media mobile di Hull ||

//| mladen |

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

#proprietà copyright"www.forex-tsd.com"

#property link "www.forex-tsd.com"

#proprietà indicator_chart_window

#proprietà indicator_buffers 3

#proprietà indicator_color1 LimeGreen

#proprietà indicator_color2 PaleVioletRed

#proprietà indicator_color3 PaleVioletRed

#proprietà indicator_width1 2

#property indicator_width2 2

#proprietà indicator_width3 2

//

//

//

//

//

extern string TimeFrame = "Current time frame";

extern int HMAPeriod = 35;

extern int HMAPrice = PRICE_CLOSE;

extern double HMASpeed = 2.0;

extern bool LinesVisible = false;

extern int LinesNumber = 5;

extern color ColorUp = LimeGreen;

extern color ColorDown = PaleVioletRed;

extern string UniqueID = "HullLines1

extern bool alertsOn = false;

extern bool alertsOnCurrent = true;

extern bool alertsMessage = true;

extern bool alertsSound = false;

extern bool alertsEmail = false;

//

//

//

//

//

doppio hma[];

doppio hmada[]

doppio hmadb[];

doppio lavoro[];

doppio trend[];

int HalfPeriod;

int HullPeriod;

stringa indicatorFileName;

bool returnBars;

bool calculateValue;

int timeFrame;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

//

//

//

//

//

int init()

{

IndicatorBuffers(5);

SetIndexBuffer(0,hma);

SetIndexBuffer(1,hmada);

SetIndexBuffer(2,hmadb);

SetIndexBuffer(3,trend);

SetIndexBuffer(4,lavoro);

//

//

//

//

//

HMAPeriod = MathMax(2,HMAPeriod);

HalfPeriod = MathFloor(HMAPeriod/HMASpeed);

HullPeriod = MathFloor(MathSqrt(HMAPeriod));

indicatorFileName = WindowExpertName();

calculateValue = TimeFrame=="calculateValue"; if (calculateValue) { return(0); }

returnBars = TimeFrame=="returnBars"; if (returnBars) { return(0); }

timeFrame = stringToTimeFrame(TimeFrame);

//

//

//

//

//

IndicatorShortName(timeFrameToString(timeFrame)+" HMA ("+HMAPeriod+")");

return(0);

}

void deinit()

{

deleteLines();

}

void deleteLines()

{

int lookForLength = StringLen(UniqueID);

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

{

string name = ObjectName(i);

if (StringSubstr(name,0,lookForLength)==UniqueID) ObjectDelete(name);

}

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

//

//

//

//

//

int start()

{

int i,counted_bars = IndicatorCounted();

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

if(counted_bars>0) counted_bars--;

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

if (returnBars) { hma[0] = MathMin(limit+1,Bars-1); return(0); }

//

//

//

//

//

if (calculateValue || timeFrame == Period())

{

if (trend[limit] == -1) CleanPoint(limit,hmada,hmadb);

for(i=limite; i>=0; i--) work = 2.0*iMA(NULL,0,HalfPeriod,0,MODE_LWMA,HMAPrice,i)-iMA(NULL,0,HMAPeriod,0,MODE_LWMA,HMAPrice,i);

for(i=limite; i>=0; i--)

{

hma = iMAOnArray(work,0,HullPeriod,0,MODE_LWMA,i);

hmada = EMPTY_VALUE;

hmadb = EMPTY_VALUE;

tendenza = tendenza;

se (hma > hma) trend = 1;

se (hma < hma) trend = -1;

se (trend == -1) PlotPoint(i,hmada,hmadb,hma);

}

deleteLines();

se (LineeVisibili)

{

int k = 0;

for (i=0; i<Bars && k<Numero linee; i++)

se (trend!=trend)

{

string name = UniqueID+(string)Time;

ObjectCreate(name,OBJ_TREND,0,Time,hma,Time+Period()*60,hma);

se (tendenza==1)

ObjectSet(nome,OBJPROP_COLOR,ColorUp);

altrimenti ObjectSet(nome,OBJPROP_COLOR,ColorDown);

k++;

}

}

manageAlerts();

return(0);

}

//

//

//

//

//

limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName, "returnBars",0,0)*timeFrame/Period());

if (trend[limit]==-1) CleanPoint(limit,hmada,hmadb);

for (i=limite; i>=0; i--)

{

int y = iBarShift(NULL,timeFrame,Time);

trend = iCustom(NULL,timeFrame,indicatorFileName, "calculateValue",HMAPeriod,HMAPrice,HMASpeed,LinesVisible,LinesNumber,ColorUp,ColorDown,UniqueID,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,3,y);

hma = iCustom(NULL,timeFrame,indicatorFileName, "calculateValue",HMAPeriod,HMAPrice,HMASpeed,LinesVisible,LinesNumber,ColorUp,ColorDown,UniqueID,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsEmail,0,y);

hmada = VUOTO_VALORE;

hmadb = VUOTO_VALORE;

}

for (i=limit;i>=0;i--) if (trend==-1) PlotPoint(i,hmada,hmadb,hma);

return(0);

}

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

//|

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

//

//

//

//

//

void manageAlerts()

{

se (alertsOn)

{

se (avvisiOnCurrent)

int whichBar = 0;

altrimenti qualeBar = 1;

se (trend[qualeBar] != trend[qualeBar+1])

{

se (trend[qualeBar] == 1) doAlert(qualeBar, "up");

se (trend[whichBar] == -1) doAlert(whichBar, "down");

}

}

}

//

//

//

//

//

void doAlert(int forBar, string doWhat)

{

static string previousAlert="niente";

static datetime previousTime;

messaggio di stringa;

if (previousAlert != doWhat || previousTime != Time[forBar]) {

previousAlert = doWhat;

previousTime = Time[forBar];

//

//

//

//

//

message = Symbol()+" "+timeFrameToString(Period())+" a "+TimeToStr(TimeLocal(),TIME_SECONDS)+" HMA trend cambiato a "+doWhat;

if (alertsMessage) Alert(message);

if (alertsEmail) SendMail(Symbol()+" HMA ",message);

se (avvisiSuono) PlaySound("avviso2.wav");

}

}

//-------------------------------------------------------------------

//

//-------------------------------------------------------------------

//

//

//

//

//

void CleanPoint(int i,double& first[],double& second[])

{

if ((second != EMPTY_VALUE) && (second != EMPTY_VALUE))

secondo = VUOTO_VALORE;

altrimenti

if ((first != EMPTY_VALUE) && (first != EMPTY_VALUE) && (first == EMPTY_VALUE))

first = EMPTY_VALUE;

}

//

//

//

//

//

void PlotPoint(int i,double& first[],double& second[],double& from[])

{

se (first == EMPTY_VALUE)

{

if (first == EMPTY_VALUE) {

first = from;

first = from;

secondo = EMPTY_VALUE;

}

altrimenti {

secondo = da;

secondo = da;

primo = EMPTY_VALUE;

}

}

else

{

first = from;

secondo = VUOTO_VALORE;

}

}

//-------------------------------------------------------------------

//

//-------------------------------------------------------------------

//

//

//

//

//

stringa sTfTable[] = {"M1", "M5", "M15", "M30", "H1", "H4", "D1", "W1", "MN"};

int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

//

//

//

//

//

int stringToTimeFrame(stringa tfs)

{

tfs = stringUpperCase(tfs);

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

se (tfs==sTfTable || tfs==""+iTfTable) return(MathMax(iTfTable,Period());

return(Periodo());

}

stringa timeFrameToString(int tf)

{

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

se (tf==iTfTable) return(sTfTable);

return("");

}

//

//

//

//

//

stringa stringUpperCase(stringa str)

{

stringa s = str;

for (int length=StringLen(str)-1; length>=0; length--)

{

int tchar = StringGetChar(s, lunghezza);

if((tchar > 96 && tchar 223 && tchar < 256))

s = StringSetChar(s, lunghezza, tchar - 32);

else if(tchar > -33 && tchar < 0)

s = StringSetChar(s, lunghezza, tchar + 224);

}

return(s);

}

 
mladen:
Non è un problema di altri indicatori che interferiscono (a meno che tu non stia usando più istanze di quello stesso indicatore sullo stesso grafico). In questo caso può accadere perché quell'indicatore non è scritto per essere usato come indicatore multi istanza sullo stesso grafico

Ciao MLaden , grazie mille ma non è un caso in cui sto usando più di un'istanza su un grafico, solo una. solo le linee si stanno spostando.

se il suo non è ovvio non ti preoccupare manterrò come è, grazie per il tuo input! buona giornata...

zigflip

 
zigflip:
Ciao MLaden , grazie mille ma non è un caso in cui sto usando più di un'istanza su un grafico, solo una. solo le linee si stanno spostando.

se non è ovvio non preoccupatevi, lo terrò così com'è, grazie per il vostro input! buona giornata...

zigflip

Ho provato quello che ho postato e non si spostavano

Provalo, forse aiuta

 

Come faccio a chiamare un indicatore HMA in un EA?

doppio (NULL,0, "HMA",??????)

E le condizioni sono

if(trendUp) allora compra, o if(trendUp =1) allora compra o qualcosa del genere?

grazie

 
daniel1983:
Come posso chiamare un indicatore HMA in un EA?

doppio (NULL,0, "HMA",??????)

E le condizioni sono

if(trendUp) allora compra, o if(trendUp =1) allora compra o qualcosa del genere?

grazie

Dipende dai parametri degli indicatori, ma devi usare iCustom() per questo

Molte più informazioni con alcuni esempi si possono trovare qui: https: //www.mql5.com/en/forum/173108

 
mladen:
Dipende dai parametri degli indicatori, ma devi usare iCustom() per questo Molte più informazioni con parecchi esempi puoi trovare qui: https: //www.mql5.com/en/forum/173108

Grazie per avermi guidato, sono ancora confuso, ho trovato un indicatore HMA simile al codice della linea di pendenza, è "HMA_Russian_Color", ma ho ancora problemi con le condizioni, per filtrare la tendenza all'acquisto dalla tendenza alla vendita.

Ho scritto

double Uptrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,0); // dove ultimo 0 = UptrendBuffer

double Dntrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,1); // dove ultimo 1 = DntrendBuffer

//periodo = 20 / tipo = 3 / prezzo = 0 è corretto?

if(Uptrend) //come faccio a scrivere questo?

{

Aprire Acquista

}

Ordini Buy ancora aperto mentre HMA downtrend o colore rosso ...

Per favore correggetemi, e o aiutatemi a sistemare questo...

Grazie

 
daniel1983:
Grazie per avermi guidato, sono ancora confuso, ho trovato un indicatore HMA simile al codice della linea di pendenza, è "HMA_Russian_Color", ma ho ancora problemi con le condizioni, per filtrare il trend di acquisto dal trend di vendita.

ho scritto

double Uptrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,0); // dove last 0 = UptrendBuffer

double Dntrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,1); // dove ultimo 1 = DntrendBuffer

//periodo = 20 / tipo = 3 / prezzo = 0 è corretto?

if(Uptrend) //come faccio a scrivere questo?

{

Aprire Acquista

}

Ordini Buy ancora aperto mentre HMA downtrend o colore rosso ...

Per favore correggetemi, e o aiutatemi a sistemare questo...

Grazie

Per il cambio di pendenza prova qualcosa come questo:

double current = iCustom(Symbol(),0,"HMA_Russian_Color",20,3,0,0);

double previous1 = iCustom(Symbol(),0,"HMA_Russian_Color",20,3,0,1);

double previous2 = iCustom(Symbol(),0,"HMA_Russian_Color",20,3,0,2);

if (current>previous1 && previous1<previous2)

{

// slope changed to up

}

if (currentprevious2)

{

// slope changed to down

}

Motivazione: