Ajuda na codificação - página 352

 
freakout:
Olá,

querida mladen, eu tenho um pequeno pedido a Você - você poderia desligar todas as informações que o indicador anexado abaixo mostra no canto superior esquerdo?

agradecimentos prévios ;-)

Fez uma opção para ativar/desativar os comentários.

Arquivos anexados:
 
paradise77:
Hi,

sou novo aqui. Eu gostaria de atualizar um objeto retângulo, mas não sei como. O código abaixo eu usava para criar retângulos de objeto, se os EMAs se cruzassem. Estes retângulos devem terminar se o preço voltar e tocá-lo. Como fazer isso ?

Agradecemos antecipadamente.

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 clrLime

#property indicator_width1 2

#property indicator_color2 clrMagenta

#property indicator_width2 2

extern int EMA1 = 3;

extern int EMA2 = 21;

extern int EMA3 = 63;

extern double arrowDistance = 0.0003;

extern color upRectColor = clrYellow;

extern color dnRectColor = clrDodgerBlue;

extern color touchRectColor = clrDarkGray;

//---

extern double rectHigh = 0.0001;

extern int rectDays = 3;

extern int bars_limit = 2000;

extern bool showRectangle = true;

double upArrow[];

double dnArrow[];

double prev2EMA1, prev2EMA2, prev2EMA3;

double prevEMA1, prevEMA2, prevEMA3;

double curEMA1, curEMA2, curEMA3;

double prevOpenPrc, prevClosePrc, prevLowPrc, prevHighPrc;

string objRectName;

string rectArray[];

string indiName = "Emac";

int rectValidity = 0;

int arrayMaxAmounts = 99999;

int arrayCurAmount = 0;

int arrayLastAmount = 0;

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

//| INIT() |

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

int init() {

if (Period() != PERIOD_H1) {

Alert("Use only @ TF: H1");

return(0);

}

ArrayResize(rectArray,arrayMaxAmounts,arrayMaxAmounts);

IndicatorBuffers(2);

SetIndexBuffer(0,upArrow);

SetIndexBuffer(1,dnArrow);

SetIndexStyle(0,DRAW_ARROW);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(0,233);

SetIndexArrow(1,234);

SetIndexEmptyValue(0,0.0);

SetIndexEmptyValue(1,0.0);

SetIndexLabel(0,"Up");

SetIndexLabel(1,"Dn");

return(0);

}

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

//| DEINIT() |

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

int deinit() {

int k=0;

while (k<ObjectsTotal()) {

string objname = ObjectName(k);

if (StringSubstr(objname,0,StringLen("Emac")) == "Emac")

ObjectDelete(objname);

else

k++;

}

return(0);

}

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

//| START() |

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

int start() {

if (Period() != PERIOD_H1) {

Alert("Use only @ TF: H1");

return(0);

}

int limit,i,k;

int counted_bars=IndicatorCounted();

//---- last counted bar will be recounted

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

//---

if (limit>bars_limit-1 && bars_limit!=0) limit=bars_limit-1;

if (Bars<EMA1 || Bars<EMA2 || Bars0 && bars_limit0 && bars_limit0 && bars_limit<EMA3)) {

Alert("Adjust limit settings or put more bars on your chart!");

return(0);

}

//---

for (i=0; i<limit; i++) {

prev2EMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+2);

prev2EMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+2);

prev2EMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+2);

prevEMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+1);

prevEMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+1);

prevEMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+1);

curEMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

curEMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

curEMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i);

prevOpenPrc = iOpen(NULL,0,i+1);

prevClosePrc = iClose(NULL,0,i+1);

prevLowPrc = iLow(NULL,0,i+1);

prevHighPrc = iHigh(NULL,0,i+1);

rectValidity = rectDays*86400;

if ( (prev2EMA1=prevEMA2)&&(curEMA1>curEMA2)&&(prevEMA2>=prevEMA3)&&(curEMA2>curEMA3) ) { // up

upArrow = prevLowPrc - arrowDistance;

if (showRectangle == true) {

//----------------------- Draw Rectangle ----------------------

objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));

