-----------------------------------------------------------------+ //| Opening and Closeing.mq4 | //| Copyright © 2010, Ben banta | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Ben banta" //+------------------------------------------------------+ //| Closing My Way | //+------------------------------------------------------+ double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if ( OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol() // with my symbol ) { if(OrderType() == OP_SELL) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() + (ATR*2)) // ATR*2 above Sell. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Blue); Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2)) //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderTicket() == OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),3,Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2)) }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc }// END for loop //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0) return(0); }//ENDif (Ask > High[iHighest(NU... etc //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); }//ENDif (ticket>0) else Print ("Error Opening Sell Order :" ,GetLastError()); //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) return(0); }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) return(0); }//ENDif (OrdersTotal() < 1) }//ENDint start()Deve tornar os blocos de código mais fáceis de ler
if(OrderTicket() == OrderOpenPrice() - (ATR*2))Obilhete de pedido é um inteiro muito grande (provavelmente nos bilhões), a chave do pedido.
OOP - 2ATR é um preço.
Os dois NUNCA serão iguais
se você quis dizer OrderClosePrice() == OOP-2ATR números reais quase nunca se compararão iguais. use em seu lugar:
if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...
OrderSelect(index, SELECT_BY_TICKET) // existing orders && OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()Seu pedidoSendereço não está definindo um número mágico
Saúde
O bilhete de pedido é um inteiro muito grande (provavelmente nos bilhões), a chave do pedido.
OOP - 2ATR é um preço.
Os dois NUNCA serão iguais
se você quis dizer OrderClosePrice() == OOP-2ATR números reais quase nunca se compararão iguais. use em seu lugar:
Seu pedidoSend não está definindo um número mágico
Obrigado por procurar e dar as sugestões. Mas devo dizer que não entendi imediatamente o OOP -2ATR.
OOP = OrderOpenPrice. Isso passou por cima da minha cabeça no início. Sua explanação é absolutamente correta. Eu fui pego pelo sinal ==. O OrderClosePrice() pode nunca ser igual a OrderOpenPrice() menos o (ATR*2). Obrigado por ter pegado isso.
Deixe-me ver se entendi sua sugestão. Vou reafirmá-la aqui. if(OrderClosePrice()-OOP()-ATR*2 <= 0)
Isto parece ler-se (usarei aqui figuras arborizadas) OCP = 1,4361, OOP = 1,4321, ATR = 20. Assim, a expressão pareceria:
se (1.4321 - 1.4361 - (20*2) <= 0), sinto muito, mas não entendo.
Talvez eu possa usar os mesmos números para reordenar a expressão, para mostrar o que eu quis dizer. Mas isto também não funcionou quando eu os introduzi no programa.
O novo arranjo se parece com isto.
if (1.4361 >= 1.4321 + (20*2)).
Onde o OCP >=OOP + ATR*2, o controle passa para:
OrderClose (OrderTicket(), OrderLots(), etc.
Sua outra observação foi que o OrderSend não está definindo um número mágico.
Eu poderia simplesmente retirar esta parte do programa: && OrderMagicNumber == MagicNumber,
Mais uma vez obrigado, e se você puder ver outras melhorias, eu gostaria de aprender.
Abraço
OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 0 ) ;
Obrigado por sua resposta. Espero que você esteja indo bem.
A sugestão foi inserida esta manhã. Lamento dizer que o compilador não gosta do que eu codifiquei. Não tenho certeza de qual afirmação no programa está incorreta. As sugestões que eu acredito que estão bem. Eu vou reposicionar o programa e sinalizar a área que eu acredito que talvez seja o problema. Também vou declarar a estratégia para o fechamento.
A posição de venda será interrompida acima do preço de abertura do pedido pela Atr*2. Tal como, OOP é 1,4321, Atr =20, e OCP = 1,4361.
Portanto, codifiquei a expressão como,
if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) // condição é cumprida, o controle passa para....
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;
Nota: Não há StopLoss(), ou TakeProfit() na declaração OrderSend, se isso tiver alguma relevância.
Mais uma vez, obrigado por toda ajuda
Abraço
double ATR; double Slippage = 3; double StopLoss_Buy; double StopLoss_Sell; double Lots=0.4; double MagicNumber; int ticket; int order; //----------------- Closing Sell --------------- int start() { for(int index = OrdersTotal() -1; index >= 0; index--) { if (OrderSelect(index, SELECT_BY_TICKET) // existing orders //&& OrderMagicNumber() == MagicNumber // with my MN && OrderSymbol() == Symbol()) // with my symbol { if(OrderType() == OP_SELL) order = OrderTicket(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met, // control then passes to... { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Print("Sell order closed with Hard Stop"); } else { Print("Error closing Sell Hard Stop", GetLastError()); } //---------- Closeing Buy ------------- if(OrderType() == OP_BUY) order = OrderTicket(); if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2)) // ATR*2 below Buy. Hard Stop { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); Print("Buy order closed with Hard Stop"); } else { Print("Error closing Buy Hard Stop", GetLastError()); return(0); } } } //------------ Opening Buy ----------------- if(OrdersTotal() < 1) // Checking for any working orders { if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)]) // When this condition is true, // with no working orders { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue); // Buy! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Buy Order :" , GetLastError()); return(0); } //--------------- Opening Sell ---------------- if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)]) //When this condition is true, //with no working orders { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red); //Sell! Useing these parameters if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice()); } else Print ("Error Opening Sell Order :" ,GetLastError()); return(0); } return(0); } }
Olá Huckleberry,
Vou reformular ligeiramente o seu programa.
Tchau por enquanto
Por que fazer "order = OrderTicket();" e não usar este valor na função orderclose()?
Embora a chance da ordem selecionada ter mudado seja pequena, não seria mais seguro usar o valor da ordem positivamente identificado?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() será o bilhete atualmente selecionado - nesta etapa do meu aprendizado
Eu não posso dizer qual é o bilhete de pedido selecionado quando você faz o OrderClose().
//// Editar
Na verdade, não tenho certeza se "Order= OrderTicket()" é o bilhete que você identificou no Se Statment precedente.
Por que fazer "order = OrderTicket();" e não usar este valor na função orderclose()?
Embora a chance da ordem selecionada ter mudado seja pequena, não seria mais seguro usar o valor da ordem positivamente identificado?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() será o bilhete atualmente selecionado - nesta etapa do meu aprendizado
Eu não posso dizer qual é o bilhete de pedido selecionado quando você faz o OrderClose().
//// Editar
Na verdade, não tenho certeza se "Order= OrderTicket()" é o bilhete que você identificou no Se Statment precedente.
Obrigado por sua observação e sugestão. Seu tempo é valioso.
Seu raciocínio faz todo o sentido. Não estou mais certo como você no que diz respeito à ordem selecionada. Vou tentar a sua sugestão.
Obrigado novamente
Abraço
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Olá a todos
Espero que a sintaxe seja melhor do que antes. Na última semana, venho lendo os Codersguru.
O programa abaixo, embora não tenha nenhum erro, o compilador registrará apenas uma ordem. Mas meu código não irá fechá-lo.
O programa declara --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), eu tenho
não inseriu o stoploss ou o takeprofit, como você pode ver. Motivo, há uma condição StopLoss já codificada como tal ---
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(OrderTicket(), OrderLots(), 3, Azul)
Então não há necessidade de inserir outro o StopLoss, não? No que diz respeito ao TakeProfit
Vou codificar isso quando este outro problema for resolvido.
É assim que eu codifiquei a condição de fechamento, ou há novamente problemas com a sintaxe?
Obrigado a todos por sua ajuda, e que meu problema ajude outros,
Abraço