Ajuda na codificação - página 320

 

Olá,

Há muito tempo eu não estava por aqui...

Estou trabalhando em uma idéia EA, preciso acrescentar um indicador, mas não sei como incluir isso na EA, você pode me ajudar, por favor?

O indicador é Slope Directional Line, quero que funcione no gráfico diário e que acione as ordens no gráfico TF inferior, o código do indicador é:

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

//| linha direcional inclinada D.L.M.mq4 |

//| DANIEL LUCHINGER 2014 |

//| MQL5: negociação forex automatizada, testador de estratégia e indicadores personalizados com MetaTrader |

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

#janela_do_cartão_indicador de propriedade

#property indicator_buffers 2

#Indicador de propriedade_color1 Azul

#largura_do_indicador de propriedade1 3

#indicador de propriedade_color2 Vermelho

#largura_do_indicador de propriedade2 3

//---- parâmetros de entrada

período int externo=14;

método int externo=3; // MODE_SMA

preço interno externo=0; // PREÇO_CLOSE

//---- buffers

dupla Uptrend[];

duplo Dntrend[];

duplo ExtMapBuffer[];

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

//| Função de inicialização do indicador personalizado |

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

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);

IndicatorShortName("Slope Direction Line");

return(0);

}

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

//| Função de desinicialização de indicador personalizada |

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

int deinit(){return(0);}

duplo WMA(int x, int p)

{

retorno(iMA(NULL, 0, p, 0, método, preço, x)));

}

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

//| Função de iteração de indicador personalizada |

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

int start()

{

int counted_bars = IndicatorCounted();

if(counted_bars < 0)

retorno(-1);

int x = 0;

int p = MathSqrt(período);

int e = Barras - contadas_barras + período + 1;

duplo vect[], tendência[];

if(e > Barras)

e = Barras;

ArrayResize(vect, e);

ArraySetAsSeries(vect, true);

ArrayResize(tendência, e);

ArraySetAsSeries(tendência, verdadeiro);

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

{

vect[x] = 2*WMA(x, período/2) - WMA(x, período);

}

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

ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, método, x);

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

{

tendência[x] = tendência[x+1];

se (ExtMapBuffer[x]> ExtMapBuffer[x+1]) tendência[x] =1;

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

if (tendência[x]>0])

{ Uptrend[x] = ExtMapBuffer[x];

if (tendência[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];

Dntrend[x] = EMPTY_VALUE;

}

senão

se (tendência[x]<0)

{

Dntrend[x] = ExtMapBuffer[x];

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

Uptrend[x] = EMPTY_VALUE;

}

}

retorno(0);

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

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

Eu codifiquei da seguinte maneira:

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

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

duplo _sl = 0,_tp = 0;

{

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

{

if(UpTrend)

{label("LONG Condition OK");

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

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

_sl = srDownHT-StopLossShift;

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

if(tt & && order<MaxTrades)

{

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

}

}}

}

}

Alguém pode me corrigir, por favor, porque estou baralhado, isto não está funcionando

Obrigado

Daniel1983

 

Muito obrigado Mistertools por sua ajuda.

Mas ...

O que eu quero fazer é aplicar uma média móvel para o #_FullSSA_normalize o mtf nmc correto.

Isto funciona sem problemas quando faço isto no M5 de maneira normal com a ajuda do MA do MT4.

É a única coisa que eu uso do MT4 ...

Na M1 às vezes funciona, outras vezes não. Talvez tenha que fazer algo com os ajustes.

Basta olhar para a foto, o SSA está bem, mas não o MA ...

Eu mesmo tenho tentado fazer isso, mas é muito complicado para mim, embora eu só tenha dois erros, depois do 'meu trabalho' ...

Deve ter sido sorte, mas mesmo assim, o SSA trabalhou sem problemas, mas o MA não estava em lugar algum para ser visto.

É claro, a SSA é uma elite ....

que eu comprei há algum tempo e vale a pena ...

Arquivos anexados:
ssa.png  72 kb
 
daniel1983:
Olá,

Há muito tempo eu não estava por aqui...

Estou trabalhando em uma idéia EA, preciso acrescentar um indicador, mas não sei como incluir isso na EA, você pode me ajudar, por favor?

O indicador é Slope Directional Line, quero que funcione no gráfico diário e que acione as ordens no gráfico TF inferior, o código do indicador é:

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

//| linha direcional inclinada D.L.M.mq4 |

//| DANIEL LUCHINGER 2014 |

