Ajuda na codificação... Como obter um indicador para filtrar em vez de alertar? - página 7
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Desculpe, não tenho tempo para examinar todo o código, mas vamos examinar apenas este trecho.
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())
Digamos que o OrderOpenPrice = 1,2100
e o lucro é de 0,0010
Portanto, você quer fechar o negócio curto se a oferta for menor ou igual a 1,2100-0,0010 = 1,2090.
Vamos supor que houve uma lacuna e que os preços saltaram 1.2090 e o preço de oferta agora é 1.2088. De acordo com sua fórmula,
Licitação + Lucro = 1.2088 + 0.0010 = 1.2098. NÃO é maior que OrderOpenPrice mesmo que seu sistema tenha excedido o limite de lucro. Portanto, a ordem não será fechada. A lógica da condição de fechamento precisa ser reelaborada e rescriptada, em minha opinião. Além disso, você deve lidar com preços Ask ao lidar com negócios curtos, pois você só pode fechar o negócio ao preço pedido.
Outro conselho,
O ciclo de contagem de for (int cnt = 0; cnt = 0; cnt--) ou algo semelhante.
Boa sorte.Eu aprecio aprender isto, obrigado Maji! De qualquer forma, esta não é a lógica de fechamento que eu queria sobre isto... a lógica que eu queria era tê-la fechada SE não tivesse desencadeado a perda do trailing stop. Como eu não entendo exatamente como detectar se isso é acionado ou não, não posso usar este tempo para fechar a estratégia de fechamento até aprender como programá-la para fazer o que eu pretendia.
Novos critérios de fechamento...ajude-me a colocar o código corretamente, por favor...
Estou precisando de alguma ajuda para colocar outro critério de fechamento, que é que o EMA longo fique abaixo da menor tendência (se longo) e o visto vice-versa, se curto. Não sei exatamente como isolar as posições abertas longas e curtas para fechá-las com este novo critério.
//+--------- settings may vary use at your own risk-----------------+
//+--------------user inputs--------------------+
extern double Trendsetter = 250;
extern double Minortrendsetter = 150;
extern double LongEMA = 20;
extern double ShortEMA = 5;
extern double TrailingStop = 15;
extern double TrailingStopTrigger = 1;
extern double StopLoss = 186;
extern double TakeProfit = 250;
extern double Lots = 0.1;
extern double EquityStop = 9;
//---- Custom "Channel-1" Indicator and Filter Parameters
extern int Hours=36;
extern color col=SkyBlue;
extern double TF = 60; //--which bar period for the custom indicator to use
extern double upperproximity = 30; //---disallows long orders within this proximity to resistance line
extern double lowerproximity = 30; //---disallows short orders within this proximity to the support line
//+-----------close based on not triggering trailing stop in allotted time----------------+
extern int MonitorInMinutes = 60; // minutes after open to check state of trade
extern int ThresholdMove = 11; // if after that time we don't have +'x' pips we will exit
extern int MinsMultiplier = 600; // multiplies the MonitorInMinutes to make minutes (if 'x'=60) into hours
//+----------------------end of allotted time user inputs-----------------------------+
//+-----------------------------end of user inputs----------------------------------+
//+------------------------------------------------------------------+
//| expert start function
//+------------------------------------------------------------------+
int start(){
CloseOrder();
int cnt, ticket;
if(Bars<100){
Print("bars less than 100");
return(0);
}
//+----------------------Get Moving Average(s) Data----------------------------------------+
double currentlong=iMA(NULL,0,LongEMA,0,MODE_EMA,PRICE_CLOSE,0);//--current period longEMA
double currentshort=iMA(NULL,0,ShortEMA,0,MODE_EMA,PRICE_CLOSE,0);//--current period shortEMA
double trendsetter=iMA(NULL,0,Trendsetter,0,MODE_EMA,PRICE_CLOSE,0);//--current period TrendsetterEMA
double minorts=iMA(NULL,0,Minortrendsetter,0,MODE_EMA,PRICE_CLOSE,0);//--current period MinortrendsetterEMA
double prevlong=iMA(NULL,0,LongEMA,0,MODE_EMA,PRICE_CLOSE,1);//--previous period longEMA
double prevshort=iMA(NULL,0,ShortEMA,0,MODE_EMA,PRICE_CLOSE,1);//--previous period shortEMA
double prevtrendsetter=iMA(NULL,0,Trendsetter,0,MODE_EMA,PRICE_CLOSE,1);//--previous period TrendsetterEMA
double prevminorts=iMA(NULL,0,Minortrendsetter,0,MODE_EMA,PRICE_CLOSE,1);//--previous period MinortrendsetterEMA
//+----------------------------end of Get Moving Average(s) Data-----------------------------+
//+--------------------channel filter---------------------------+
double resistance = iCustom(NULL,TF,"Channel-1",Hours,col,0,0);
double support = iCustom(NULL,TF,"Channel-1",Hours,col,2,0);
//+------------------- end channel filter------------------------+
//+---------Obnoxious money management code needs revision----------------+
int total=OrdersTotal();
if(total<1){
if(AccountFreeMargin()<(1000*Lots)){
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
//+---------end of Obnoxious money management code-----------------+
//+---------------------------------------Order Entry--------------------------------------------+
//+---------enter long positions----------+
if (prevshortcurrentlong && currentshort>currentlong>Trendsetter && Ask > resistance - upperproximity*Point){ //---conditions to open long positions change as desired
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
//+---------enter short positions----------+
if (prevshort>prevlong && currentshort<currentlong && currentshort<currentlong<Trendsetter && Ask < support + lowerproximity*Point){ //---conditions to open short positions change as desired
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,0,Red);
if(ticket>0) {
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
}
//+---------end of order entry-------------------------+
//+-------------------------Trailing Stop Code------------------------------------+
for(cnt=0;cnt<total;cnt++) {
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
if(OrderType()==OP_BUY){
if(TrailingStop>0) {if(Bid-OrderOpenPrice()>Point*TrailingStopTrigger) {
if(OrderStopLoss()<Bid-Point*TrailingStop) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}else{
if(TrailingStop>0) {if((OrderOpenPrice()-Ask)>(Point*TrailingStopTrigger)) {
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
//+-------------------------End of Trailing Stop Code----------------------------+
//+---------------------Equity Stop Code---------------------------+
if((AccountEquity()+ EquityStop)<AccountBalance()) {
{
int ttotal = OrdersTotal();
for(int i=ttotal-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
bool result = false;
switch(type)
{
//Close opened long positions
case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;
//Close opened short positions
case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
}
if(result == false)
{
Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
Sleep(3000);
}
}
return(0);
}
}
}
}
}
//+---------------------End of Equity Stop Code---------------------------+
//|
//+---------------------Close Based on Time-------------------------------+
//+--------------needs revision, not working as desired---------------------+
//+------------I want it to close IF and ONLY IF trailing stop is NOT triggered-------------+
void CloseOrder()
{
double Profit=ThresholdMove*Point;
int total = OrdersTotal();
for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)
{
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
}
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
}
}
}
}
//+---------------------------end of close on time code---------------+ok Preciso entender esta parte do código agora....
a primeira linha conta
a segunda linha seleciona os pedidos contados
terceira linha...isto me engana...PENSO que quer saber se a ordem selecionada é uma venda...mas o que há com o "0? Quero dizer que aqui há CINCO linhas de "se"...
Acho que se alguma delas for verdadeira, então ela modificará o pedido de outra forma...acho que ela vai para o "outro" e...bem, isto de alguma forma deve conseguir lidar com posições longas e curtas, mas ainda não entendi.
Já que quero acrescentar critérios para fechar a posição longa ou curta com base na cruz do EMA longo com o EMA menor... não tenho certeza de onde em tudo isso fazer.
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
if(OrderType()==OP_BUY){
if(TrailingStop>0) {if(Bid-OrderOpenPrice()>Point*TrailingStopTrigger) {
if(OrderStopLoss()<Bid-Point*TrailingStop) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}else{
if(TrailingStop>0) {if((OrderOpenPrice()-Ask)>(Point*TrailingStopTrigger)) {
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}Ok, entendo que todos os if e elses levam a estas linhas. estas são as que eu preciso entender...
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
Preciso saber mais sobre como estas linhas de ordem modificam a construção... são estas as que estão fechando assim como as que estão mudando as ordens... ou elas apenas mudam as ordens e algo mais fecha as ordens...
Veja a ajuda no MetaEditor
OP_BUY 0 Buying position.
OP_SELL 1 Selling position.
OP_BUYLIMIT 2 Buy limit pending position.
OP_SELLLIMIT 3 Sell limit pending position.
OP_BUYSTOP 4 Buy stop pending position.
OP_SELLSTOP 5 Sell stop pending position.
[/PHP]
so, <= OP_SELL is OP_BUY or OP_SELL. Just instead of using
[PHP]if((OrderType()==OP_SELL) || (OrderType()==OP_BUY) ...Apenas menos digitação![](https://c.mql5.com/forextsd/smiles/regular_smile.png)
Aqui vai você
void CloseOrders(int op)
{
int tik[30], t = 0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && MagicNum==OrderMagicNumber() && OrderType() == op){
tik[t] = OrderTicket(); t++;
}
}
}
for (i = 0; i<t; i++)
{
if(OrderSelect(tik,SELECT_BY_TICKET)){
double prc = Bid;
if (op == OP_SELL) prc = Ask;
CloseOrder(tik, OrderLots(), prc);
}
}
}Chame-o : CloseOrder(OP_BUY); // Feche todas as ordens de compra
ou
CloseOrder(OP_SELL); // Fechar todas as ordens de venda
A razão pela qual estou mantendo todos os pedidos em um array e depois excluo é porque quando fecho o pedido na posição nº 1, então o próximo se torna 1 novamente e temos um problema.
Eu esqueço esta
{
int CloseCnt, err;
// try to close 3 Times
CloseCnt = 0;
color clr = Violet;
if (OrderType() == OP_SELL)
clr = Orange;
while (CloseCnt < 3)
{
if (OrderClose(ticket,numLots,close_price,Slippage,clr))
{
CloseCnt = 3;
}
else
{
err=GetLastError();
Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));
if (err > 0) CloseCnt++;
}
}
}
[/PHP]
and dont forget to add this line after #property link
[PHP]#property link "http://www.elihayun.com"
#include
Ainda estou confuso...
Entenda que eu não criei este código originalmente. Estou trabalhando para entender o que outra pessoa fez e modificá-lo. Só coloquei meu nome na linha de propriedade agora que o modifiquei tanto que ele tem pouca semelhança com o original. Modifiquei mais agora do que deixei intocado. Ainda há alguns aspectos que não entendo e, portanto, não fui capaz de modificar.
O que eu estou procurando é o código que fecha os pedidos... parece que tudo isso está apenas modificando para atualizar a parada móvel.
esta é mais de uma maneira de fechar.
neste momento este EA tem a capacidade de fechar com uma parada de perda.
para fechar com uma parada móvel.
para fechar com uma meta de lucro.
ou para fechar com base na passagem de algum tempo definido após a abertura.
o que não tem que eu queira que ela tenha é a capacidade de fechar se a EMA longa voltar para a EMA de menor tendência. ela poderia fazer esta travessia para fechar uma posição curta ou travessia para fechar uma posição longa. Como posso fazer isso? Quero dizer, com todas essas outras opções de fechamento, onde coloco o novo código para superar todas essas outras opções de fechamento?
Na minha expiração, quando não quero usar algum aspecto disso, simplesmente faço com que o critério desse parâmetro seja tão extremo que nunca vai acioná-lo, o que é como desligar esse critério basicamente. Fazer isso permite que o jogo dos outros critérios mostre o que eles retornariam.
Esqueci este aqui
{
int CloseCnt, err;
// try to close 3 Times
CloseCnt = 0;
color clr = Violet;
if (OrderType() == OP_SELL)
clr = Orange;
while (CloseCnt < 3)
{
if (OrderClose(ticket,numLots,close_price,Slippage,clr))
{
CloseCnt = 3;
}
else
{
err=GetLastError();
Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));
if (err > 0) CloseCnt++;
}
}
}
[/PHP]
and dont forget to add this line after #property link
[PHP]#property link "http://www.elihayun.com"
#include
ok, muito obrigado!
Então isto é basicamente apenas um código de fechamento?
Será que isto fechará tanto as posições longas como as curtas?
Como eu usaria isto para fechar, se o longema cruzasse de volta no menor tendenciômetro? cruzando para cima se tivesse aberto a posição curta e cruzando para baixo se tivesse aberto a posição longa?
p.s. Não voltarei ao computador até o final da tarde de hoje. Então voltarei a verificar.
mais uma pergunta...
o que significa "trocar"?
Toda vez que você decide abrir uma chamada de posição LONG: CloseOrders(OP_SELL);
e vise versa.
Olhe para seu código onde u está abrindo as ordens.
Você não precisa verificar se há uma ordem para fechar. A rotina fará isso para u
BTW, eu postei um código para converter o tipo de célula 2006.07.02 até a data em excel. Veja o seu post lá