O Trailingstop EA não funciona - página 3

 
FMIC: Alguns conselhos; não use "Pergunte" ou "Licite" - use "OrderClosePrice()" em vez disso. É um valor em tempo real, independentemente de ser um pedido de Compra ou Venda.
Não em tempo real.
  1. Com o Ask and Bid você deve RefreshRates() após atrasos, ou seja, entre várias chamadas de servidor, após o Sleep ou um longo cálculo.
  2. Com OrderClosePrice, ele é atualizado somente com OrderSelect. Assim, após o Sleep ou um cálculo longo (ou mantendo uma ordem selecionada entre chamadas OnTick,) você deve re-selecionar.
    OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder:
Não em tempo real.
  1. Com o Ask and Bid você deve RefreshRates() após atrasos, ou seja, entre várias chamadas de servidor, após o Sleep ou um longo cálculo.
  2. Com OrderClosePrice, ele é atualizado somente com OrderSelect. Assim, após o sono ou um longo cálculo (ou mantendo uma ordem selecionada entre chamadas OnTick ), você deve selecionar novamente.

Obrigado pela informação. Eu não sabia que o "OrderClosePrice()" estava em buffer. Portanto, acho que nem "OrderClosePrice()" nem o "Ask"/"Bid" é a solução ideal em tempo real.

Entretanto, você concorda que "OrderClosePrice()" é uma solução geral melhor do que o uso de "Ask"/"Bid" após o "OrderSelect()" ter sido feito?

E para uma solução em tempo real, se ela for realmente necessária, então eu acho que podemos voltar atrás nas alternativas:

  • Reselecionando a ordem com "OrderSelect()" (EDIT: esqueceu de listar esta no post inicial, mesmo que você a tenha apontado)
  • "RefreshRate()" com "Ask"/"Bid"
  • "MarketInfo()" com "MODE_ASK"/"MODE_BID" (antigo estilo MQL4)
  • "SymbolInfoDouble()" com "SYMBOL_ASK"/"SYMBOL_BID" (novo estilo MQL4+ e MQL5)
  • "SymbolInfoTick()" (que eu já uso na maioria dos meus EA de qualquer forma)
 
FMIC: Entretanto, você concorda que "OrderClosePrice()" é uma solução geral melhor do que o uso de "Ask"/"Bid" após a "OrderSelect()" ser feita?
absolutamente.
 

Por que você está tentando inventar a roda novamente?

Olhe aqui - você encontrará tudo o que precisa.

Se não começar a alterar seu código fonte.

 

Obrigado pela ajuda de todos até agora. Acho que já resolvi a questão do erro 130, mas há algo seriamente errado com minha função OrderSelect, que provavelmente é o motivo pelo qual às vezes só modifica algumas das ordens. Abaixo está uma lista de coisas que eu imprimi. O número do OrderTicket # está completamente errado. Esse número de bilhete pertence a uma negociação que abri para o EURAUD. Embora eu não tenha incluído todos os resultados, existem na verdade múltiplos pares onde os números do OrderTicket não correspondem com o par no terminal de negociação.

Alguém pode, por favor, dar uma olhada e me dizer o que há de errado com OrderSelect? Obrigado.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Acho que o ticket deve imprimir o mesmo valor que o OrderTotal, então parece que meu contador não funciona.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = verdadeiro

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: EncomendasTotal = 11

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357

extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   Print("OrdersTotal = ",OrdersTotal());
   Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
   Print("ticket = ",ticket);                     
   Print("OrderTicket = ",OrderTicket());                     
   Print("Selectbyticket = ",SELECT_BY_TICKET);                     
   Print("Selectbypos = ",SELECT_BY_POS);                     
                        
   {for(int i=OrdersTotal()-1; i>=0; i--){ //I added more curly brackets{}
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;{
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on.
                     if(TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<'
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the !
                        return(0); //I replaced the Getlasterrror with a return value
                        RefreshRates();
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(TrailingStop*Pip>Ask+(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        return(0);
                        RefreshRates();
                       }
                    }
                }  
            }
         }
      } 
   }
}  
  return(0);
}
//+------------------------------------------------------------------+



 

Olá a todos. Obrigado por toda a ajuda. Encontrei o erro e as questões foram resolvidas. Como não uso um Stoploss, o valor do OrderStopLoss() é sempre 0. Isto não é um problema ao modificar o pedido de compra porque 0 é sempre menor que Bid-TrailingStop*Pip. Mas com o pedido de venda 0 nunca pode ser maior que Ask+Trailingstop*Pip. Então eu tive que adicionar o or(|| OrderStopLoss()) a esta linha:

if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ //Added OrderStopLoss()==0
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
 
Trader3000 Esse número de bilhete pertence a uma profissão que eu abri para o EURAUD.
Sem filtragem em seu laço OrderSelect. Símbolo Não se iguala a Ordersymbol quando outra moeda é adicionada a outro gráfico separado .- Fórum MQL4
 
WHRoeder:
Trader3000: Esse número de bilhete pertence a um comércio que tenho aberto para o EURAUD.
Sem filtragem em seu laço OrderSelect. Símbolo Não se iguala a Ordersymbol quando outra moeda é adicionada a outro gráfico separado . - Fórum MQL4

Sim, há definitivamente um problema com OrderSelect porque ele só funciona em alguns gráficos. O outro problema é que eu não posso incluir um MagicNumber porque as trocas são colocadas manualmente. Usei a parte do código que eu acho relevante, mas não consigo compilá-lo. Ele mostra este erro:

MySelect' - função que só pode ser declarada no âmbito global Trailing_v26.mq4 31 13

e a linha 31 é esta aqui:

bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){

Aqui está a EA inteira:

#property strict;
extern int TrailingStart=10;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
    bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
    if (!OrderSelect(iWhat, eSelect, ePool))     return (false);
    if (OrderSymbol()      != _Symbol)           return (false);
    if (ePool != MODE_HISTORY)                   return (true);
    return(OrderType() <= OP_SELL);
}
    for(int i = OrdersTotal()-1; i >= 0; i--)
    if (MySelect(i, SELECT_BY_POS)){

    for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
    if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
        int nextTkt = OrderTicket();
     
              if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }     
                     }  
                  }     
               }
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }
                     }
                  }  
               }
            
         
         
  return(0);
}
//+------------------------------------------------------------------+



 
Trader3000:

Sim, há definitivamente um problema com OrderSelect porque ele só funciona em alguns gráficos. O outro problema é que eu não posso incluir um MagicNumber porque os ofícios são colocados manualmente. Eu usei a parte do código que eu acho que é relevante, mas não consigo compilá-lo.

Eu dei a você um código de esqueleto perfeitamente bom sobre o qual construir, que corrige seus problemas e até mesmo os listava antes disso, mas você escolhe ignorá-lo e continua a se perguntar por que seu código não está fazendo o que você quer!

Por quê? Você quer que seu código não funcione? Use o exemplo e teste-o você mesmo!

 
Ele acha que pode simplesmente cortar e colar e não precisa aprender a codificar. Ele não pode nem mesmo corrigir este simples erro sem perguntar:
MySelect' - função só pode ser declarada no âmbito global Trailing_v26.mq4 31 13