//| MQL5: negociação forex automatizada, testador de estratégia e indicadores personalizados com MetaTrader |

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

#janela_do_cartão_indicador de propriedade

#property indicator_buffers 2

#Indicador de propriedade_color1 Azul

#largura_do_indicador de propriedade1 3

#indicador de propriedade_color2 Vermelho

#largura_do_indicador de propriedade2 3

//---- parâmetros de entrada

período int externo=14;

método int externo=3; // MODE_SMA

preço interno externo=0; // PREÇO_CLOSE

//---- buffers

dupla Uptrend[];

duplo Dntrend[];

duplo ExtMapBuffer[];

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

//| Função de inicialização do indicador personalizado |

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

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);

IndicatorShortName("Slope Direction Line");

return(0);

}

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

//| Função de desinicialização de indicador personalizada |

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

int deinit(){return(0);}

duplo WMA(int x, int p)

{

retorno(iMA(NULL, 0, p, 0, método, preço, x)));

}

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

//| Função de iteração de indicador personalizada |

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

int start()

{

int counted_bars = IndicatorCounted();

if(counted_bars < 0)

retorno(-1);

int x = 0;

int p = MathSqrt(período);

int e = Barras - contadas_barras + período + 1;

duplo vect[], tendência[];

if(e > Barras)

e = Barras;

ArrayResize(vect, e);

ArraySetAsSeries(vect, true);

ArrayResize(tendência, e);

ArraySetAsSeries(tendência, verdadeiro);

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

{

vect[x] = 2*WMA(x, período/2) - WMA(x, período);

}

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

ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, método, x);

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

{

tendência[x] = tendência[x+1];

se (ExtMapBuffer[x]> ExtMapBuffer[x+1]) tendência[x] =1;

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

if (tendência[x]>0])

{ Uptrend[x] = ExtMapBuffer[x];

if (tendência[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];

Dntrend[x] = EMPTY_VALUE;

}

senão

se (tendência[x]<0)

{

Dntrend[x] = ExtMapBuffer[x];

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

Uptrend[x] = EMPTY_VALUE;

}

}

retorno(0);

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

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

Eu codifiquei da seguinte maneira:

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

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

duplo _sl = 0,_tp = 0;

{

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

{

if(UpTrend)

{label("LONG Condition OK");

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

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

_sl = srDownHT-StopLossShift;

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

if(tt & && order<MaxTrades)

{

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

}

}}

}

}

Alguém pode me corrigir, por favor, porque estou baralhado, isto não está funcionando

Obrigado

Daniel1983

Isso não está funcionando simplesmente porque a linha direcional da inclinação é um indicador de repintura. Pegue qualquer média normal do casco ("linha direcional de inclinação" é a média do casco) e tudo será mais fácil

 

Obrigado Mladen, agradeço seu tempo...

Encontrei através dos postos sobre HMA, um que você criou com controle de velocidade,

gostaria de tentar na EA, a mesma idéia que eu queria com o Indicador Direcional de Declive,

mas com este indicador HMA você postou "Hull Moving Averages 2.0 &SR lines".

como seria o código para que isso funcionasse na minha EA?

Eu escrevi:

input int IndicatorTF = 1440 //(indicator in Daily TimeFrame)

entrada no período HMAP = 35; //(permitir-me alterar estes parâmetros)

input ENUM_HMAPrice = PRICE_CLOSE; //(permita-me alterar estes parâmetros)

entrada no HMASpeed = 2.0; //(permita-me alterar estes parâmetros)

dupla tendênciaUp = iCustom(Symbol(),IndicatorTF, "Hull moving average 2.0 & sr lines",HMAPeriod,ENUM_HMAPrice,HMASpeed,0,0);

dupla tendênciaDn = iCustom(Symbol(),IndicatorTF, "Hull moving average 2.0 & sr lines",HMAPeriod,ENUM_HMAPrice,HMASpeed,1,0);

if(trendUp > 0)

{

Compra aberta

}

O código indicador é:

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

//| Média móvel do casco |

//| mladen |

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

#propriedade copyright"www.forex-tsd.com"

#link da propriedade "www.forex-tsd.com"

#janela_do_cartão_indicador de propriedade

#property indicator_buffers 3

#indicador de propriedade_color1 LimeGreen

#indicador de propriedade_color2 PaleVioletRed

#indicador de propriedade_color3 PaleVioletRed

#largura_do_indicador de propriedade1 2

#largura_do_indicador de propriedade2 2

#largura_do_indicador de propriedade3 2

//

//

//

//

//

String externo TimeFrame = "Current time frame";

Externo no período HMAP = 35;

extern int HMAPrice = "PRICE_CLOSE";

HMASpeed duplo externo = 2,0;

externa bool LinesVisible = falso;

Linhas externas int LinesNumber = 5;

cor exterior ColorUp = LimeGreen;

cor externa ColorDown = PaleVioletRed;

externa string UniqueID = "HullLines1";

alertas externos BoolOn = falso;

alertas de bool externoOnCurrent = verdadeiro;

alertas de bool externoMensagem = verdadeiro;

alertas de bool externoSound = falso;

alertas de bool externoEmail = falso;

//

//

//

//

//

duplo hma[];

duplo hmada[];

duplo hmadb[];

duplo hmada[]; duplo hmada[];

duplo hmada[]; duplo hmadb[];

em meio período;

int Período HullPeriod;

string 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,trabalho);

//

//

//

//

//

HMAPeriod = MathMax(2,HMAPeriod);

HalfPeriod = MathFloor(HMAPeriod/HMASpeed);

HullPeriod = MathFloor(MathSqrt(HMAPeriod));

indicadorFileName = WindowExpertName();

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

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

timeFrame = stringToTimeFrame(TimeFrame);

//

//

//

//

//

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

return(0);

}

deinit() vazio

{

deleteLines();

}

linhas de exclusão vazias()

{

int lookForLength = StringLen(UniqueID);

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

{

nome da cadeia = 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(limite+1,Bars-1); return(0); }

//

//

//

//

//

se (calculateValue || timeFrame == Período())

{

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

for(i=limit; 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(trabalho,0,HullPeriod,0,MODE_LWMA,i);

hmada = EMPTY_VALUE;

hmadb = EMPTY_VALUE;

tendência = tendência;

se (hma > hma) tendência = 1;

se (hma < hma) tendência = -1;

se (tendência == -1) PlotPoint(i,hmada,hmadb,hma);

}

deleteLines();

se (LinesVisible)

{

int k = 0;

para (i=0; i<Bars && k<LinesNumber; i++)

se (tendência!= tendência)

{

nome da cadeia = UniqueID+(cadeia)Tempo;

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

se (tendência===1)

ObjectSet(nome,OBJPROP_COLOR,ColorUp);

else ObjectSet(name,OBJPROP_COLOR,ColorDown);

k++;

}

}

gerenciarAlertas();

retornar(0);

}

//

//

//

//

//

limite = MathMax(limite,MathMin(Bars-1,iCustom(NULL,timeFrame,indicadorNome do arquivo, "returnBars",0,0)*timeFrame/Período()));

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

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

{

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

tendência = iCustom(NULL,timeFrame,indicadorNome do arquivo, "calculateValue",HMAPeriod,HMAPrice,HMASpeed,LinesVisible,LinesNumber,ColorUp,ColorDown,UniqueID,alertasOn,alertasOnCurrent,alertasMessage,alertasSound,alertasEmail,3,y);

hma = iCustom(NULL,timeFrame,indicadorNome do arquivo, "calculateValue",HMAPeriod,HMAPrice,HMASpeed,LinesVisible,LinesNumber,ColorUp,ColorDown,UniqueID,alertasOn,alertasOnCurrent,alertasMessage,alertasSound,alertasEmail,0,y);

hmada = VAZIO_VALOR;

hmadb = EMPTY_VALUE;

}

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

return(0);

}

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

//|

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

//

//

//

//

//

alertas de gerenciamento de vazios()

{

se (alertasOn)

{

se (alertasOnCurrent)

int que Bar = 0;

senão qual barra = 1;

if (trend[qualBar] != trend[qualBar+1])

{

if (trend[whichBar] == 1) doAlert(whichBar, "up");

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

}

}

}

//

//

//

//

//

vazio doAlert(int para Bar, string do What)

{

string estática anteriorAlert="nada";

data estática hora anteriorTempo anterior;

mensagem de string;

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

anteriorAlerta = fazer o quê;

previousTime = Tempo[para Bar];

//

//

//

//

//

mensagem = Símbolo()+" "+timeFrameToString(Period())+" em "+TimeToStr(TimeLocal(),TIME_SECONDS)+" A tendência HMA mudou para "+doWhat;

if (alertasMensagem) Alerta(mensagem);

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

if (alertasSom) PlaySound("alert2.wav");

}

}

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

//

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

//

//

//

//

//

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

{

se ((segundo != EMPTY_VALUE) && (segundo != EMPTY_VALUE))

segundo = VAZIO_VALOR;

senão

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

primeiro = VAZIO_VALOR;

}

//

//

//

//

//

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

{

se (primeiro == VAZIO_VALOR)

{

if (first === EMPTY_VALUE) {

primeiro = de;

primeiro = de;

segundo = VAZIO_VALOR;

}

senão {

segundo = de;

segundo = de;

primeiro = VAZIO_VALOR;

}

}

senão

{

primeiro = de;

segundo = VAZIO_VALOR;

}

}

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

//

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

//

//

//

//

//

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

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

//

//

//

//

//

int stringToTimeFrame(string tfs)

{

tfs = stringUpperCase(tfs);

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

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

return(Period());

}

tempo de fioFrameToString(int tf)

{

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

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

return("");

}

//

//

//

//

//

string stringUpperCase(string str)

{

string s = str;

para (comprimento int = StringLen(str)-1; comprimento>=0; comprimento--)

{

int tchar = StringGetChar(s, comprimento);

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

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

caso contrário se(tchar > -33 && tchar < 0)

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

}

devolução(ões);

}

 
mladen:
Não é um problema de interferência de outro indicador (a menos que você esteja usando várias instâncias desse mesmo indicador no mesmo gráfico). Nesse caso, ele pode interferir, já que esse indicador não está escrito para ser usado como indicador de múltiplas instâncias no mesmo gráfico.

Olá MLaden , muito obrigado, mas não é um caso em que estou usando mais de uma instância em um gráfico, apenas uma. apenas linhas estão se deslocando.

se não for óbvio, não se preocupe, vou continuar como está, obrigado pela sua contribuição! tenha um bom dia...

zigflip

 
zigflip:
Olá MLaden , muito obrigado, mas não é um caso em que estou usando mais de uma instância em um gráfico, apenas uma. apenas linhas estão se deslocando.

se não for óbvio, não se preocupe, obrigado pela sua contribuição! tenha um bom dia...

zigflip

Eu tentei aquele que eu afixei e eles não estavam mudando

Experimente, talvez ajude

 

Como chamar um indicador HMA em um EA?

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

E as condições são

se(trendUp) então compre, ou se(trendUp =1) então compre ou algo parecido com isto?

obrigado

 
daniel1983:
Como chamar um indicador HMA em um EA?

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

E as condições são

se(trendUp) então compre, ou se(trendUp =1) então compre ou algo parecido com isto?

obrigado

Depende de parâmetros indicadores, mas você tem que usar iCustom() para isso

Muito mais informações com alguns exemplos que você pode encontrar aqui : https://www.mql5.com/en/forum/173108

 
mladen:
Depende dos parâmetros de indicadores, mas você tem que usar iCustom() para issoMuitas mais informações com alguns exemplos que você pode encontrar aqui : https://www.mql5.com/en/forum/173108

THank por me orientar, ainda estou confuso, encontrei um código HMA semelhante ao código da linha de declive, é "HMA_Russian_Color", mas ainda tenho problemas com as condições, para filtrar a tendência de compra da tendência de venda.

eu escrevi

double Uptrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,0); // onde último 0 = UptrendBuffer

double Dntrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,1); // onde último 1 = DntrendBuffer

//período = 20 / tipo = 3 / preço = 0 está correto?

if(Uptrend) // Como eu escrevo isto?

{

Compra aberta

}

Ordens de compra ainda abertas enquanto o HMA apresenta tendência de queda ou cor vermelha ...

Por favor, me corrija, e ou me ajude a consertar isto...

Obrigado ...

 
daniel1983:
THank por me orientar, ainda estou confuso, encontrei um código HMA semelhante ao código da linha de declive, é "HMA_Russian_Color", mas ainda tenho problemas com as condições, para filtrar a tendência de compra da tendência de venda.

eu escrevi

double Uptrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,0); // onde último 0 = UptrendBuffer

double Dntrend = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,1); // onde último 1 = DntrendBuffer

//período = 20 / tipo = 3 / preço = 0 está correto?

if(Uptrend) // Como eu escrevo isto?

{

Compra aberta

}

Encomendas Compras ainda abertas enquanto o HMA apresenta tendência de queda ou cor vermelha ...

Por favor, me corrija, e ou me ajude a consertar isto...

Obrigado

Para mudança de declive tente algo assim ..:

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

}

Razão: