Como codificar? - página 296

 

É possível adicionar cor, estilo e peso às linhas indicadoras de nível?

Hi,

Estou pensando se alguém poderia me dizer se é possível adicionar cor, estilo e peso às linhas indicadoras de nível?

Como iniciante, gostaria de especificar tanto o estilo quanto a cor para os níveis de RSI e estou me perguntando se alguém pode fazer isso adicionando mais código, por exemplo, à linha: #property indicator_level1 70 ?

Se possível, eu gostaria muito que alguém pudesse me mostrar.

Obrigado,

Laurus

 

...

Sim, você pode

Utilize as seguintes propriedades:

#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:
Hi,

Estou pensando se alguém poderia me dizer se é possível adicionar cor, estilo e peso às linhas indicadoras de nível?

Como iniciante, gostaria de especificar tanto o estilo quanto a cor para os níveis de RSI e estou me perguntando se alguém pode fazer isso adicionando mais código, por exemplo, à linha: #property indicator_level1 70 ?

Se possível, eu gostaria muito que alguém pudesse me mostrar.

Obrigado,

Laurus
 

Obrigado por sua resposta Mladen, sua ajuda é sempre muito apreciada.

O que você escreveu é exatamente o que eu temia. Quando se trata de parte das funções, ainda está sobre minha cabeça.

Se você der uma olhada na foto, você vê como eu gostaria que fosse. Como compromisso, tenho usado linhas horizontais regulares, mas como traço linhas de tendência com o próprio indicador, não é uma boa solução.

Obrigado,

Laurus

Arquivos anexados:
 

...

Olhando para sua foto, parece que é a única solução que você pode aplicar (usando objetos). O uso de buffers de desenho simplesmente drenaria seus buffers de desenho e você não poderia desenhar todos os valores que você está usando naquele indicador. Às vezes ainda estamos "pagando" pela decisão dos metatraders 4 de ter apenas 8 buffers de desenho

Laurus12:
Obrigado por sua resposta Mladen, sua ajuda é sempre muito apreciada.

O que você escreveu é exatamente do que eu tinha medo. Quando se trata de parte das funções, isso ainda está sobre minha cabeça.

Se você der uma olhada na foto, você vê como eu gostaria que fosse. Como compromisso, tenho usado linhas horizontais regulares, mas como traço linhas de tendência com o próprio indicador, não é uma boa solução.

Obrigado,

Laurus
 

DLL externa retorna resultados estranhos

Hi!

Abaixo está um exemplo muito simples de uma chamada para uma DLL externa. O diário diário deve mostrar números crescentes a partir de 0 quando usado com o testador de estratégia.

Entretanto, o resultado é bastante estranho. A primeira linha no diário mostra um grande número (ou seja, 18472) e depois aumenta corretamente por um tempo até começar a saltar cerca de 10, às vezes mais de 100, passos de uma só vez.

Alguém poderia me explicar a razão disto e como corrigi-lo?

Obrigado!

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

}
 

problema de código interessante para indicador

Oi, pessoal,

Estou tentando aprender programação MT4, e neste preciso momento estou desenvolvendo um indicador de detecção PinBar, que me diz para comprar ou bem. Desenvolvi este indicador especialmente para o gráfico de 4 horas, por causa das regras especiais de compra ou venda. A regra para as detecções é a seguinte:

Corpo da vela <= 35% do comprimento da vela.

Pelo menos 1 pavio de vela >= 50 % do comprimento da vela.

Até agora, não tenho problemas em detectar essas barras com o indicador.

Entretanto, a próxima regra me diz para comprar ou vender.

Faço zoom para o gráfico de 1 hora e olho para as 4 barras que criaram a barra de pinos no gráfico de 4 horas.

Usei a função iClose para captar o valor do fechamento da primeira e última barra dessa formação na barra de 1 hora.

Entretanto... como programado agora, sempre olho para a primeira e última vela no próprio gráfico de 1 hora. E isso não está bem. Tem que ser a primeira e a última barra da formação e não do gráfico.

Aqui está o código que eu tenho agora com as funções iClose erradas nele.

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

}

Ainda não consegui fixar as velas de 1 hora certas no fundo daquela vela de 4 horas em particular.

Alguém está lá fora que pode me dar a resposta para o meu problema?

consertou-o:

data/hora H4BarTime;

int H1BarNumber;

H4BarTime = Tempo;

H1BarNumber = iBarShift(NULL, PERÍODO_H1, H4BarTime);

tx muito!

Jacob

 
mladen:
Olhando para sua foto, parece que é a única solução que você pode aplicar (usando objetos). O uso de buffers de desenho simplesmente drenaria seus buffers de desenho e você não poderia desenhar todos os valores que você está usando naquele indicador. Às vezes ainda estamos "pagando" pela decisão dos metatraders 4 de ter apenas 8 buffers de desenho

Desculpe por minha resposta tardia Mladen e obrigado por esclarecer o assunto. Com relação ao que você escreveu, pelo menos agora eu tenho certeza.

Obrigado,

Laurus

 

Ajuda com os critérios de entrada

Oi, pessoal,

Estou tentando fazer um critério de entrada usando MA. Meu critério de entrada é simples, quero entrar numa longa negociação quando o MA Rápido atravessa o MA Lento para cima na vela de fechamento em vez da vela atual e do verso do vício.

