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.
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.
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.
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.
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)
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.
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:
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;
externint TrailingStart=10;
externint 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);
}
//+------------------------------------------------------------------+
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!
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Não em tempo real.
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:
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
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:
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:
Aqui está a EA inteira:
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!