Ajuda na codificação - página 238

 

Existe uma chance de adicionar opções para escolher?

Por exemplo,

Separadamente, compra e venda separadamente

Modificação: BE todos comprar 0, ou +1, ou +2 pips ou vender todos BE 0, 1 ou 2 pips?

É possível?

be.mq4

Arquivos anexados:
be.mq4  1 kb
 

Olá Mladen ,

Qualquer pessoa pode me dizer o que estou fazendo de errado, na maioria das vezes eu escrevo meu FX Gen com trechos e códigos usando exemplos do compilador mq4 e fóruns online.

vazio OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // Nenhum aberto.

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

se (OrderType() == OP_BUY || OrderType() == OP_SELL

&& Pergunte - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder();

}

}

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

retorno(lastTicket);

}

senão

Print("OrderSelect() error - ", ErrorDescription(GetLastError()));

}

Você pode dar uma olhada neste código, tentando apagar o pedido mais antigo primeiro usando data e bilhete de pedido, por exemplo, se o pedido aberto >2 apagar o pedido mais antigo.

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

// Etasoft Inc. // Etasoft Inc. // Etasoft Inc. Forex EA e Script Generator versão 4.1 EA

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

// Palavras-chave: MT4, construtor de EA Forex, criar EA, desenvolvedor consultor especialista

#direitos autorais "Copyright © 2011, Etasoft Inc.". Gerador de EA Forex v4.1"

#link de propriedade

#incluir

#incluir

// variáveis exportadas

ordem interna externaId = 1;

extern int Slippage = 2;

duplo Lotes externos = 0,01;

MaxOrdersAllowed = 2;// op compra e op venda permitidos

Grelha interna externa = 10; // distância total em pips para abrir pedidos

fio externo EAComment = "564 testes";

// variáveis locais

valor duplo PipValue=1; // esta variável está aqui para suportar corretores de 5 dígitos

bool Terminado = falso;

string LF = "\n"; // use isto em blocos personalizados ou utilitários onde você precisa de linhas de alimentação

int NDigits = 4; // usado principalmente para NormalizeDouble em blocos tipo Flex

int ObjCount = 0; // contagem de todos os objetos criados no gráfico, permite a criação de objetos com nomes únicos

corrente int = 0;

int init()

{

NDígitos = Dígitos;

se (falso) ObjetosDeleteAll(); // limpar o gráfico

Comentário(""); // limpar o gráfico

}

// Início especializado

int start()

{

se (Barras < 10)

{

Comentário ("Não há barras suficientes");

retornar (0);

}

se (Encerrado == verdadeiro)

{

Comentário ("EA Terminado");

retorno (0);

}

OnEveryTick1();

}

vazio OnEveryTick1()

{

se (verdadeiro == falso && falso) PipValue = 10;

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

IfOrderDoesNotExist2();

IfOrderDoesNotExist4();

MaximumOrder();

}

nulo seOrdemNãoExist2()

{

bool existe = falso;

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = verdadeiro;

}

}

senão

{

Print("OrderSelect() error - ", ErrorDescription(GetLastError()));

}

se (existe == falso)

{

BuyPendingOrder();

}

}

nulo seOrdemNãoExist4()

{

bool existe = falso;

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = verdadeiro;

}

}

senão

{

Print("OrderSelect() error - ", ErrorDescription(GetLastError()));

}

se (existe == falso)

{

SellPendingOrder();

}

}

BuyPendingOrder() nulo

{

int expira = TimeCurrent() + 60 * 0;

preço duplo = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point;

duplo SL = preço - 0*PipValor*Ponto;

se (0 == 0) SL = 0;

duplo TP = preço + 0*PipValor*Ponto;

se (0 == 0) TP = 0;

se (0 == 0) expirar = 0;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue);

se (bilhete == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()));

}

}

VENDEDORPENDENTE()

{

int expira = TimeCurrent() + 60 * 0;

preço duplo = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point;

duplo SL = preço + 0*PipValor*Ponto;

se (0 == 0) SL = 0;

duplo TP = preço - 0*PipValue*Ponto;

se (0 == 0) TP = 0;

se (0 == 0) expirar = 0;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red);

se (bilhete == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()));

}

}

nulo MaximumOrder()

{

se (MaxOrdersAllowed> 0)

{

OrderCount();

}

}

Contagem de pedidos nulos()

{

int count = 0;

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

se (OrderSymbol() == Symbol())

se (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

contar++;

}

}

senão

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()));

}

se (contar > MaxOrdersAllowed )

{

DeleteOldestOrder();

}

}

void DeleteOldestOrder()

{

data/hora últimaTempo = 0;

últimoTicket = -1; // Nenhum aberto.

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

se (OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}

}

}

retorno(lastTicket);

}

senão

Print("OrderSelect() error - ", ErrorDescription(GetLastError()));

}

int deinit()

{

se (falso) ObjetosDeleteAll();

}

 
sulaimoney:
Olá Mladen ,

Qualquer pessoa pode me dizer o que estou fazendo de errado, na maioria das vezes eu escrevo meu FX Gen com trechos e códigos usando exemplos do compilador mq4 e fóruns online.

vazio OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // Nenhum aberto.

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

se (OrderType() == OP_BUY || OrderType() == OP_SELL

&& Pergunte - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder();

}

}

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

retorno(lastTicket);

}

senão

Print("OrderSelect() error - ", ErrorDescription(GetLastError()));

}

Você pode dar uma olhada neste código, tentando apagar o pedido mais antigo primeiro usando data e bilhete de pedido, por exemplo, se o pedido aberto >2 apagar o pedido mais antigo.

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

// Etasoft Inc. // Etasoft Inc. // Etasoft Inc. Forex EA e Script Generator versão 4.1 EA

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

// Palavras-chave: MT4, construtor de EA Forex, criar EA, desenvolvedor consultor especialista

#direitos autorais "Copyright © 2011, Etasoft Inc.". Gerador de EA Forex v4.1"

#link de propriedade

#incluir

#incluir

// variáveis exportadas

ordem interna externaId = 1;

extern int Slippage = 2;

duplo Lotes externos = 0,01;

MaxOrdersAllowed = 2;// op compra e op venda permitidos

Grelha interna externa = 10; // distância total em pips para abrir pedidos

fio externo EAComment = "564 testes";

// variáveis locais

valor duplo PipValue=1; // esta variável está aqui para suportar corretores de 5 dígitos

bool Terminado = falso;

string LF = "\n"; // use isto em blocos personalizados ou utilitários onde você precisa de linhas de alimentação

int NDigits = 4; // usado principalmente para NormalizeDouble em blocos tipo Flex

int ObjCount = 0; // contagem de todos os objetos criados no gráfico, permite a criação de objetos com nomes únicos

corrente int = 0;

int init()

{

NDígitos = Dígitos;

se (falso) ObjetosDeleteAll(); // limpar o gráfico

Comentário(""); // limpar o gráfico

}

// Início especializado

int start()

{

se (Barras < 10)

{

Comentário ("Não há barras suficientes");

retornar (0);

}

se (Encerrado == verdadeiro)

{

Comentário ("EA Terminado");

retorno (0);

}

OnEveryTick1();

}

vazio OnEveryTick1()

{

se (verdadeiro == falso && falso) PipValue = 10;

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

IfOrderDoesNotExist2();

IfOrderDoesNotExist4();

MaximumOrder();

}

nulo seOrdemNãoExist2()

{

bool existe = falso;

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = verdadeiro;

}

}

senão

{

Print("OrderSelect() error - ", ErrorDescription(GetLastError()));

}

se (existe == falso)

{

BuyPendingOrder();

}

}

nulo seOrdemNãoExist4()

{

bool existe = falso;

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = verdadeiro;

}

}

senão

{

Print("OrderSelect() error - ", ErrorDescription(GetLastError()));

}

se (existe == falso)