Minha situação atual é que meu EA desencadeará uma longa negociação quando o MA Rápido cruzar o MA Lento para cima e o verso do vice, no entanto essa vela ainda não fechou, e às vezes quando a vela fecha, o MA final pode não cruzar para cima assim, eu não deveria ter desencadeado essa negociação em particular, e ainda assim o sistema a desencadeou porque cruzou para cima uma vez e para trás. Isto é o mesmo para os comércios curtos

Já faz alguns dias que estou fazendo isso sem nenhum progresso. Alguém pode lançar alguma luz sobre como eu faço isso? Obrigado.

//--- parâmetros de entrada

duplo TakeProfit externo=2700.0;

duplo externo Lots=0,1;

duplo StopLoss externo=2500.0;

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

//| função de iniciação de especialista |

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

int init()

{

//----

//----

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit()

{

//----

//----

retorno(0);

}

int Crossed (linha dupla1 , linha dupla2)

{

estática int última_direção = 0;

ção_de_corrente int estática = 0;

if(line1>line2)current_dirction = 1; //up

if(line1<line2)current_dirction = 2; //down

if(current_dirction != last_direction) //change

{

última_direção = direção_corrente_dirção;

retorno (última_direção);

}

senão

{

retorno (0);

}

}

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

//| função de início especializado |

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

int start()

{

//----

int cnt, bilhete, total;

duplo curtoEma, longoEma;

if(Bars<100)

{

Impressão ("barras com menos de 100");

retornar(0);

}

if(TakeProfit<10)

{

Imprimir ("TakeProfit menos de 10");

retornar(0); // verificar 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);

total = OrdensTotal();

if(total < 1)

{

if(isCrossed == 1)

{

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

"Minha EA",12345,0,Verde);

if(bilhete>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Imprimir("Pedido aberto : ",OrderOpenPrice());

}

else Print("Erro na abertura do pedido de compra : ",GetLastError());

retornar(0);

}

if(isCrossed == 2)

{

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

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

if(bilhete>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Imprimir("Pedido de venda aberto : ",OrderOpenPrice());

}

else Print("Erro na abertura do pedido de VENDA : ",GetLastError());

retornar(0);

}

retorno(0);

}

retorno(0);

}

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

Obrigado e cumprimentos

Terrance

 

...

... Terrance

Tente mudar estas linhas :

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;

}

Dessa forma, você nem precisa da função cruzada e ela verificará se há cruzes em uma barra fechada.

tkuan77:
Oi, pessoal,

Estou tentando fazer um critério de entrada usando MA. Meu critério de entrada é simples, eu quero entrar numa longa negociação quando o MA rápido cruza MA lento para cima na vela de fechamento em vez do verso atual da vela e do vício.

Minha situação atual é que meu EA desencadeará uma longa negociação quando o MA Rápido cruzar o MA Lento para cima e o verso do vice, no entanto essa vela ainda não fechou, e às vezes quando a vela fecha, o MA final pode não cruzar para cima assim, eu não deveria ter desencadeado essa negociação em particular, e ainda assim o sistema a desencadeou porque cruzou para cima uma vez e para trás. Isto é o mesmo para os comércios curtos

Já faz alguns dias que estou fazendo isso sem nenhum progresso. Alguém pode lançar alguma luz sobre como eu faço isso? Obrigado.

//--- parâmetros de entrada

duplo TakeProfit externo=2700.0;

duplo externo Lots=0,1;

duplo StopLoss externo=2500.0;

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

//| função de iniciação de especialista |

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

int init()

{

//----

//----

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit()

{

//----

//----

retorno(0);

}

int Crossed (linha dupla1 , linha dupla2)

{

estática int última_direção = 0;

ção_de_corrente int estática = 0;

if(line1>line2)current_dirction = 1; //up

if(line1<line2)current_dirction = 2; //down

if(current_dirction != last_direction) //change

{

última_direção = direção_corrente_dirção;

retorno (última_direção);

}

senão

{

retorno (0);

}

}

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

//| função de início especializado |

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

int start()

{

//----

int cnt, bilhete, total;

duplo curtoEma, longoEma;

if(Bars<100)

{

Impressão ("barras com menos de 100");

retornar(0);

}

if(TakeProfit<10)

{

Imprimir ("TakeProfit menos de 10");

retornar(0); // verificar 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);

total = OrdensTotal();

if(total < 1)

{

if(isCrossed == 1)

{

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

"Minha EA",12345,0,Verde);

if(bilhete>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Imprimir("Pedido aberto : ",OrderOpenPrice());

}

else Print("Erro na abertura do pedido de compra : ",GetLastError());

retornar(0);

}

if(isCrossed == 2)

{

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

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

if(bilhete>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Imprimir("Pedido de venda aberto : ",OrderOpenPrice());

}

else Print("Erro na abertura do pedido de VENDA : ",GetLastError());

retornar(0);

}

retorno(0);

}

retorno(0);

}

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

Obrigado e cumprimentos

Terrance
 
mladen:
Terrance

Tente mudar estas linhas :

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;

}

Dessa forma, você não precisa nem mesmo da função cruzada e ela verificará a existência de cruzes em um bar fechado.

Oi Mladen, eu experimentei o que você me disse e isso funciona maravilhosamente. Entretanto, não entendo bem a lógica por trás dos códigos. por que você define a mudança do iMA para 1 e 2 e por que você codifica isto: (dif1*diff2)<0) também? Desculpe, mas no momento ainda estou na frase de aprendizagem.

Obrigado e cumprimentos

Terrance