Como codificar? - página 293

 
lincoln2012:
Estou tentando aprender o MQ4. Meu primeiro programa simples é suposto lançar um alerta quando 2 MAs se cruzam. Eu não consigo entender por que

este código não está funcionando.

Qualquer ajuda será realmente apreciada! Agradecemos antecipadamente.

Exterior int Período_MA1 = 5;

extern int Período_MA2 = 1;

duplo MA1;

duplo MA2;

int int init()

{

retorno(0);

}

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

int deinit()

{

retorno(0);

}

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

int start()

{

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

MA1=iMA(NULL,0,Period_MA1,0,MODE_SMA,PRICE_CLOSE,0);

MA2=iMA(NULL,0,Período_MA2,0,MODE_SMA,PRICE_CLOSE,0);

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

se (MA2 == MA1 )

Alerta("Preço é o mesmo(",Período_MA2,")");// Alerta

retornar;

}

Olá Lincoln2012,

Pode verificar o código desta Cruz Ma

Arquivos anexados:
macross-1.mq4  7 kb
 
lincoln2012:
Estou tentando aprender MQ4. Meu primeiro programa simples é suposto lançar um alerta quando 2 MAs se cruzam. Eu não consigo entender por que

este código não está funcionando.

}

A chave para codificar uma cruz de quaisquer 2 linhas indicadoras é este conceito:

1. Se a linha de barra atual1>linha2, e a linha de barra anterior1<linha2, então existe uma cruz para cima.

2. Se a linha de barras atual1 linha2, então há uma cruz para baixo.

 
mj10:
oi

bem, eu estava fazendo pouca programação no Mt4 sua diversão, mas não sou a favor apenas da simples edição do antigo indicador. Ok, eu quero fazer um indicador simples, mas não sei como fazê-lo.

seu indicador simples ele simplesmente verifica o valor se o valor de todas as variáveis são iguais ele desenha aquele ponto onde o valor de todas as variáveis combina.

minha solução simples

vamos supor que temos variáveis

duplo movimentoavg1;

double movingavg12;

double moveavg13;

double moveavg14;

double moveavg15;

double moveavg16;

double moveavg17;

double moveavg18;

double moveavg19;

double moveavg10;

double moveavgall;

declaramos a variável que estou apenas dando um exemplo que estou usando iStochastic(1), mas podemos usar para qualquer indicador.

movingavg12=iStochastic(1)

movavg13=iStochastic(2)

.

.

.

... e assim por diante

agora

if (movingavg12=movingavg13=movingavg14,....) (colocar valor na variável "movingavgall") //put o valor que é igual para vria

draw movavgall em barras

Aplicação

vamos supor que eu queira verificar onde a média móvel 3 e a média móvel 5 têm o mesmo valor

mesmo este indicador pode ser usado com RSI onde o valor RSI 1 e RSI 2 = 80

e muito mais

mesmo se adicionarmos o MTF que será adicionado bônus

parece simples por escrito, mas não fui capaz de encontrar a solução espero que alguém possa ajudar

espero que vocês entendam o que estou dizendo

obrigado

Uma vez que você tenha valores para comparar, você usaria um código semelhante ao seguinte.

A verificação de valores sendo iguais usos ==. Um único = é usado para atribuir um valor a uma variável.

A verificação de mais de 1 conjunto deve usar && para significar AND

movingavgall = 0;

se ((a == b) && (b == c) && (c == d)) movingavgall = a;

Você pode então verificar se a movingavgall tem um valor com

se (movingavgall != 0)

{

// fazer algo aqui

}

Faça uma busca por programação de metatrader usando o Google.

Você deve encontrar vários bons tutoriais para programação no MT4.

Um bom livro sobre programação em C também ajudará.

Robert Hill, também conhecido como MrPip

 

simplificar este código

Olá a todos!

Estou tentando semplificar este código usando o comando stringconcatenate a partir disto:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

a isto:

ObjectSetText("uitog1v", StringConcatenate("/\ ", uitog1v, "%","/\ ", uitog2v, "%","/\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Espero que alguém possa me ajudar.

Com os melhores cumprimentos

doc

trend_alexcud_v_2men.mq4

Arquivos anexados:
 

...

... Doc

Se você precisa de todos esses elementos, não há uma maneira mais simples de escrevê-lo

dr.house7:
Olá a todos!

Estou tentando semplificar este código usando o comando stringconcatenate a partir disto:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

a isto:

ObjectSetText("uitog1v", StringConcatenate("/\ ", uitog1v, "%","/\ ", uitog2v, "%","/\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Espero que alguém possa me ajudar.

Com os melhores cumprimentos

doc

trend_alexcud_v_2men.mq4
 

Como fazer: Alertar a cada 60 segundos

Como posso fazer algum código que, por exemplo, me dê um alerta a cada 60 segundos?

Eu criei este código abaixo, mas ele me dá um alerta a cada minuto a partir de quando o anexei ao gráfico e quero que ele siga o tempo do corretor para que ele me alerte, por exemplo, a cada 60 segundos.

#include

#include

// exported variables

// local variables

double PipValue=1; // this variable is here to support 5-digit brokers

bool Terminated = false;

string LF = "\n"; // use this in custom or utility blocks where you need line feeds

int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks

int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names

int ExpectedTime2 = 0;

int init()

{

NDigits = Digits;

ObjectsDeleteAll(); // clear the chart

Comment(""); // clear the chart

}

// Expert start

int start()

{

if (Bars < 10)

{

Comment("Not enough bars");

return (0);

}

if (Terminated == true)

{

Comment("EA Terminated.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && true) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

OncePerMinutes2();

}

void OncePerMinutes2()

{

int datetime800 = TimeLocal();

if (ExpectedTime2 == 0 || datetime800 > ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1; // reset paused time

}

if (datetime800 >= ExpectedTime2 && datetime800 < ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1;

Alert3();

}

}

void Alert3()

{

Alert("One minute gone");

}

int deinit()

{

if (true) ObjectsDeleteAll();

}

 
mladen:
DocSe você precisa de todos esses elementos, não há uma maneira mais simples de escrevê-lo

Uhm, má sorte desta vez, obrigado de qualquer forma.

Com os melhores cumprimentos

doc

 

Há um problema com a segunda chamada StringConcatenate.

Você está somando 3 nomes de fontes diferentes e não haverá um nome válido resultante.

Robert

dr.house7:
Olá a todos!

Estou tentando semplificar este código usando o comando stringconcatenate a partir disto:

ObjectSetText("uitog1v", StringConcatenate("/\\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

a isto:

ObjectSetText("uitog1v", StringConcatenate("/\ ", uitog1v, "%","/\ ", uitog2v, "%","/\ ", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Espero que alguém possa me ajudar.

Com os melhores cumprimentos

doc

trend_alexcud_v_2men.mq4
 

Necessidade de ajuda com a EA ... negócios não sendo fechados no testador

Estou trabalhando em um EA, mas não importa o que eu faça, não posso fazer negócios fechados. Ela as abre muito bem, mas quando as quero fechadas, a EA não as fecha.

Vou postar parte do meu código EA para que talvez um de vocês programadores experientes possa descobrir porque estou tendo este problema. As vars 'buyTrade' e 'sellTrade' são globais para toda a EA.

NOTA: Eu quero apenas UM comércio aberto a qualquer momento, seja longo ou curto. As negociações estão "sempre dentro", então quando um sinal longo chega, a curta existente deve ser fechada e vice-versa.

NÃO está fazendo isso. O que ele está fazendo é abrir negócios e depois abrir mais tordos ... e abrir mais ... e mantê-los abertos até que todos eles acabem batendo em suas paradas.

Obrigado de antemão.

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
 

...

Como esse é um código parcial: tente substituir symBid por symAsk no fechamento da venda e symAsk por symBid no fechamento da ordem de compra (inverta os preços de fechamento, você não pode fechar uma venda por lance e não pode fechar uma compra por preço de venda)

outofdebt:
Estou trabalhando em um EA, mas não importa o que eu faça, não posso fazer negócios fechados. Ela as abre muito bem, mas quando as quero fechadas, a EA não as fecha.

Vou postar parte do meu código EA para que talvez um de vocês programadores experientes possa descobrir porque estou tendo este problema. As vars 'buyTrade' e 'sellTrade' são globais para toda a EA.

NOTA: Eu quero apenas UM comércio aberto a qualquer momento, seja longo ou curto. As negociações estão "sempre dentro", portanto, quando um sinal longo chega, a curta existente deve ser fechada e vice-versa.

NÃO está fazendo isso. O que ele está fazendo é abrir negócios e depois abrir mais tordos ... e abrir mais ... e mantê-los abertos até que todos eles acabem batendo em suas paradas.

Obrigado de antemão.

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);