{

SellPendingOrder();

}

}

BuyPendingOrder() nulo

{

int expira = TimeCurrent() + 60 * 0;

preço duplo = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point;

duplo SL = preço - 0*PipValor*Ponto;

se (0 == 0) SL = 0;

duplo TP = preço + 0*PipValor*Ponto;

se (0 == 0) TP = 0;

se (0 == 0) expirar = 0;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue);

se (bilhete == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()));

}

}

VENDEDORPENDENTE()

{

int expira = TimeCurrent() + 60 * 0;

preço duplo = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point;

duplo SL = preço + 0*PipValor*Ponto;

se (0 == 0) SL = 0;

duplo TP = preço - 0*PipValue*Ponto;

se (0 == 0) TP = 0;

se (0 == 0) expirar = 0;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red);

se (bilhete == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()));

}

}

nulo MaximumOrder()

{

se (MaxOrdersAllowed> 0)

{

OrderCount();

}

}

Contagem de pedidos nulos()

{

int count = 0;

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

se (OrderSymbol() == Symbol())

se (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

contar++;

}

}

senão

{

Print("OrderSend() error - ", ErrorDescription(GetLastError()));

}

se (contar > MaxOrdersAllowed )

{

DeleteOldestOrder();

}

}

void DeleteOldestOrder()

{

data/hora últimaTempo = 0;

últimoTicket = -1; // Nenhum aberto.

para (int i=OrdensTotal()-1; i >= 0; i--)

se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

se (OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}

}

}

retorno(lastTicket);

}

senão

Print("OrderSelect() error - ", ErrorDescription(GetLastError()));

}

int deinit()

{

se (falso) ObjetosDeleteAll();

}

Tente usar uma função como esta :

void DeleteOldestOrder()

{

datetime lastTime = Time[0]+Period()*60;

int lastTicket = -1; // None open.

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

{

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() <= lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

}

if (lastTicket>-1)

if (OrderSelect(lastTicket,SELECT_BY_TICKET,MODE_TRADES))

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}
 

Obrigado Mladen

funcionou sem falhas, btw peço desculpas por postar uma peça de código tão longa no fórum. Ainda estou me acostumando com a interface. Obrigado.

 

O indicador não se atualiza automaticamente.

Aqui eu tenho um indicador que é muito bem adequado para a minha negociação.

Infelizmente, ele não se atualiza por si só. Devo sempre atualizá-lo manualmente para que ele seja renovado.

Existe uma maneira de resolver este problema?

Seria muito útil!!

Obrigado de antemão.

P.S.: Anexei tudo o que tenho.

Arquivos anexados:
 

Ele quer a notificação sms. Como fica o código ?

 
popej30:
Ele quer a notificação sms. Como fica o código ?

popej30

Faça assim :

SendNotification("mensagem de notificação que você deseja enviar");

 

E onde você insere seu número de telefone ? Meu número 0039 555-23-45. Onde entrar ?

Exemplo:

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

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

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

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

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}
 
popej30:
E onde você insere seu número de telefone ? Meu número 0039 555-23-45. Onde entrar ?

Exemplo:

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

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

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

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

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}

Aqui está uma boa explicação de como você pode fazer isso :

 
Jim Clark:
O indicador não se atualiza automaticamente.

Aqui eu tenho um indicador que é muito bem adequado para a minha negociação.

Infelizmente, ele não se atualiza por si só. Devo sempre atualizá-lo manualmente para que ele seja renovado.

Existe uma maneira de resolver este problema?

Seria muito útil!!

Obrigado de antemão.

P.S.: Anexei tudo o que tenho.

Jim

Em vez de reescrever tudo isso, foi adicionado um limite para calcular as barras e então todas essas barras são recalculadas. Isso deve resolver o problema refrescante (os tomates mantêm o BarsTocalculate em algum valor razoável - não muito grande nem muito pequeno. Eu usei 1000 como padrão e parece estar tudo bem assim). Experimente-o

Arquivos anexados:
Razão: