Fechar o pedido automaticamente após um determinado período e/ou SL - página 3

 

Isto é muito errado . . .

OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);

(BuyTicket || SellTicket) resultará em verdadeiro ou falso . . e, neste caso, verdadeiro ou falso será considerado como 1 ou 0 . . não o seu número de SellTicket ou BuyTicket . .

Stoploss = 40 . . . quando você usa um stoploss no OrderSend é um preço . . . não um número de pips, slippage é um número de pips . . leia a documentação: OrderSend

stoploss - Parar o nível de perda.
takeprofit - Tirar nível de lucro.
 

Ok, eu sei o que você quer dizer, então eu preciso de um comando para selecionar a ordem ao usar OrderSelect... ou OrderSelect, neste caso, está geralmente errado?

 

Leia os documentos . . . OrderSelect é necessário para selecionar o pedido antes que você possa usar o OrderLots, OrderTicket, OrderOpenPrice, etc, etc. "Nota: O pedido deve ser selecionado previamente pela funçãoOrderSelect()".

Se você não precisa usar uma informação referente a um pedido existente, você não precisa da OrderSelect. se você precisa ... bem, então você precisa.

 
RaptorUK:

Leia os documentos . . . OrderSelect é necessário para selecionar o pedido antes que você possa usar o OrderLots, OrderTicket, OrderOpenPrice, etc, etc. "Nota: O pedido deve ser selecionado previamente pela funçãoOrderSelect()".

Se você não precisa usar uma informação referente a um pedido existente, você não precisa da OrderSelect. se você precisa ... bem, então você precisa.


Atualmente eu acho que precisaria desta informação, porque se existe uma posição no mercado eu preciso fechá-la e substituí-la por outra. Pensei que a OrderSelect me ajudaria desta forma. Mas se a OrderSelect é apenas para ordens abertas e não para a posição ativa no mercado, não é útil. Estou certo?

Mas se OrderSelect não ajudar, como posso fechar as posições ativas?

comentários

Marc

 
Se você não usar ordens pendentes e tiver ordens em aberto, elas serão ou uma compra ou uma venda . . . uma ordem de mercado.
 
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber =1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=40;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
       if((OrderOpenTime()+3600) < TimeCurrent())
          { 
           if (OrderType() == OP_BUY)          
              {
               bool Closed = OrderClose(OrderTicket() ,OrderLots(), Ask, UseSlippage, Red);           
               openbuy = 0;
              }
           if (OrderType() == OP_SELL)          
              {
               Closed = OrderClose(OrderTicket() ,OrderLots(), Bid, UseSlippage, Red);  
               opensell = 0;         
              }              
          }
       }
    }


//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue);
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
} 

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

This seems to be mostly correct, but now I need to know why the prog only executes the sell order @ 12 & 23...and not the buy orders...?
 

nirvanamac:

Isto parece estar mais correto, mas agora eu preciso saber porque o programa só executa a ordem de venda @ 12 & 23... e não as ordens de compra...?

Provavelmente sim... e provavelmente gera um erro que você não está aprisionando...

Tente . . .

//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue); 
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );

} 

Seu pedidoFechar está errado . . você abre uma Buy at Ask, para fechar uma Buy you Sell . . você Vende na Bid, você abre uma Sell at Bid para fechar uma Sell you Buy . . você compra na Ask.

 
RaptorUK:
Seu pedidoFechar está errado . . você abre uma Buy at Ask, para fechar uma Buy you Sell . . você Vende na Bid, você abre uma Sell at Bid para fechar uma Sell you Buy . . você compra na Ask.
Ou, como você já selecionou o pedido, basta usar
Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);  
E não é necessário diferenciar o tipo de pedido.
 

Muito obrigado por me ajudar...Eu modifiquei o código com suas dicas. Parece que é assim:

//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#direitos de propriedade intelectual "Der Marc
#link de propriedade "Es gibt gar keine Internetseite"

//Wichtige Variablen
Minlot duplo externo=0,01;
Int. externo Dígitos2Round=2;
Intenção externa PercentOfFreeDepo=1;
int externo Slippage=5;
int externo MagicNumber =1;
extern int TradeHour3=3;
externo int TradeHour4=4;
externo int TradeHour7=7;
externo int TradeHour10=10;
externo int TradeHour17=17;
externo int TradeHour18=18;
externo int TradeHour20=20;
externo int TradeHour12=12;
externo int TradeHour23=23;
Exterior int StopLoss=400;

//Globale Variablen
int BuyTicket;
int SellTicket;
duplo UsePoint;
int UseSlippage; int UseSlippage;

int openbuy = 0;
int opensell = 0; int openbuy = 0;
//+------------------------------------------------------------------+
//| função de iniciação de especialista |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Símbolo());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| função de início especializado |
//+------------------------------------------------------------------+
int start()
{
duplo FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0,0001)*0,1,Digits2Round);
//===================== Vamos determinar o tamanho e o risco do lote ===================================
se ( Lote<Minlot )
{
Lote=Minlot;
}
Comentário ("\n", "Risco aceitável é ",PercentOfFreeDepo, "% = ",Risco," do dinheiro livre ",FreeDepo," em lotes = ",Lote);
for(int i = OrdensTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < TimeCurrent())
{
se (OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Vermelho);
openbuy = 0;
openbuy = 0; opensell = 0;
}
se (OrderType() == OP_SELL)
{
Fechado = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Vermelho);
opensell = 0;
openbuy = 0;
}
}
}
}
//BuyOrder
if ((TradeHour3===Hour())|||(TradeHour4===Hour())|||(TradeHour7==Hour())|||(TradeHour10==Hour())|||(TradeHour17===Hour())|||(TradeHour18===Hour())|||(TradeHour20=== Hour()) && openbuy == 0) //Signal Buy
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order ",MagicNumber,0,Blue);
se (openbuy < 0) Print("OrderSend OP_BUY falhou, erro: ", GetLastError() );
}
// VendaOrdem
if ((TradeHour12==Hour())|||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0, "time trader sell order ",MagicNumber,0,Green);
if (opensell < 0) Print("OrderSend OP_SELL falhou, erro: ", GetLastError() );
}

//----
retorno(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
PipPoint duplo (moeda de corda)
{
int CalcDigits = MarketInfo(Moeda, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) CalcPoint duplo = 0,01;
caso contrário if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0,0001;
retorno (CalcPoint);
}

//Get Slippage Função
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Moeda, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) CalcSlippage duplo = SlippagePips;
caso contrário if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
retorno (CalcSlippage);
}

Ao executar o backtest há uma mensagem de erro ERR_INVALID_TICKET (4108).

 

Nem todas as ordens foram executadas

Será que o erro pertence ao fato de que o SL foi acionado antes?

Razão: