- Você tem vários blocos de código desalinhados devido a parênteses que estão faltando. Embora equilibrados, eles estão faltando, como no início do "para" e alguns dos blocos do "se".
- A linha"if(OrderSymbol()!=Symbol()) continua;{" é muito suspeita e torna difícil ver como o fluxo do código deve ser. Basta fazer"if(OrderSymbol()==_Symbol()) {". Ao invés de"Symbol()", você também pode usar"_Symbol()".
- Use"OrderClosePrice()" e não"Ask" ou"Bid".
- Adicione parênteses ao fazer comparações para facilitar a leitura, assim como garantir a ordem das coisas. Por exemplo, em vez de"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" use"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip )".
- Tente fundir os blocos de código Comprar e Vender em um único bloco de código que lide com ambos. Isso tornará menos código para depuração e mais fácil de ler e modificar no futuro.
PS! NB! Também faça uso de um Número Mágico para as Ordens!
PS! Lembre-se também de levar em conta o escorregamento que pode causar os 130 erros. Um mínimo de StopLevel por si só não é suficiente. Torne-o ligeiramente maior para contabilizar um possível deslizamento, como a adição de um fator do spread atual. Também pode haver um FreezeLevel no lugar pelo Corretor!
- Você tem vários blocos de código desalinhados devido a parênteses que estão faltando. Embora equilibrados, eles estão faltando, como no início do "para" e alguns dos blocos de "se".
- A linha"if(OrderSymbol()!=Symbol()) continua;{" é muito suspeita e torna difícil ver como o fluxo do código deve ser.
Basta fazer"if(OrderSymbol()==_Symbol()) {". Ao invés de"Symbol()", você também pode usar"_Symbol()". - Use"OrderClosePrice()" e não"Ask" ou"Bid".
- Adicione parênteses ao fazer comparações para facilitar a leitura, bem como garantir a ordem das coisas:
Por exemplo, ao invés de"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" use"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip )". - Tente fundir os blocos de código Comprar e Vender em um único bloco de código que lide com ambos. Isso tornará menos código para depuração e mais fácil de ler e modificar no futuro.
PS! NB! Também faça uso de um Número Mágico para as Encomendas!
PS! Lembre-se também de levar em conta o escorregamento que pode causar os 130 erros. Um mínimo de StopLevel por si só não é suficiente. Torne-o ligeiramente maior para contabilizar um possível deslizamento, como a adição de um fator do spread atual. Também pode haver um FreezeLevel no lugar pelo Corretor!
Muito obrigado por sua resposta e por tentar me ajudar. Tenho algumas perguntas/comentários:
1. no número 1 você sugeriu que eu acrescentasse parênteses (), o que fiz conforme sua sugestão no número 4. mas não vejo como posso acrescentar parênteses () no início do "para". Você poderia explicar isto ou quis dizer parênteses encaracolados {}?
2. eu mudei para _Symbol, mas para melhorar meu conhecimento eu estava me perguntando se você pode explicar qual é o benefício/vantagem de usar _Symbol sobre Symbol()?
3. mudei todos os Pedidos e Licitações para OrderClosePrice(), entretanto, você poderia explicar qual é o benefício/vantagem disto?
4. eu fiz isto
5. tentarei ver como posso simplificar mais isto.
6. como entro em meus negócios manualmente, é meu entendimento que não posso usar MagicNumbers. Isto não é verdade?
7. não vejo como ou onde posso contabilizar o deslizamento. Por favor, me diga onde ou como adicionar isto. Para OrderModify, só permite os seguintes parâmetros:
bool OrderModify( int ticket, // ticket double price, // price double stoploss, // stop loss double takeprofit, // take profit datetime expiration, // expiration color arrow_color // color );
8. em meu código já acrescentei 1 pip (10 pontos) ao mínimo de barulho, o que deve levar em conta a dispersão na maioria dos casos.
9. imprimi o Freezelevel para todos os pares e todos eles são 0,0, portanto, não parece ser um problema.
10. embora eu ainda esteja recebendo o erro 130 e o erro um, quando o EA funciona, ele ainda modifica e fecha a ordem. Portanto, de acordo com estes resultados, estou recebendo o erro, pois a ordem está sendo modificada ao mesmo tempo. Como se fosse um problema de partime:
2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28598 tp: 0.00000 ok
2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: Compra = 130
2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28597 tp: 0.00000 ok
2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28596 tp: 0.00000 ok
2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: Compra = 130
2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15: Compra = 130
2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28590 tp: 0.00000 ok
2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28582 tp: 0.00000 ok
2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28581 tp: 0.00000 ok
2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28577 tp: 0.00000 ok
2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: Compra = 130
2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28575 tp: 0.00000 ok
2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: Compra = 130
2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: Compra = 1
2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28571 tp: 0.00000 ok
Aqui está outro exemplo de onde o Trailingstop está claramente acima do rochedo (em 10 pips/100 pontos) e ainda assim produz erro 130:
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: Erro de compra = 130
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TS = 20
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25
2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: stoplevel = 10.0
Forneça o código mais recente com as atualizações que você fez. Caso contrário, não posso comentar as alterações recentes feitas por você para ver se elas estão corretas.
- Desculpe, eu quis dizer parênteses encaracolados. Você tem que consertar isso, caso contrário, ele continuará a falhar. Este é o mais importante de todos os pontos.
- a) Este ponto não é principalmente sobre o "_Símbolo", mas sobre o "!=" e o "continuar".
b) "_Symbol" é executado mais rapidamente porque é uma variável, enquanto "Symbol()" seria executado como uma chamada de função que é mais lenta. - OrderClosePrice() é o preço de fechamento atual do pedido. Se ainda estiver aberto, ele informará automaticamente o Bid ou Ask, dependendo do tipo de pedido. Por favor, leia os documentos para esta função.
- OK! Vamos ver as mudanças de código que você fez.
- OK! Vamos ver as alterações de código que você fez.
- Sim, para as trocas manuais, o número mágico é 0. Entretanto, em seu código, defina o número mágico como "externo" ou "input", atribuindo-lhe um "0" como padrão, e então use essa variável em seu código. Dessa forma, você pode facilmente usar o EA para outras situações ou reutilizar seu código para outros EAs.
- Eu expliquei como contabilizar o escorregamento. Certifique-se de que o "TrailStop > ( StopLevel + ( CurrentSpread * Factor )" onde o Factor é pelo menos "1.0" (idealmente "1.5" ou "2.0"; maior se você vir que ainda sofre um erro 130 devido a um escorregamento excessivo).
- Não há garantia de que 10 pontos seriam responsáveis pelo spread, pois o spread é diferente dependendo do Símbolo e está sempre mudando, especialmente durante eventos noticiosos e quando a liquidez é baixa, como durante as horas de folga.
- OK! Se o "FreezeLevel" não for usado, tudo bem, mas sugiro que você ainda o use em seu código, para que, caso você o use com um corretor diferente (que possa tê-lo), o EA ainda funcione.
- Fornecer novo código com mudanças para que ele possa ser analisado.
Forneça o código mais recente com as atualizações que você fez. Caso contrário, não posso comentar as alterações recentes feitas por você para ver se elas estão corretas.
- Desculpe, eu quis dizer parênteses curvos. Você tem que consertar isso, caso contrário, continuará a falhar. Este é o mais importante de todos os pontos.
- a) Este ponto não é principalmente sobre o "_Símbolo", mas sobre o "!=" e o "continuar".
b) "_Symbol" é executado mais rapidamente porque é uma variável, enquanto "Symbol()" seria executado como uma chamada de função que é mais lenta. - OrderClosePrice() é o preço de fechamento atual do pedido. Se ainda estiver aberto, ele informará automaticamente o Bid ou Ask, dependendo do tipo de pedido. Por favor, leia os documentos para esta função.
- OK! Vamos ver as mudanças de código que você fez.
- OK! Vamos ver as alterações de código que você fez.
- Sim, para as trocas manuais, o número mágico é 0. Entretanto, em seu código defina o número mágico como um "externo" ou "input", atribuindo-lhe um "0" como padrão, e então use essa variável em seu código. Dessa forma, você pode facilmente usar o EA para outras situações ou reutilizar seu código para outros EAs.
- Eu expliquei como contabilizar o escorregamento. Certifique-se de que o "TrailStop > ( StopLevel + ( CurrentSpread * Factor )" onde o Factor é pelo menos "1.0" (idealmente "1.5" ou "2.0"; maior se você vir que ainda sofre um erro 130 devido a um escorregamento excessivo).
- Não há garantia de que 10 pontos seriam responsáveis pelo spread, pois o spread é diferente dependendo do Símbolo e está sempre mudando, especialmente durante eventos noticiosos e quando a liquidez é baixa, como durante as horas de folga.
- OK! Se o "FreezeLevel" não for usado, tudo bem, mas sugiro que você ainda o use em seu código, para que, caso você o use com um corretor diferente (que possa tê-lo), o EA ainda funcione.
- Fornecer novo código com mudanças para que ele possa ser analisado.
Muito obrigado. Vou analisar todos os conselhos e sugestões acima. Enquanto isso, aqui está o código mais recente. Também, acho que encontrei um erro nesta linha:
#property strict; extern string Label_TrailingStart="Pip threshold to activate TrailingStop"; extern int TrailingStart=12; extern int TrailingStop=5; double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10; int TS=TrailingStart-TrailingStop; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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+2)+" Pips"); } return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit(){ return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start(){ double Pip=Point*10; int ticket=0; if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2; /*Print("stoplevel = ",stoplevel); Print("TrailingStart = ",TrailingStart); Print("TrailingStop = ",TrailingStop); Print("TS = ",TS); Print("Buy error = ",GetLastError()); Print("OrderOpenPrice = ",OrderOpenPrice()); Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ", OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip); Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip); Print("TrailingStart*Pip = ",TrailingStart*Pip); Print("TrailingStop*Pip = ",TrailingStop*Pip); Print("OrderClosePrice = ",OrderClosePrice()); Print("OrderStopLoss = ",OrderStopLoss()); Print("OrderSymbol = ",OrderSymbol()); 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); Print("Ask = ",Ask); Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip), OrderTakeProfit(),Blue));*/ for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS)){ ticket++; if(OrderSymbol()==_Symbol){ if(OrderType()==OP_BUY){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){ if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){ RefreshRates(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue)) Print("Buy error = ",GetLastError()); } } } } if(OrderType()==OP_SELL){ if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){ if((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){ if(TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){ RefreshRates(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red)) Print("Sell error = ",GetLastError()); /*Print("Ask = ",Ask); Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip); Print("TrailingStart*Pip = ",TrailingStart*Pip);*/ } } } } } } return(0); } //+------------------------------------------------------------------+
Uma mudança bastante grande que fiz foi mudar a primeira linha abaixo para a segunda, porque acho que deve haver um valor maior que zero para o stoploss. Isso é verdade?
if(OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
O seguinte exemplo de código serve como uma possível solução/alternativa ao seu código. Observe, entretanto, que o código não foi testado ou depurado (apenas compilado), portanto, use-o apenas como "pseudo" código:
#property strict extern double dblTrailStartPips = 11.0, // Trailing Start (Pips) dblTrailStopPips = 5.0, // Trailing Stop (Pips) dblPipMultiplier = 10.0, // Pips to Points Multiplier dblSpreadFactor = 2.0; // Spread Factor for Slippage Compensation extern int intMagicNumber = 0; // Magic Number (0 for Manual Orders) double dblTickSizeDelta, // Size of a Tick (Delta) dblStopLevelDelta, // Market Stop Level (Delta) dblTrailStartDelta, // Trailing Start (Delta) dblTrailStopDelta; // Trailing Stop (Delta) // Initialisation int OnInit() { dblTickSizeDelta = MarketInfo( _Symbol, MODE_TICKSIZE ); dblStopLevelDelta = MarketInfo( _Symbol, MODE_STOPLEVEL ) * _Point; dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier * _Point; dblTrailStopDelta = dblTrailStopPips * dblPipMultiplier * _Point; return( INIT_SUCCEEDED ); } // Process Tick Event void OnTick() { double dblSpreadDelta = Ask - Bid, dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ), dblTrailDelta = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta; for( int i = OrdersTotal() - 1; i >= 0; i-- ) { if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) { if( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) ) { int intDirection = 0; switch( OrderType() ) { case OP_BUY: intDirection = +1; break; case OP_SELL: intDirection = -1; break; default: continue; } double dblOpenPrice = OrderOpenPrice(), dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection; if( dblCloseDelta > dblTrailStartDelta ) { double dblStopLossPrice = OrderStopLoss(), dblStopLossDelta = ( dblStopLossPrice - dblOpenPrice ) * intDirection, dblTrailingDelta = dblCloseDelta - dblTrailDelta; if( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) ) { double dblStopLoss = round( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta; if( dblStopLoss != dblStopLossPrice ) { if( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) ) { Print( "Order Modification Failed with Error: ", GetLastError() ); } } } } } } } }
Experimente este Trader3000
Compare este código com o que você já tem... é muito parecido e eu o uso há anos e funciona como uma bomba...
//+------------------------------+ //| TRAILING STOP Function | //+------------------------------+ void Trailing_Stop_Function() { bool Ticket_TS_Long; for(int iTS_Long = OrdersTotal() - 1; iTS_Long >= 0 ; iTS_Long --) { if(OrderSelect(iTS_Long,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumberLong && Trailing_Stop_In_Pips > 0 && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier)) { Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green)); if (Ticket_TS_Long != true) { Print("TS-Order Modify Error ",GetLastError()); } } } bool Ticket_TS_Short; for(int iTS_Short = OrdersTotal() - 1; iTS_Short >= 0 ; iTS_Short --) { if(OrderSelect(iTS_Short,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumberShort && Trailing_Stop_In_Pips > 0 && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier)) { Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green)); if (Ticket_TS_Short != true) { Print("TS-Order Modify Error ",GetLastError()); } } } }
Trail_Após_Pips_Profit é uma variável externa dupla que o usuário preenche...e
PipMultiplier é uma função simples que calcula o valor do ponto decimal da moeda...
Se você não usar MagicNumbers, exclua esse critério....
Isto irá... ou melhor, "deve" rastrear qualquer ordem em qualquer gráfico.....
Eu estou sob correção, mas funciona para mim....
//+------------------------------------------+ //| Check for 5 Digits - Pipmultiplier | //+------------------------------------------+ if(Digits==5||Digits==3) { PipMultiplier = 10*Point; } else if(Digits==2) { PipMultiplier = 100*Point; } else { PipMultiplier = Point; }
Estou impressionado com sua ajuda FMIC.... Boa
@Mike.T: Algo parece estar errado com seu código PipMulytiplier:
else if(Digits==2) { PipMultiplier = 100*Point; }
Isso não parece estar correto! Por que multiplicá-lo por 100 para símbolos de 2 dígitos? Não deve ser multiplicado de forma alguma! Deveria ser a mesma condição que os símbolos de 4 dígitos.
Aqui está um exemplo. Se o preço de USD/JPY passar de 108,65 para 108,77; isto é um aumento de 12 pip, não 1200 pips!Obrigado!
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.
Do que... não sabia que.... assim... (sem hi-jacking este fio)... Eu prefiro usar OrderClosePrice() em vez de Bid or Ask...?
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Olá a todos. Não consigo fazer com que meu EA funcione corretamente. Estou executando-o em 10 pares/cartas diferentes simultaneamente. Parece haver dois problemas:
1. não aciona o Trailingstop na maioria das vezes, mas às vezes funciona. Acho que o problema está na minha OrderSelect, mas não consigo resolvê-lo.
2. às vezes me dá o erro 130, mas não consigo ver como meu SL/TP pode ser inválido. Todos os valores que estou imprimindo estão acima do rolo para todos os pares. E mesmo que eu receba o erro 130, às vezes ele de fato modifica a ordem como se nada estivesse errado.
Aqui está todo o EA. Você poderia, por favor, dar uma olhada e me informar qual pode ser o problema?