O código foi escrito 600 pré-construído. Não é possível usar pontos em nomes variáveis desde fevereiro de 2014. Basta substituir por sublinhados.
Aqui está um exemplo de código independente de direção
double DIR, OOP, OCP, ISL; int OP;
if( Bid > High[1]){
DIR = +1; OOP = Ask; OCP = Bid; OP = OP_BUY;
}
elseif(Bid < Low[1]){
DIR = -1; OOP = Bid; OCP = Ask; OP = OP_BUY;
}
elsereturn;
ISL = OCP -DIR* pips_to_change( extISL_Pips );
... OrderSend(...);
Basta trocar Ask/Bid por preços de abertura/fecho e escrever tudo o resto como se fosse uma compra: A ISL está abaixo da OCP (OCP - ISL) e o -DIR* muda o sinal para uma venda. Se você precisar de uma comparação (A > B) use (A - B) *DIR> 0 para reverter a comparação para uma venda.
Modifique e poste seu código e eu ou outra pessoa comentaremos sobre ele.
Ei GumRai,
Já faz um tempo desde que coloquei aqui uma atualização, mas tenho trabalhado fora no código e finalmente o terminei - doloroso ao trabalhar 10 horas por dia. No entanto, tenho duas questões principais. 1) Não importa o que eu faça, ele gera um código de erro: "Unknown ticket XYZ for OrderCloseFunction" e 2) Eu fiz um save-as do arquivo, (chamado USDCAD, outro EURUSD), com números mágicos diferentes, etc., mas ainda assim é preciso apenas uma troca de cada vez - e não trata os pares independentemente. Na verdade, ele também cria um erro "bilhete inválido para OrderCloseFunction".
Tentei pesquisar isto no Google, mas sem sucesso. Gostaria muito se você pudesse me guiar na direção certa com isto. O que estou fazendo de errado?
#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property strict//part with the extern int stating the terms of the MA removed to reduce space.int MagicNumber = 1234;
int MagicNumber2 = 2345;
double Pips;
int BuyTicket;
int SellTicket;
int CloseTicket;
int CloseSellTicket;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---double Ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
if (Ticksize == 0.00001 || Ticksize == 0.001)
Pips = Ticksize*10;
else Pips = Ticksize;
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+int start()
{
//---staticdatetime bar_time=0;
if(bar_time!=Time[0])
{
bar_time=Time[0];
double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
double PreviousPriceClose=iClose(NULL,0,1);
double PreviousPriceClose2=iClose(NULL,0,2);
if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
{
if(OrdersTotal()==0)
BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
}
elsefor(int i = OrdersTotal()-1; i >= 0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(iClose(NULL, 0,0)<PreviousSlow)
{
CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
}
}
if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
{
if(OrdersTotal()==0)
SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
}
elsefor(i = OrdersTotal()-1; i >= 0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(iClose(NULL, 0,1)>PreviousSlow)
{
CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
}
}
}
return(0);
return(0);
}
//--------------
Isso significa que se uma negociação foi aberta manualmente ou por outra EA ou pela mesma EA anexada a outro símbolo gráfico, somente 1 negociação pode ser aberta.
Você tem a variável Global BuyTicket, inicialize-a para -1
Agora, ao usar variáveis declaradas globalmente para números de bilhetes, pode haver problemas se o terminal for desligado e reiniciado por algum motivo
Portanto, declare uma nova variável de escopo global
bool Recovery=true;
if(Recovery)
{
//loop through open orders and check for magic number, symbol and type//if you find a buy order with the magic number and symbol
BuyTicket=OrderTicket();
//if you find a sell order with the magic number and symbol
SellTicket=OrderTicket();
Recovery=false;
}
Eu digitei isto rapidamente, então posso ter cometido erros, mas é o suficiente para lhe dar a idéia
A razão pela qual eu tinha colocado o laço ali foi porque o que eu notei foi que quando fechava a venda, não acionava a compra por algum motivo.
Fui em frente e fiz as mudanças necessárias...mas algo ainda parece estar errado. Não está demorando muito agora, e gera código de erro de bilhete inválido, e erro OrderClose 4051. Alguma sugestão sobre o que ainda está errado aqui?
O estranho é que, tanto no código anterior, como no atual (apenas para a venda), levou as negociações razoavelmente bem (se eu apenas a implementei em um gráfico).
Eu não pensei que isto teria sido tão difícil haha! Suponho que estava enganado quando pensei que era uma coisa muito simples e direta... comprar quando a vela cruza e abre acima de MA, fechar e vender quando a vela cruza e vai abaixo de MA.
Sinto muito, mas realmente não sei o que você está tentando fazer.
Não seleciona nenhum pedido. O código sequer é compilado?
Aqui o outro se aplica se(OrderCloseTime()==0) for falso
Aqui se aplica se a OrderSelect falhar, o que certamente faz
Desculpe, a culpa é toda minha. Eu não li/aplicar corretamente suas sugestões; muito obrigado por indicá-las. Eu fiz isso corretamente aqui. Nenhum erro foi gerado no relatório. A única coisa é que agora, às vezes, está inserindo várias ordens de compra e venda, o que impede o fechamento de negócios no momento certo.
Editar: Para ser mais preciso, só se sai no SL e TP, não quando o preço cruza o outro lado do MA. Isto tem algo a ver com o bool?
GumRai: Isto não seleciona uma profissão, por favor, siga o exemplo que lhe dei e faça-o corretamente
Eu me sinto... realmente estúpido. rs. Obrigado por achar isso!!
1) Faltam duas coisas...agora cria um código de erro de OrderClose 4108. Devo postar o código de novo? É o mesmo que o anterior com a correção que você havia declarado. Mas ele entra e sai conforme as regras.
2) E não entra curto imediatamente assim que fecha a posição longa, como mostrado na figura. A seta verde para baixo mostra onde ela deveria ter entrado em posição curta. Ela pegou uma compra, e a fechou com prejuízo uma vez que fechou abaixo do MA amarelo. Aqui, deveria ter entrado em posição curta. Como eu posso fazer um loop disto?
Muito obrigado, GumRai. Honestamente, eu não teria chegado a lugar nenhum tão perto sem sua ajuda.
Pequena mudança, pois estava verificando o fechamento de um pedido quando não havia nenhum.
De acordo com o código, não há motivo para que uma venda seja aberta imediatamente, uma compra é fechada.
A condição para sair de uma compra não é a mesma que as condições para abrir uma venda .
Lembre-se que como você só está verificando na vela aberta, Fechar[0] será o valor da oferta do primeiro tick recebido para a vela.
Santo! Você conseguiu! Obrigado mais uma vez e mais uma vez GumRai. Você é o melhor.
Não posso fazer o teste agora, mas uma vez que os mercados estejam abertos, acho que devo ser capaz de usar isto então, com os outros pares, desde que eu tenha magias diferentes na demonstração.
Se você precisar de uma comparação (A > B) use (A - B) *DIR> 0 para reverter a comparação para uma venda.
Parece que você tem a idéia.
Modifique e poste seu código e eu ou outra pessoa comentaremos sobre ele.
Ei GumRai,
Já faz um tempo desde que coloquei aqui uma atualização, mas tenho trabalhado fora no código e finalmente o terminei - doloroso ao trabalhar 10 horas por dia. No entanto, tenho duas questões principais. 1) Não importa o que eu faça, ele gera um código de erro: "Unknown ticket XYZ for OrderCloseFunction" e 2) Eu fiz um save-as do arquivo, (chamado USDCAD, outro EURUSD), com números mágicos diferentes, etc., mas ainda assim é preciso apenas uma troca de cada vez - e não trata os pares independentemente. Na verdade, ele também cria um erro "bilhete inválido para OrderCloseFunction".
Tentei pesquisar isto no Google, mas sem sucesso. Gostaria muito se você pudesse me guiar na direção certa com isto. O que estou fazendo de errado?
Muito obrigado de antemão!
Nunca use OrderTotal()==0 como condição para entrar em negociações
Isso significa que se uma negociação foi aberta manualmente ou por outra EA ou pela mesma EA anexada a outro símbolo gráfico, somente 1 negociação pode ser aberta.
Você tem a variável Global BuyTicket, inicialize-a para -1
Não faça loop através dos pedidos antes de fechar, é desnecessário
Agora, ao usar variáveis declaradas globalmente para números de bilhetes, pode haver problemas se o terminal for desligado e reiniciado por algum motivo
Portanto, declare uma nova variável de escopo global
Eu digitei isto rapidamente, então posso ter cometido erros, mas é o suficiente para lhe dar a idéia
A razão pela qual eu tinha colocado o laço ali foi porque o que eu notei foi que quando fechava a venda, não acionava a compra por algum motivo.
Fui em frente e fiz as mudanças necessárias...mas algo ainda parece estar errado. Não está demorando muito agora, e gera código de erro de bilhete inválido, e erro OrderClose 4051. Alguma sugestão sobre o que ainda está errado aqui?
O estranho é que, tanto no código anterior, como no atual (apenas para a venda), levou as negociações razoavelmente bem (se eu apenas a implementei em um gráfico).
Eu não pensei que isto teria sido tão difícil haha! Suponho que estava enganado quando pensei que era uma coisa muito simples e direta... comprar quando a vela cruza e abre acima de MA, fechar e vender quando a vela cruza e vai abaixo de MA.
Sinto muito, mas realmente não sei o que você está tentando fazer.
Não seleciona nenhum pedido. O código sequer é compilado?
Aqui o outro se aplica se(OrderCloseTime()==0) for falso
Aqui se aplica se a OrderSelect falhar, o que certamente faz
Sinto muito, mas realmente não sei o que você está tentando fazer.
Não seleciona nenhum pedido. O código sequer é compilado?
Aqui o outro se aplica se(OrderCloseTime()==0) for falso
Aqui se aplica se a OrderSelect falhar, o que certamente faz
Desculpe, a culpa é toda minha. Eu não li/aplicar corretamente suas sugestões; muito obrigado por indicá-las. Eu fiz isso corretamente aqui. Nenhum erro foi gerado no relatório. A única coisa é que agora, às vezes, está inserindo várias ordens de compra e venda, o que impede o fechamento de negócios no momento certo.
Editar: Para ser mais preciso, só se sai no SL e TP, não quando o preço cruza o outro lado do MA. Isto tem algo a ver com o bool?
Isto não seleciona uma profissão, por favor, siga o exemplo que lhe dei e faça-o corretamente
Eu me sinto... realmente estúpido. rs. Obrigado por achar isso!!
1) Faltam duas coisas...agora cria um código de erro de OrderClose 4108. Devo postar o código de novo? É o mesmo que o anterior com a correção que você havia declarado. Mas ele entra e sai conforme as regras.
2) E não entra curto imediatamente assim que fecha a posição longa, como mostrado na figura. A seta verde para baixo mostra onde ela deveria ter entrado em posição curta. Ela pegou uma compra, e a fechou com prejuízo uma vez que fechou abaixo do MA amarelo. Aqui, deveria ter entrado em posição curta. Como eu posso fazer um loop disto?
Muito obrigado, GumRai. Honestamente, eu não teria chegado a lugar nenhum tão perto sem sua ajuda.
Pequena mudança, pois estava verificando o fechamento de um pedido quando não havia nenhum.
De acordo com o código, não há motivo para que uma venda seja aberta imediatamente, uma compra é fechada.
A condição para sair de uma compra não é a mesma que as condições para abrir uma venda .
Lembre-se que como você só está verificando na vela aberta, Fechar[0] será o valor da oferta do primeiro tick recebido para a vela.
Pequena mudança, pois estava verificando o fechamento de um pedido quando não havia nenhum.
De acordo com o código, não há motivo para que uma venda seja aberta imediatamente, uma compra é fechada.
A condição para sair de uma compra não é a mesma que as condições para abrir uma venda .
Lembre-se que como você só está verificando na vela aberta, Fechar[0] será o valor da oferta do primeiro tick recebido para a vela.
Santo! Você conseguiu! Obrigado mais uma vez e mais uma vez GumRai. Você é o melhor.
Não posso fazer o teste agora, mas uma vez que os mercados estejam abertos, acho que devo ser capaz de usar isto então, com os outros pares, desde que eu tenha magias diferentes na demonstração.