if (ObjectFind(objRectName) == -1) { // not exists

ObjectCreate(objRectName, OBJ_RECTANGLE, 0,Time,prevLowPrc,Time+rectValidity,prevLowPrc+rectHigh);

ObjectSet(objRectName, OBJPROP_COLOR, upRectColor);

ObjectSet(objRectName, OBJPROP_WIDTH, 0);

ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);

//--- put information to Array ---

arrayCurAmount = ArraySize(rectArray);

rectArray[arrayCurAmount] = StringConcatenate(objRectName,"$up$",Time,"$",prevClosePrc,"$0"); // 0=new, not yet touched

} // if

} // if

} // if

if ( (prev2EMA1>prev2EMA2)&&(prevEMA1<=prevEMA2)&&(curEMA1<curEMA2)&&(prevEMA2<=prevEMA3)&&(curEMA2<curEMA3) ) { // down

dnArrow = prevHighPrc + arrowDistance;

if (showRectangle == true) {

//----------------------- Draw Rectangle ----------------------

objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));

if (ObjectFind(objRectName) == -1) { // not exists

ObjectCreate(objRectName, OBJ_RECTANGLE, 0, Time,prevHighPrc,Time+rectValidity,prevHighPrc-rectHigh);

ObjectSet(objRectName, OBJPROP_COLOR, dnRectColor);

ObjectSet(objRectName, OBJPROP_WIDTH, 0);

ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);

//--- put information to Array ---

arrayCurAmount = ArraySize(rectArray);

rectArray[arrayCurAmount] = StringConcatenate(objRectName,"$dn$",Time,"$",prevClosePrc,"$0"); // 0=new, not yet touched

} // if

} // if

} // if

} // for

//----------------------- Edit Rectangle, change time2 & color, if price touched ----------------------

return(0);

} // start

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

void DelObjects(string id) {

int ot1=ObjectsTotal();

while(ot1>=0) {

if (StringFind(ObjectName(ot1),id,0)>-1) {

ObjectDelete(ObjectName(ot1));

}

ot1--;

}

return;

}

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

string FuncPeriodToStr(int thePeriod) {

switch(thePeriod) {

case 1: return("M1");

case 5: return("M5");

case 15: return("M15");

case 30: return("M30");

case 60: return("H1");

case 240: return("H4");

case 1440: return("D1");

case 10080: return("W1");

case 43200: return("MN1");

default: return("MN1");

}

}

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

@Mladen,

Você poderia me ajudar a dar uma pista sobre a edição do retângulo?

Eu encontrei isto :

*) Tipos de objetos - Documentação MQL4

*) Propriedades do objeto - Documentação MQL4

posso obter as propriedades retangulares (tempo1, preço1, tempo2, preço2, cor), depois comparar o preço1 ou preço2 com o preço atual de compra/venda. Se o preço Ask/Bid tocar o preço1 ou preço2, então deve fazer o seguinte :

a) Não preciso do Array, mas apenas olhar para cada objeto retângulo.

Apagar o objeto, criá-lo novamente usando o novo tempo2 e a nova cor.

b) Como conhecer a posição da vela no OBJPROP_PRICE1 ? Normalmente estamos usando laço "para" como

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

como podemos obter o "i" do bar que tem preço1 ?

c) Se eu não apagar e recriar o retângulo, posso simplesmente usar o ObjectSet para mudar o tempo2 e a cor do retângulo ?

Obrigado.

 
paradise77:
@Mladen,

Você poderia me ajudar a dar uma pista sobre a edição do retângulo?

Eu encontrei isto :

*) Tipos de objetos - Documentação MQL4

*) Propriedades do objeto - Documentação MQL4

posso obter as propriedades retangulares (tempo1, preço1, tempo2, preço2, cor), depois comparar o preço1 ou preço2 com o preço atual de compra/venda. Se o preço Ask/Bid tocar o preço1 ou preço2, então deve fazer o seguinte :

a) Não preciso do Array, mas apenas olhar para cada objeto retângulo.

Apagar o objeto, criá-lo novamente usando o novo tempo2 e a nova cor.

b) Como conhecer a posição da vela em OBJPROP_PRICE1 ? Normalmente estamos usando laço "para" como

como podemos obter o "i" do bar que tem preço1 ?

c) Se eu não apagar e recriar o retângulo, posso simplesmente usar o ObjectSet para mudar o tempo2 e a cor do retângulo ?

Obrigado.

No seu caso, seus preços estão OK. Você tem que usar o tempo para limitar as caixas da esquerda e da direita

 

Cosmiclifeform,

Obrigado por esta peça, na verdade eu usei instaforex demo. Eu fiz o download do arquivo de preços 1M como o método normal. Eu então faço a configuração, usando EURUSD, veja os screenshorts abaixo da guia do relatório e o log.

//relatórios, notando mas zerp, por quê?

cosmiclifeform:
Olá Mastercash,

Eu executei a EA em uma conta demo da FXDD...e não fiz nada de especial...apenas executei a EA no Testador de Estratégia com as configurações padrão.

Gostaria de poder ajudar mais...mas sem pistas específicas para rastrear (logs de erros, capturas de tela e outras condições) será impossível descobrir porque você está obtendo resultados em branco.

Tudo o que eu posso recomendar é...

Primeiro tente um bom EA no testador que você sabe que funciona bem.

Isto estabelecerá que tanto suas contas demo quanto seus procedimentos estão OK.

Tenha confiança em primeiro lugar de que tudo funciona da maneira que deve funcionar.

Em seguida, tente a sua Nice TraderEA... e escreva exatamente o que acontece. Mesmo uma tela em branco deve ter registros para verificar.

Tente adicionar declarações de IMPRESSÃO e COMENTÁRIOS em todos os lugares...depois verifique novamente seus logs...tanto a aba EA quanto a aba Journal...

Também seus COMMENT's aparecerão na tela...então você deve realmente ver sua EA funcionando ou não.

O resultado final em obter uma boa ajuda para a codificação...

é fornecer o máximo de pistas que você pode encontrar sobre o que está acontecendo com sua EA...

Continue tentando tudo o que for possível...e nos informe sobre os resultados.

Tome cuidado,

Robert
Arquivos anexados:
backtest1.png  14 kb
backtest2.png  3 kb
 
mladen:
No seu caso, seus preços estão OK. Você tem que usar o tempo para limitar as caixas da esquerda e da direita.

Obrigado mladen. Você quer dizer que eu devo usar o Time2 dinamicamente? Tempo1, preço1 & preço2 é fixo. Mas o Time2 depende da barra atual (i), e está em movimento, até que o preço toque o retângulo, ou seja mais do que o tempo padrão de ajuste do retângulo.

Em outras palavras, é impossível mudar a cor e o tempo2 de um retângulo ?

Obrigado

 
paradise77:
Obrigado mladen. Você quer dizer que eu devo usar o Time2 dinamicamente? Tempo1, preço1 & preço2 é fixo. Mas o Time2 depende da barra atual (i), e está em movimento, até que o preço toque o retângulo, ou seja mais do que o tempo padrão de ajuste do retângulo.

Em outras palavras, é impossível mudar a cor e o tempo2 de um retângulo ?

Obrigado

paraíso77

Sim, você deve

Assim você sempre ajustará a borda direita da caixa (se precisar de ajuste, é claro)

 

Olá Sr. Mladen e Mrtools.

Eu realmente não gosto de muitos alertas porque gosto muito de um sistema visual, então todo aquele barulho e janelas popup só me distraem. Eu só coloco alguns alertas da CCI quando sobrevendido ou comprado em excesso, é só isso.

Mas há um alerta que eu gostaria de ter, isto é, quando o 'meu' SSA + MA faz um cruzamento com o MA, seja para cima ou para baixo.

Outra coisa, eu sempre acrescento três níveis a esta adorável ferramenta; claro que a zerolina, 0,0, mas também -0,3 e 0,3.

