Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 65

 

Bom dia a todos vocês! Se eu tentei colocar um stop loss em uma rede de arrasto, eu não vi este problema no Testador de Estratégia. No Testador de Estratégia, quando o EA deve colocar uma parada na perda, ele não faz isso, mas às vezes faz, mas eu não encontrei nenhuma regularidade e a precisão dos testes sofre muito. O mesmo Expert Advisor no depósito de demonstração mostra que a rede de arrasto funciona. O terminal não informa nenhum erro. Isto é um bug no código ou um bug no terminal? Você pode me ajudar a entender isso? Eu tentei todo o código e não entendo o que está errado, não quero mudar a estratégia da trilha. Anexei o código completo do Expert Advisor e abaixo está o código da rede de arrasto (trilha ligeiramente modificada na sombra do candelabro por Yury Dzyuban)

void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent) {  
   int i;
   double new_extremum;

   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
   } 
   if (OrderType()==OP_BUY) {
      for(i=1;i<=bars_n;i++) {
         if (i==1) new_extremum = iLow(Symbol(),tmfrm,i); else if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
      }  
  
      if ((((new_extremum - indent*Point)>OrderStopLoss() + 1.0 * Point) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && (getLots(new_extremum) > 0))
      if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
   }
   if (OrderType()==OP_SELL) {
      for(i=1;i<=bars_n;i++) {
         if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i); else if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
      }         
      if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss() - 1.0 * Point) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && (getLots(new_extremum) > 0))
      if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());     
   }      
}

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}
Arquivos anexados:
avalanche.mq4  12 kb
 
Em que prazo e com que qualidade você testa?
 

EURUSD, M1, 99%, 90%

No início eu usei o histórico padrão do tick, carregado com MT, encontrei este problema, bem como lacunas inexplicáveis no histórico de cotações, então mudei para Tick Data Suite, fiz o download de cotações do Dukascopy, a qualidade aumentou de 90 para 99, mas o problema persiste.

ZS: Provavelmente a mesma situação na vida real, ou eu não testei o suficiente (cerca de 3 semanas), durante esse período eu tive que fechar manualmente várias vezes porque a rede de arrasto não estava instalada, mas eu pensei que era porque eu tinha que desconectar a máquina terminal periodicamente e isso de alguma forma afetou a operação da EA, recentemente a mudei para o VPS talvez uma semana atrás e agora parece estar desenhando a mesma situação

 

O teste é realizado em um período de tempo que é igual ao valor da variável tmfrm ou não?

se não, você deve ter certeza de que há um histórico no cronograma tmfrm.

e o número de tanques transmitidos na variável bars_n corresponde ao intervalo de tempo transmitido na variável tmfrm ?

 
keekkenen:

O teste é realizado em um período de tempo que é igual ao valor da variável tmfrm ou não?

se não, você deve ter certeza de que há um histórico no cronograma tmfrm.

e o número de tanques passados na variável bars_n corresponde ao intervalo de tempo passado na variável tmfrm ?


Sim, acho que você está certo, negligenciei o código da função de outra pessoa, não o analisei profundamente e não levei esse parâmetro em consideração. Como resultado, a parada de perda foi definida para um período diferente. Obrigado por sua ajuda.

ZS: É sempre assim: alguma coisinha faz o código não funcionar da maneira que eu gostaria que funcionasse.

 

Boa tarde! Quem sabe o que diabos está acontecendo com o tijolo vermelho no tronco!

2013.08.05 08:00:41 '9291791': Sinal - não encontrado sinal de atualização - 7400 na base

Não há nada de errado com meu código! E com sinais também! O que isso significa?

 
Mepkypuu:


Sim, parece que você está certo, eu negligenciei o código da função de outra pessoa, não o analisei em detalhes e não levei este parâmetro em consideração. Como resultado, a parada de perda foi definida para um período diferente. Obrigado por sua ajuda.

ZS: É sempre assim: alguma coisinha faz o código não funcionar como eu gostaria que funcionasse.


Fiquei feliz com isso muito cedo, o caminho começou a funcionar melhor, mas na história ainda há casos em que não funciona, ou seja, o problema só é parcialmente resolvido.
 
splxgf:

Você conserta o spread? Porque durante as corridas o spread atual é tomado, mas durante as notícias e à noite ele difere do spread diário.

Como você corrige a propagação? Afinal de contas, a OrderSend especifica ou Ask ou Bid.
 
Mepkypuu:

Ainda não estou contente com isso, o trilho está funcionando melhor, mas ainda há casos em que não funciona, ou seja, o problema só é parcialmente resolvido.

O que você chama de Trailing não é realmente Trailing, ele é calculado de uma maneira diferente e seu comportamento pode ser ilógico.
 
Leo59:

Como pode ser fixado o spread? Afinal de contas, a OrderSend especifica ou Ask ou Bid.
No testador sob a TF!