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

 
WHRoeder:
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


Eu realmente aprecio a ajuda que você e todos os outros estão fornecendo. Eu tentei de tudo nos últimos dias para conseguir isso compilado e peço desculpas por não ter pedido. A maioria de vocês sugeriu que eu adie o uso de meu próprio código e use o código de outra pessoa, mas eu não vou aprender se eu não entender o que estou fazendo de errado. Para mim, meu código parece sólido. Estou pedindo que conte as ordens por posição e selecione somente aquelas que atendem aos meus critérios e depois modifique aquele comércio específico. Até agora, após 4 páginas ninguém indicou qual linha do meu código está quebrada. A menos que eu veja e entenda primeiro o que estou fazendo de errado, não me ajudará a aprender usando o código de outra pessoa. Meu objetivo agora não é ter um Trailingstop EA que funcione, porque há muito por aí, mas para eu aprender a codificar, para que eu possa seguir em frente. Na verdade, meu código era quase idêntico ao código que Jimdandy postou em seu Youtube Tutorial on Trailingstops. Como é praticamente idêntico ao dele, eu copiei o código quase literalmente (exceto que eu quero negociar manualmente), mas seu código só funciona às vezes também.

Imprimi algumas coisas. Esta troca é quase 300 pontos além do ponto em que especifiquei que o Trailingstop entra em vigor (que foi de 150 pontos):

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderModify = false

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Pergunte = 1.45926

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbypos = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbyticket = 1

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: bilhete = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSelect = true

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: EncomendasTotal = 16

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSymbol = EURUSD

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828

2016.04.22 00:17:58.934 Trailing_v33 EURAUD,M15: OrderModify = false

Este EA só é colocado no EURAUD. Como você pode ver, há 16 pedidos abertos em 9 outros gráficos. O número do bilhete selecionado para este par está completamente errado e o OrderSymbol está completamente errado. Ambos são para um pedido EURUSD aberto. Com base no acima exposto, meu para loop selecionou a posição 0 neste caso, enquanto o EURAUD que deveria selecionar estava na posição 14 (15-1). Por quê? Eu disse a ele para ignorar isto.

No vídeo acima mencionado Jim realmente entrou neste problema, e disse que ele usa o seguinte código para superar meu problema, no entanto, este é um contador para enviar pedidos corretamente e não uma função para filtrar pedidos. Eu tentei usá-lo como um filtro, mas não consegui.

int OpenOrdersThisPair(string pair){
   int total=0;
      for(int s= OrdersTotal()-1; s>= 0; s--){
         OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
           if(OrderSymbol()==pair) total++;
       }
   return(total);  
}

Alguém pode criticar meu código para que eu possa aprender com isso e me dizer por que ele não funciona em vários gráficos. Sei que não pode ser tão ruim assim porque às vezes funciona perfeitamente. Obrigado.

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=10;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10,Pip=Point*10;
int TS=TrailingStart-TrailingStop;
bool UseTrailingStop=true,UseAutotrading=true;
//+------------------------------------------------------------------+
//|  Expert initialization function                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
    MessageBox("Please note: Your inputs cannot be less than the minimum levels required"+
            "\nby your broker. Please reload the EA and either increase the value of the"+
            "\nTrailingStart and/or decrease the value of the TrailingStop so that "+
            "\nTrailingStart-TrailingStop >= "+StringConcatenate(stoplevel)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|    Expert deinitialization function                              |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|   Expert start function                                          |
//+------------------------------------------------------------------+
int start(){
   if(UseTrailingStop) Trailing(); 
   if(UseAutotrading) Autotrading();  
   return(0);
}
//+------------------------------------------------------------------+
void Trailing(){
for(int b=OrdersTotal()-1; b>=0; b--){
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_BUY)
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip))
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip))
                        OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue);
   }     
   for(int s=OrdersTotal()-1; s>=0; s--){
     if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_SELL)
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip))
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0)
                        OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red);
   }
}
void Autotrading(){
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
}


 
Trader3000:

Até agora, após 4 páginas, ninguém indicou qual linha do meu código está quebrada.

Não é verdade! Nós descrevemos seus erros e oferecemos soluções para eles em muitos sabores e alternativas. No entanto, você os ignora e continua a fazê-lo SEU CAMINHO. Não só isso, agora você ainda piorou a situação, acrescentando mais erros.

Quando um pintor aprende a pintar, ele o faz primeiro enfrentando as técnicas de outros que o dominaram. Somente quando ele se sente confortável com estas técnicas é que começa a criar seu PRÓPRIO CAMINHO de pintura.

Aqui está uma pequena lista de "minha crítica":

  1. Use seu aparelho (colchetes "encaracolados"). Não tente economizar neles. Até que seu código esteja totalmente funcional e depurado, adicione-os mesmo que apenas por uma única linha esteja contida no bloco. Coloque então em uma linha separada também. Não se preocupe se você tiver muito espaço em branco. Você pode sempre voltar e limpá-lo, mas no início, você quer ter certeza de que tudo está dentro de seu bloco de código correto e que os suportes e parênteses estão equilibrados. Cordar várias afirmações "se" em uma cadência é uma receita para o desastre, pois é muito difícil de depurar, especialmente com um compilador fininho como este.
  2. Seu código original tinha apenas um loop que agora você transformou em dois por nenhuma razão aparente, exceto para tornar seu código ainda mais lento e repetir os lugares que você tem que corrigir quando há bugs.
  3. Use variáveis para armazenar os resultados das expressões! Você repete as mesmas expressões várias vezes, tornando seu código não só mais lento, mas mais propenso a erros e mais difícil de ler e corrigir porque você tem que mudá-las em vários lugares.

Há mais coisas que eu poderia listar, mas conserte-as pelo menos, de uma vez por todas!

A codificação é como qualquer outra linguagem. Sim, você pode simplesmente juntar palavras, mas isso não faz de você um poeta. Na codificação você também tem que ter ritmo e estrutura, a fim de torná-la legível e funcional.

 
FMIC:

Aqui está uma pequena lista de "minha crítica":

Ok, muito obrigado por isso. Na verdade, eu tinha parênteses para todas as minhas declarações de "se" inicialmente de acordo com o código que coloquei aqui anteriormente, mas como esse código não funcionou, tentei várias outras coisas, o que incluiu copiar o código que colei no meu post anterior. Como mencionei, este código nem sequer é meu, mas também não funciona em todos os pares. No entanto, vou substituir os parênteses novamente e seguir os outros conselhos. Enquanto isso, soube que a OrderSelect imprimirá o Símbolo do primeiro pedido no terminal e não aquele em que a EA está, de modo que na verdade isso não estava errado.

EDIT: Obrigado pela sugestão #3!!!!!!! Acho que este foi o problema, porque a ordem deve primeiro ser selecionada pelo Symbol e ENTÃO o valor deve ser armazenado. Então eu movi a variável para abaixo dessas funções como abaixo, e parece funcionar agora (mas mais testes são necessários antes que eu saiba com certeza

int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10,TSTP=TrailingStart*Pip,Trail=TrailingStop*Pip,SL=StopLoss*Pip;               
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail,OrderTakeProfit(),Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
 
Trader3000:

Ok, muito obrigado por isso. Na verdade, eu tinha parênteses para todas as minhas declarações "se" inicialmente de acordo com o código que coloquei aqui anteriormente, mas como esse código não funcionou, tentei várias outras coisas, o que incluiu copiar o código que colei no meu post anterior. Como mencionei, este código nem sequer é meu, mas também não funciona em todos os pares. No entanto, vou substituir os parênteses novamente e seguir os outros conselhos. Enquanto isso, soube que a OrderSelect imprimirá o Símbolo do primeiro pedido no terminal e não aquele em que a EA está, de modo que na verdade isso não estava errado.

EDIT: Obrigado pela sugestão #3!!!!!!! Acho que este foi o problema, porque a ordem deve primeiro ser selecionada pelo Symbol e ENTÃO o valor deve ser armazenado. Então eu movi a variável para abaixo dessas funções como abaixo, e parece funcionar agora (mas mais testes são necessários antes que eu saiba com certeza

Dando uma olhada em seu último código, eu tenho isto a dizer - Eu AUTORIZO! (Você se recusa a seguir adiante)!
 
FMIC: Dando uma olhada em seu último código, eu tenho isto a dizer - Eu AUTORIZO! (Você se recusa a seguir adiante)!
Agora talvez você entenda minha "crítica dura " quando eles desperdiçam o tempo de todos. Enquanto eu entendo "coisas simples", eles acham que é aceitável desperdiçar o tempo de todos, eu não o faço.

Trader3000: Eu acho que este era o problema...
int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip, SL=StopLoss*Pip;
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail, OrderTakeProfit(), Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
Seu problema é que você não pensa.
int start(){
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue;
// Everything below is executed if NO order is selected or a selected order is symbol
      double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip;
      if(OrderType()==OP_BUY)
      && Bid-OrderOpenPrice()>TSTP)
      && OrderStopLoss()<Bid-Trail){
         if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange))
            Print("Error Buy TrailingStop: ",GetLastError());
      }
   :
 
WHRoeder:
Agora talvez você entenda minhas "duras críticas " quando eles desperdiçam o tempo de todos. Embora eu entenda "coisas simples", eles acham que é aceitável desperdiçar o tempo de todos, eu não o faço.

Sim! Infelizmente, parece que você está correto!

 

Assim, mudei o código de volta para uma versão anterior conforme abaixo. Com isso, parece estar funcionando perfeitamente em todos os pares em que o rochedo é 50 pontos, mas não em pares em que o rochedo é mais alto, por exemplo, EURAUD, mesmo que as variáveis externas sejam mais altas que o rochedo.

extern int TrailingStart=15;
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)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
   int ticket=0,buy_ticket=0,sell_ticket=0;  
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol()){
      ticket++;
      if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
      if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
      }
            if(OrderType()==OP_BUY){
               if(OrderSelect(buy_ticket,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(OrderType()==OP_SELL){
               if(OrderSelect(sell_ticket,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);
}
//+------------------------------------------------------------------+
 

Também encontrei outro EA que tem um código muito semelhante ao meu e comparei o código. Destaquei as principais diferenças.

1. aumentos ao invés de decretos

2. multiplicar tudo com o Point em vez do Point*10

3. ele adiciona o Trailingstop e Trailingstep juntos e depois subtrai um e modifica a ordem com o Trailingstep. Se eu entender isso corretamente, o Trailingstart será ativado após um movimento de 15 pips (150 pontos). Em meu EA, o preço ficará para trás em 5 pips e será parado se o preço cair novamente e atingir este nível de 5 pips. Em seu EA, também será ativado após 15 pips, mas a quantidade de pips que fica para trás é 19 (15+5-1), então o preço tem que cair em 19 pips para ser parado. Como exemplo: OrderOpenPrice é 1.50000. O preço sobe 150 pontos para 1.50150, o que ativa o Trailingstop. Se o preço cair de novo para 1.50100, ele será parado por um lucro de 5 pips. Em seu EA, o Trailingstop também é ativado a 1.50150, mas o trail está a 1.49960, o que eu acho que causaráerro 130, já que a parada é para fechar o rochedo. Ou eu estou entendendo isso mal?

Meu problema poderia ser com um ou mais destes?

//+------------------------------------------------------------------+
//|                                                   e-Trailing.mq4 |
//|                                           Êèì Èãîðü Â. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 12.09.2005 Àâòîìàòè÷åñêèé Trailing Stop âñåõ îòêðûòûõ ïîçèöèé    |
//|            Âåøàòü òîëüêî íà îäèí ãðàôèê                          |
//+------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ------------------------------------------
extern bool   ProfitTrailing = True;  // Òðàëèòü òîëüêî ïðîôèò
extern int    TrailingStop   = 15;     // Ôèêñèðîâàííûé ðàçìåð òðàëà
extern int    TrailingStep   = 5;     // Øàã òðàëà
extern bool   UseSound       = True;  // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound  = "expert.wav";  // Íàèìåíîâàíèå çâóêîâîãî ôàéëà

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      TrailingPositions();
    }
  }
}

//+------------------------------------------------------------------+
//| Ñîïðîâîæäåíèå ïîçèöèè ïðîñòûì òðàëîì                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
      if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
      if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
        return;
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Ïåðåíîñ óðîâíÿ StopLoss                                          |
//| Ïàðàìåòðû:                                                       |
//|   ldStopLoss - óðîâåíü StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+
 
Trader3000:

Também encontrei outro EA que tem um código muito semelhante ao meu e comparei o código.

Vamos ver se entendi esta sua lógica! Você está disposto a encontrar outro EA de alguém de quem sabe onde e está disposto a incorporar esse código no seu, MAS VOCÊ NÃO VAI buscar um código que foi especificamente escrito para ajudá-lo e corrigir seus problemas!!!

WOW! Como LOGICAL de vocês! Onde está SPOCK quando você precisa dele!

SPOCK, que você descanse em paz! Todos nós sentimos sua falta!

 
FMIC:

Vamos ver se entendi essa sua lógica! Você está disposto a encontrar outro EA de alguém de quem sabe onde e está disposto a incorporar esse código no seu, MAS VOCÊ NÃO VAI buscar um código que foi especificamente escrito para ajudá-lo e corrigir seus problemas!!!

WOW! Como LOGICAL de vocês! Onde está SPOCK quando você precisa dele!

SPOCK, que você descanse em paz! Todos nós sentimos sua falta!

Depois de voltar ao código que você e Mike postaram na primeira página, eu vi o meu erro. Provavelmente eu o ignorei por ser tão sutil, mas principalmente porque eu não entendia bem a lógica do código. O problema é que eu pensava que a quantidade de pip para o TrailingStop era a quantidade de pips que ele estava atrás. Mas o número de pips que ele fica atrás é na verdade o TrailingStart-TrailingStop. Então minhas configurações estavam abaixo do rolo para pares como o gbpjpy porque eu inseri 15 e 5. Já que 5 está abaixo do rolo de 8. Ao simplesmente aumentar o TrailingStop ele agora funciona em todos os pares. Obrigado!!!