Como codificar? - página 344

 
mladen:

tkuan77

Você tem que encontrar o último bar fechado e ver se o dia do último bar fechado é o mesmo que o dia atual.

Você pode usar algo como esta função para obter o último horário de fechamento do pedido:

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

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

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

E então você pode verificar se a data é a mesma

Oi mladen,

Mas onde inserir esta parte do código? Desculpe por perguntar isto, pois ainda sou bastante novo em codificar a mim mesmo e ainda não consigo entender como funciona o For loop.

Cumprimentos

Ryan

 
tkuan77:

Oi mladen,

Mas onde inserir esta parte do código? Desculpe por perguntar isto, pois ainda sou bastante novo em codificar a mim mesmo e ainda não consigo entender como funciona o For loop.

Cumprimentos

Ryan

Ryan

Algo parecido com isto :

if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime())) // sem negociação

 
mladen:

Ryan

Algo parecido com isto :

if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime())) // sem negociação

Oi mladen, acrescentei o código, mas parece estar dando alguma forma de erro variável global. Além disso, notei que você tem uma variável MagicNumber que não é definida, posso perguntar para que serve isso? Adicionei-a sob int, mas não tenho certeza qual é o uso para essa variável.

Aconselhe. Obrigado novamente por sua paciência.

//---- parâmetros de entrada

TakeProfit duplo externo = 1000,0;

double Lots externos = 0,1;

StopLoss duplo externo = 980,0;

extern int Entry_Hour_1st = 21;

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

//| função de iniciação de especialista |

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

int init()

{

//----

//----

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit()

{

//----

//----

retorno(0);

}

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

//| função de início especializado |

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

int start()

{

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

//... Troca de gatilhos

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

int ticket, total, MagicNumber;

duplo TP_Value, SL_Value;

data/hora GetLastClosedOrderTime()

{

data/hora FecharTempo = 0;

for(int i=OrdensHistóriaTotal()-1;i>=0;i--)

{

se (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

retorno(CloseTime);

}

total = OrdensTotal(); // verificar o número total de negócios atualmente abertos

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

se ((Fechar[1] - Abrir[1]) > 0,00100)

{

TP_Value = (Fechar[1] - Abrir[1]);

SL_Valor = (Baixo[1] - 0,0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Abrir[1] - Fechar[1]) > 0,00100)

{

TP_Value = (Abrir[1] - Fechar[1]);

SL_Valor = (Baixo[1] - 0,0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Abrir[1] - Fechar[1]) <= 0,00100)

{

TP_Valor = (Alto[1] - Baixo[1]);

SL_Valor = (Baixo[1] - 0,0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

se ((Fechar[1] - Abrir[1]) > 0,00100)

{

TP_Value = (Fechar[1] - Abrir[1]);

SL_Valor = (Alto[1] + 0,0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Abrir[1] - Fechar[1]) > 0,00100)

{

TP_Value = (Abrir[1] - Fechar[1]);

SL_Valor = (Alto[1] + 0,0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Abrir[1] - Fechar[1]) <= 0,00100)

{

TP_Valor = (Alto[1] - Baixo[1]);

SL_Valor = (Alto[1] + 0,0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

retorno(0);

}

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

 
tkuan77:

Oi mladen, acrescentei o código, mas parece estar dando alguma forma de erro variável global. Além disso, notei que você tem uma variável MagicNumber que não é definida, posso perguntar para que serve isso? Adicionei-a sob int, mas não tenho certeza qual é o uso para essa variável.

Aconselhe. Obrigado novamente por sua paciência.

//---- parâmetros de entrada

TakeProfit duplo externo = 1000,0;

double Lots externos = 0,1;

StopLoss duplo externo = 980,0;

extern int Entry_Hour_1st = 21;

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

//| função de iniciação de especialista |

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

int init()

{

//----

//----

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit()

{

//----

//----

retorno(0);

}

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

//| função de início especializado |

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

int start()

{

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

//... Troca de gatilhos

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

int ticket, total, MagicNumber;

duplo TP_Value, SL_Value;

data/hora GetLastClosedOrderTime()

{

data/hora FecharTempo = 0;

for(int i=OrdensHistóriaTotal()-1;i>=0;i--)

{

se (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

retorno(CloseTime);

}

total = OrdensTotal(); // verificar o número total de negócios atualmente abertos

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

se ((Fechar[1] - Abrir[1]) > 0,00100)

{

TP_Value = (Fechar[1] - Abrir[1]);

SL_Valor = (Baixo[1] - 0,0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Abrir[1] - Fechar[1]) > 0,00100)

{

TP_Value = (Abrir[1] - Fechar[1]);

SL_Valor = (Baixo[1] - 0,0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Abrir[1] - Fechar[1]) <= 0,00100)

{

TP_Valor = (Alto[1] - Baixo[1]);

SL_Valor = (Baixo[1] - 0,0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

se ((Fechar[1] - Abrir[1]) > 0,00100)

{

TP_Value = (Fechar[1] - Abrir[1]);

SL_Valor = (Alto[1] + 0,0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Abrir[1] - Fechar[1]) > 0,00100)

{

TP_Value = (Abrir[1] - Fechar[1]);

SL_Valor = (Alto[1] + 0,0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Abrir[1] - Fechar[1]) <= 0,00100)

{

TP_Valor = (Alto[1] - Baixo[1]);

SL_Valor = (Alto[1] + 0,0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

retorno(0);

}

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

Essa é uma função

Movê-lo para fora do corpo da função start()

 

mladen:

Essa é uma função

Movê-lo para fora do corpo da função start()

Oi mladen, eu tentei tirar a função Start, no entanto, minha EA ainda está desencadeando mais de 1 comércio por dia em vez de limitar a desencadear apenas 1 comércio por dia.

Apreciar o esclarecimento.

Cumprimentos

//---- parâmetros de entrada

TakeProfit duplo externo = 1000,0;

double Lots externos = 0,1;

StopLoss duplo externo = 980,0;

extern int Entry_Hour_1st = 21;

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

//| função de iniciação de especialista |

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

int init()

{

//----

//----

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit()

{

//----

//----

retorno(0);

}

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

//| função de início especializado |

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

int MagicNumber;

data/hora GetLastClosedOrderTime()

{

data/hora FecharTempo = 0;

for(int i=OrdensHistóriaTotal()-1;i>=0;i--)

{

se (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

retorno(CloseTime);

}

int start()

{

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

//... Troca de gatilhos

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

int ticket, total;

duplo TP_Value, SL_Value;

total = OrdensTotal(); // verificar o número total de negócios atualmente abertos

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

se ((Fechar[1] - Abrir[1]) > 0,00100)

{

TP_Value = (Fechar[1] - Abrir[1]); // valor do corpo longo

SL_Valor = (Baixo[1] - 0,0010); // sempre o mesmo por muito tempo

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Abrir[1] - Fechar[1]) > 0,00100)

{

TP_Value = (Aberto[1] - Fechado[1]); // valor do corpo curto

SL_Valor = (Baixo[1] - 0,0010); // sempre o mesmo por muito tempo

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Abrir[1] - Fechar[1]) <= 0,00100)

{

TP_Valor = (Alto[1] - Baixo[1]); // valor da vela inteira incluindo cabeça e cauda

SL_Valor = (Baixo[1] - 0,0010); // sempre o mesmo por muito tempo

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

se ((Fechar[1] - Abrir[1]) > 0,00100)

{

TP_Value = (Fechar[1] - Abrir[1]); // valor do corpo longo

SL_Valor = (Alto[1] + 0,0010); // sempre o mesmo para curto

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Abrir[1] - Fechar[1]) > 0,00100)

{

TP_Value = (Aberto[1] - Fechado[1]); // valor do corpo curto

SL_Valor = (Alto[1] + 0,0010); // sempre o mesmo para curto

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Abrir[1] - Fechar[1]) <= 0,00100)

{

TP_Valor = (Alto[1] - Baixo[1]); // valor da vela inteira incluindo cabeça e cauda

SL_Valor = (Alto[1] + 0,0010); // sempre o mesmo para curto

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

retorno(0);

}

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

 
tkuan77:

Oi mladen, eu tentei tirar a função Start, no entanto, minha EA ainda está desencadeando mais de 1 comércio por dia em vez de limitar a desencadear apenas 1 comércio por dia.

Apreciar o esclarecimento.

Cumprimentos

//---- parâmetros de entrada

TakeProfit duplo externo = 1000,0;

double Lots externos = 0,1;

StopLoss duplo externo = 980,0;

extern int Entry_Hour_1st = 21;

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

//| função de iniciação de especialista |

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

int init()

{

//----

//----

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit()

{

//----

//----

retorno(0);

}

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

//| função de início especializado |

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

int MagicNumber;

data/hora GetLastClosedOrderTime()

{

data/hora FecharTempo = 0;

for(int i=OrdensHistóriaTotal()-1;i>=0;i--)

{

se (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

retorno(CloseTime);

}

int start()

{

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

//... Troca de gatilhos

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

int ticket, total;

duplo TP_Value, SL_Value;

total = OrdensTotal(); // verificar o número total de negócios atualmente abertos

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((High[0] - High[1]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

se ((Fechar[1] - Abrir[1]) > 0,00100)

{

TP_Value = (Fechar[1] - Abrir[1]); // valor do corpo longo

SL_Valor = (Baixo[1] - 0,0010); // sempre o mesmo por muito tempo

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Abrir[1] - Fechar[1]) > 0,00100)

{

TP_Value = (Aberto[1] - Fechado[1]); // valor do corpo curto

SL_Valor = (Baixo[1] - 0,0010); // sempre o mesmo por muito tempo

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

se ((Abrir[1] - Fechar[1]) <= 0,00100)

{

TP_Valor = (Alto[1] - Baixo[1]); // valor da vela inteira incluindo cabeça e cauda

SL_Valor = (Baixo[1] - 0,0010); // sempre o mesmo por muito tempo

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Val ue,Ask+TP_Value, "My EA",200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0,00100) && ((High[1] - Low[1]) > 0,00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

se ((Fechar[1] - Abrir[1]) > 0,00100)

{

TP_Value = (Fechar[1] - Abrir[1]); // valor do corpo longo

SL_Valor = (Alto[1] + 0,0010); // sempre o mesmo para curto

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Abrir[1] - Fechar[1]) > 0,00100)

{

TP_Value = (Aberto[1] - Fechado[1]); // valor do corpo curto

SL_Valor = (Alto[1] + 0,0010); // sempre o mesmo para curto

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

se ((Abrir[1] - Fechar[1]) <= 0,00100)

{

TP_Valor = (Alto[1] - Baixo[1]); // valor da vela inteira incluindo cabeça e cauda

SL_Valor = (Alto[1] + 0,0010); // sempre o mesmo para curto

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

retorno(0);

}

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

tkuan77

Substitua este :

if(total < 1)

com este :

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;

E não deve mais fazer isso

 
mladen:

tkuan77

Substitua este :

if(total < 1)

com este :

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;

E não deve mais fazer isso

Oi mladen, depois de ter inserido o código, em vez de acionar 1 operação por dia, acionou várias operações ao mesmo tempo até o estouro da conta. Poderia ser devido a algum mecanismo de acionamento que causa isto?

Atenciosamente

 

Oi mladen, tenho este código particular que fechará todas as negociações pendentes que tenho depois de ter uma negociação em andamento. como faço para só cancelar minha negociação pendente atual depois de ter acionado uma negociação em vez de todas as futuras negociações pendentes?

obrigado.....

int new_del()

{

int i,a;

int total = OrdensTotal();

string comentario,par;

para (i=total-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

se (OrderType()==OP_BUY || OrderType()==OP_SELLL)

{

para (a=total-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES);

comentario=OrderComment();

par=StringSubstr(comentario,0,6);

if(OrderType()==OP_SELLSTOP)// && comentario===Symbol())

{

OrderDelete(OrderTicket());

Print("Deleting SELL_STOP"," Ordertype:",OrderType());

return(1);

}

if(OrderType()==OP_BUYSTOP)// && par===Símbolo())

{

OrderDelete(OrderTicket());

Print("Deleting BUY_STOP"," Ordertype:",OrderType());

return(1);

}

}

}

}

}

 
tkuan77:
Oi mladen, tenho este código particular que fechará todas as negociações pendentes que tenho depois de ter uma negociação em andamento. como faço para só cancelar minha negociação pendente atual depois de ter acionado uma negociação em vez de todas as futuras negociações pendentes?

obrigado.....

int new_del()

{

int i,a;

int total = OrdensTotal();

string comentario,par;

para (i=total-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

se (OrderType()==OP_BUY || OrderType()==OP_SELLL)

{

para (a=total-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES);

comentario=OrderComment();

par=StringSubstr(comentario,0,6);

if(OrderType()==OP_SELLSTOP)// && comentario===Symbol())

{

OrderDelete(OrderTicket());

Print("Deleting SELL_STOP"," Ordertype:",OrderType());

return(1);

}

if(OrderType()==OP_BUYSTOP)// && par===Símbolo())

{

OrderDelete(OrderTicket());

Print("Deleting BUY_STOP"," Ordertype:",OrderType());

return(1);

}

}

}

}

}

tkuan77

O que significa "comércio atual pendente" e o que significa "comércio futuro pendente"?

 
mladen:

tkuan77

O que significa "comércio atual pendente" e o que significa "comércio futuro pendente"?

Oi mladen,

O comércio pendente atual significa: uma vez satisfeita uma condição, a ea estabelecerá 2 negócios pendentes (1 longo e 1 curto). Portanto, se a negociação longa for acionada, a ea cancelará automaticamente as negociações pendentes curtas.

O comércio pendente futuro significa: após a ea ter cancelado as negociações pendentes anteriores e dizer que a condição foi cumprida novamente, a ea por direito deve definir outras 2 negociações pendentes (1 longa e 1 curta). no entanto, se a ea atualmente tem uma negociação em andamento, a ea cancelará automaticamente quaisquer ordens pendentes que a ea está tentando definir.

o que estou tentando fazer é simplesmente deixar o sistema cancelar somente a negociação pendente atual após uma negociação ter sido acionada. apreciar a ajuda

cumprimentos