Gostaria também de adquirir um alerta quando o SSA cruza o nível -0,3 e o nível 0,3. O nível 0,0 não é necessário.

Como alerta um simples som e popup, isso é tudo.

Obrigado!

Arquivos anexados:
ssa__ma.mq4  5 kb
 
Wulong10:
Olá Sr. Mladen e Mrtools.

Eu realmente não gosto de muitos alertas porque gosto muito de um sistema visual, então todo aquele barulho e janelas popup só me distraem. Eu só coloco alguns alertas da CCI quando sobrevendido ou comprado em excesso, é só isso.

Mas há um alerta que eu gostaria de ter, isto é, quando o 'meu' SSA + MA faz um cruzamento com o MA, seja para cima ou para baixo.

Outra coisa, eu sempre acrescento três níveis a esta adorável ferramenta; claro que a zerolina, 0,0, mas também -0,3 e 0,3.

Gostaria também de adquirir um alerta quando o SSA cruza o nível -0,3 e o nível 0,3. O nível 0,0 não é necessário.

Como alerta um simples som e popup, isso é tudo.

Obrigado!

Wulong10

O que acontece com a SSA é que se trata de um algoritmo de recalculo. Adicionar alertas a ele não é, pelo menos é minha opinião, sensato, pois sempre mudará o local das cruzes e, às vezes, as cruzes desaparecerão completamente. É melhor usá-lo em modo sem sinalização (apenas estimativa).

 

Olá, Mladen,

Eu sei que a SSA recalcula em prazos mais altos.

Quando o uso no M5, ele mudará um pouco, no M15 muito mais, mas no M1 testei muito isso e estou muito satisfeito com ele. Com minhas configurações ele realmente não se adapta muito, na verdade ele é muito preciso.

Claro que quando há um longo aumento ou uma longa queda do preço, não é muito confiável, mas não é assim com muitos indicadores?

Então você usa uma simples média móvel no gráfico para questões de segurança ...

Talvez qualquer outra pessoa não possa usar os alertas, mas eu posso.

Os alertas da CCI também nem sempre são corretos, mas é apenas uma indicação do que pode acontecer em seguida.

Portanto, se a SSA der um alerta, cabe a mim decidir o que fazer a respeito disso e estou ficando bom nisso.

Além disso, acho que não sou o único que gosta da SSA ...

Cruzamentos que desaparecem? Não muito frequentemente na M1 e tenho observado essa tabela há dias ...

Portanto, eu gostaria muito dos alertas, se possível.

Danke schön !

 
Wulong10:
Olá, Mladen,

Eu sei que a SSA recalcula em prazos mais altos.

Quando o uso no M5, ele mudará um pouco, no M15 muito mais, mas no M1 testei muito isso e estou muito satisfeito com ele. Com minhas configurações ele realmente não se adapta muito, na verdade ele é muito preciso.

Claro que quando há um longo aumento ou uma longa queda do preço, não é muito confiável, mas não é assim com muitos indicadores?

Então você usa uma simples média móvel no gráfico para questões de segurança ...

Talvez qualquer outra pessoa não possa usar os alertas, mas eu posso.

Os alertas da CCI também nem sempre são corretos, mas é apenas uma indicação do que pode acontecer em seguida.

Portanto, se a SSA der um alerta, cabe a mim decidir o que fazer a respeito disso e estou ficando bom nisso.

Além disso, acho que não sou o único que gosta da SSA ...

Cruzamentos que desaparecem? Não muito frequentemente na M1 e tenho observado essa tabela há dias ...

Portanto, eu gostaria muito dos alertas, se possível.

Danke schön !

Wulong10

A SSA sempre recalcula (acredite-me já que fui eu quem fez aquela dll para calculá-la). Não há exceção a esta regra (não importa em que período de tempo você a utilize).

Além disso, se o número de cálculos estiver definido para > 1, ele recalculará todas as barras. Se o número de cálculos for ajustado para 1, então pelo menos as barras "lag" serão recalculadas.

Razão: