Por que minha EA continua dando lucro negativo quando volta a testar? - página 3

 
deVries:

quando você inicia seu Metatrader, a EA tem que descobrir se há um comércio aberto

Eu faço apenas a contagem regressiva do loop para verificar o comércio se houver um comércio

Se eu o defino no início em um e OrdensTotal() >0 então eu o faço verificando as negociações if(.......> ||| .......> ){do the loop....

você tem certeza que você me deu o código que lhe deu os resultados mostrados acima? eu o testei no período de 1440 (1 DIA ) e nenhuma negociação foi executada. no entanto, quando eu o mudei para 1M muitas negociações foram executadas
 
cyxstudio:
você tem certeza que você me deu o código que lhe deu os resultados mostrados acima? eu o testei no período de 1440 (1 DIA ) e nenhuma negociação foi executada. no entanto, quando eu o mudei para 1M muitas negociações foram executadas
quantos dias atrás seus dados se você verificar meu teste novamente você encontrará o período do teste e o período de tempo testado em
 

OK, aqui vai.....I tentará ajudar aqui se eu puder.

Esta pergunta Ma_Shift é uma pergunta que eu tinha há algum tempo e nunca consegui obter uma resposta clara.

Se você notar em seu código que está usando um turno de 8 em suas médias móveis.... o que isso significa?

MA200 = iMA(NULL, 0, 200, 8,MODE_SMA,PRICE_CLOSE, 0);MA5 = iMA(NULL, 0, 5, 8,MODE_SMA,PRICE_CLOSE, 0);CurrentRSI = iRSI (NULL, 0, VarPeriod,PRICE_CLOSE,0);
Como você pode ver este ajuste de turno não existe no RSI... ele exibe em sua própria janela... isso é uma pista.
Se você deixar cair uma média móvel em seu gráfico, você verá o que equivale ao Ma_Shift como uma configuração na caixa de turnos.
Observe também a ordem dos parâmetros 200,8,sma, fechar. são os mesmos quando você chama o indicador
como a ordem em que estão listados na caixa...o NULL e o cronograma são o que você deixar cair o Ma
por isso não são necessários aqui. nem é o último turno... já que esta mãe estará constantemente mudando no 
atual candle.... você vai entender isso em um momento.
Se você for e olhar as configurações do indicador iAlligator, você verá as configurações para o deslocamento do maxilar, deslocamento dos dentes e deslocamento dos lábios... esta é a média MaShift de cada uma dessas médias Moving.
todas elas podem ser deslocadas na tabela para a esquerda ou para a direita, como muitas barras você quiser.

que exibe como esta............

Isto faz uma diferença de 3 pip no valor desta vela das 08:00, como mostrado aqui na janela de dados.

O que nos leva à pergunta: Para que serve a configuração "Shift" no final?

Bem, ao passar o mouse sobre seu gráfico com a janela de dados aberta e passar de vela em vela

você verá os números mudarem para os 5 SMA ao passar de vela em vela.

É disso que se trata o último valor SHIFT... tendo em mente que a vela atual que está sendo

vela zero... a última vela completada é a vela 1, portanto, se houver um total de 1000 velas acesas, a última vela completada é a vela 1

sua tabela são numerados para trás a partir de 999 na borda esquerda de sua tabela até 0 onde você

Portanto, se você quiser saber qual era o valor das 5 SMA 5 velas concluídas há

você coloca um 5 nesse último lugar... claro que à medida que o tempo avança... a vela 5 mudará para a próxima vela.

Agora como foi mencionado... se você está sempre recebendo o valor da vela 0... então esse valor é constantmente

mudando com o preço. Portanto, você pode pegar um sinal e então o indicador repintar em você ... mas se você estiver

sempre pedindo as informações da vela 1 é feito e não mudará....

Espero que isto ajude...

 
cyxstudio:

Eu refiz tudo e consertei o loop, o deslizamento, consertei a média móvel e os valores do RSI, certifiquei-me de que todas as posições abertas fossem fechadas antes de começar uma nova posição. mas quando eu volto atrás, nada acontece, nenhuma compra/venda foi executada... qual é o problema com isso novamente?



a função init() só funciona na inicialização e não em cada tic como a função start()... você precisará colocar as médias móveis de volta na função start ao invés de na função init() apenas para que ela funcione para que ela continue recebendo números novos...
 

Retrabalhados

Adicione um recurso onde o EA verificará se há alguma ordem pendente antes de decidir abrir uma nova posição. Se houver uma ordem pendente ou aberta, ela não tentará mais abrir.em

vejo que todos usam um loop para verificar se há uma posição aberta antes de comprar, não consigo ver a lógica disso. desde que OrdensTotal seja > 0 há ordens abertas e minha EA não procurará abrir mais posições.

fixou o laço decrescente.

Desta vez me dá OrderClose erro 138 que não pode ser resolvido com a adição de refrescos()

e ainda assim acabo perdendo dinheiro, o que não deveria.

não consigo pensar em mais nada para consertar...

//+------------------------------------------------------------------+
//|                                       RSI_strategy_cyxstudio.mq4 |
//|                                  Copyright 2013, Tjipke de Vries |
//|                                     https://forum.mql4.com/53695/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern int RSIPeriod        =  3;      //number of periods for RSI
extern double UpperBound    =  90;     //set upper bound value for RSI
extern double LowerBound    =  5;      //set lower bound value for RSI
extern int MASlowPeriod     = 200;
extern int MAFastPeriod     = 5;
extern double Lots  = 0.1;
extern double StopLoss      = 60;       //Set the stop loss level
extern double TakeProfit    = 120;       //Set the take profit level
extern double TrailingStop = 40;
//extra settings for OrderSend
extern int        MagicNumber = 54333;
extern string     CommentEA = "RSI strategy";
extern int        Slippage.Pips    = 3;


int    BUYS=1,SELLS=1;
//++++ These are adjusted for 5 digit brokers.
int     pips2points;      // slippage  3 pips    3=points    30=points
double  pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int     Digits.pips;      // DoubleToStr(dbl/pips2dbl, Digits.pips)
//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
   if(Digits % 2 == 1)  // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
     {pips2dbl = Point*10; pips2points = 10;   Digits.pips = 1;}
     else {pips2dbl = Point;    pips2points =  1;   Digits.pips = 0;}
     // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl        
//----      

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket;
   double SL,TP;
   int Total;
   double MagicNo;
   double Slippage;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
  
   int Ticket2;
   int cnt;
   
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   
   if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow)   ;       //execute buy order
   
    if(Ticket>0)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("BUY order opened : ",OrderOpenPrice());
            
           }
         if (Ticket < 0) {
         Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
   }
  
  }
  
  
 
  if (CurrentRSI > UpperBound && pBid < MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, 3, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",000, 0, Yellow)  ;     //execute sell order
       if(Ticket2>0)
           {
            if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("SELL order opened : ",OrderOpenPrice());
           
           }
         if (Ticket2<0) {
          Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      
   
   } 
   }
   
   if (OrdersTotal() > 0 ) {
   
   int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   RefreshRates();
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   
   if (pAsk > MA5){      //condition to close long position
   RefreshRates();
    OrderClose(OrderTicket(),OrderLots(),pBid,3,Violet); // close long position
 
   return(0); // exit
   
   if(TrailingStop>0)  
              {                 
               if(pBid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<pBid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pBid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
   
  }
   
   if(pBid < MA5){       //condition to close short position
   RefreshRates();
   OrderClose(OrderTicket(),OrderLots(),pAsk,3,Violet); // close short position
  
   return(0); // exit
   
   
  if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-pAsk)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(pAsk+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
   }
   
      if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop
   
   
   }
  
   
   
   
   
   
        
        
           return(0);
}
 
cyxstudio:

Retrabalhados

Adicione um recurso onde o EA verificará se há alguma ordem pendente antes de decidir abrir uma nova posição. Se houver uma ordem pendente ou aberta, ela não tentará mais abrir.em

vejo que todos usam um loop para verificar se há uma posição aberta antes de comprar, não consigo ver a lógica disso. desde que OrdensTotal seja > 0 há ordens abertas e minha EA não procurará abrir mais posições.

fixou o laço decrescente.

Desta vez me dá OrderClose erro 138 que não pode ser resolvido com a adição de refrescos()

e ainda assim acabo perdendo dinheiro, o que não deveria.

não consigo pensar em mais nada para consertar...

Por que você colocou a lógica para abrir uma compra antes de verificar os negócios que sua EA abriu em sua conta ????

O que vai acontecer agora ???? com a programação que você tem até agora ???

Assumir que você tem uma conta em funcionamento com sua EA. Você abre manualmente uma negociação por GBPUSD.

Quantas negociações são ordensTotal() com essa negociação ????

Seu código.... para COMPRAR

if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


  
        
        
        if (OrdersTotal() == 0 ) {
        
        if (CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow)   ;       //execute buy order
   
    if(Ticket>0)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("BUY order opened : ",OrderOpenPrice());
            
           }
         if (Ticket < 0) {
         Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
   }
  

o que isso está fazendo agora ???? e por que razão está fazendo isso ????

 
deVries:

Por que você colocou a lógica para abrir uma compra antes de verificar os negócios que sua EA abriu em sua conta ????

O que vai acontecer agora ???? com a programação que você tem até agora ???

Assumir que você tem uma conta em funcionamento com sua EA. Você abre manualmente uma negociação por GBPUSD.

Quantas negociações são ordensTotal() com essa negociação ????

Seu código.... para COMPRAR

o que isso está fazendo agora ???? e por que razão está fazendo isso ????


comprar somente se as condições de compra tiverem sido cumpridas e se nenhuma posição tiver sido aberta
 
cyxstudio:

comprar somente se as condições de compra tiverem sido cumpridas e se nenhuma posição tiver sido aberta

Assumir que você tem uma conta em funcionamento com seu EA. Você abre manualmente uma negociação por GBPUSD.

a condição será verdadeira

 if (OrdersTotal() == 0 )
 
cyxstudio2013.01.31 18:04

você poderia por favor me deixar dar uma olhada em seus códigos?

eu não queria saber por que falhei e como acertá-lo.

.

Sua mensagem para mim eu posso lhe dar o código completo diretamente.....

Isso não será de graça. Para isso você tem que usar a seçãoJobs e pagar para obtê-lo...

Você o receberá então lá

.

Outra maneira é ler bem seus tópicos

Estamos aqui para ajudá-lo a aprender como programá-lo você mesmo. Essa é uma ajuda gratuita

Nós lhe mostramos seus erros e o ajudamos na direção de como resolvê-los.

Eu mostro o código que tenho no momento em que você aprendeu uma maneira de escrevê-lo ....

Não há necessidade de pagar então e você pode comparar esse momento com o código que você fez aqui com a ajuda deste fórum.

....

minha última pergunta aqui ainda não foi respondida

Assumir que você tem uma conta em funcionamento com seu EA. Você abre manualmente uma negociação por GBPUSD.

a condição será verdadeira

 if (OrdersTotal() == 0 )

.

. Em outro tópicoOrderClose error 138

você foi muito bem ajudado lá(RaptorUK e WHRoeder obrigado pela explicação lá eu acho muito bem feito)

.

Outra pergunta que tenho para você é

Por que você mudou o prazo neste cálculo da Média Móvel

   double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average

Isto não é o mesmo que eu dei,

Não é calcular o valor correto em outro gráfico Diariamente

.

Portanto, reserve um tempo para aprender e praticar e leia atentamente a ajuda que você recebe aqui neste fórum

ou você paga a alguém para programar para você em um site como Jobs

 
deVries:
cyxstudio2013.01.31 18:04

você poderia por favor me deixar dar uma olhada em seus códigos?

eu não queria saber por que falhei e como acertá-lo.

.

Sua mensagem para mim eu posso lhe dar o código completo diretamente.....

Isso não será de graça. Para isso você tem que usar a seçãoJobs e pagar para obtê-lo...

Você o receberá então lá

.

Outra maneira é ler bem seus tópicos

Estamos aqui para ajudá-lo a aprender como programá-lo você mesmo. Essa é uma ajuda gratuita

Nós lhe mostramos seus erros e o ajudamos na direção de como resolvê-los.

Eu mostro o código que tenho no momento em que você aprendeu uma maneira de escrevê-lo ....

Não há necessidade de pagar então e você pode comparar esse momento com o código que você fez aqui com a ajuda deste fórum.

....

minha última pergunta aqui ainda não foi respondida

Assumir que você tem uma conta em funcionamento com seu EA. Você abre manualmente uma negociação por GBPUSD.

a condição será verdadeira

.

. Em outro tópicoOrderClose error 138

você foi muito bem ajudado lá(RaptorUK e WHRoeder obrigado pela explicação lá eu acho muito bem feito)

.

Outra pergunta que tenho para você é

Por que você mudou o prazo neste cálculo da Média Móvel

Isto não é o mesmo que eu dei,

Não é calcular o valor correto em outro gráfico Diariamente

.

Portanto, reserve um tempo para aprender e praticar e leia atentamente a ajuda que você recebe aqui neste fórum

ou você paga a alguém para programar para você em um site como Jobs

asordensTotal() devem revelar a quantidade total de ordens pendentes e ordens de mercado, independentemente de terem sido abertas através de EA ou manual?

Eu estava pensando desta forma. Minha EA sempre verificará se há ordens abertas e se houver, ela não abrirá mais ordens e só abrirá novas ordens quando não houver ordens abertas.

if (OrdersTotal() == 0 )

Acho que está funcionando bem porque minha seção de resultados me mostra a seqüência de pedidos 1,1,2,2,3,3,3,4,4, o que significa que um pedido é fechado antes que um novo pedido seja aberto.

as variáveis de média móvel e LER mudaram devido a razões de teste. Eu estava experimentando em um período/período diferente, mas não o mudei quando o coloquei aqui.

e o mais bizarro de todos , meu código SOMENTE executará ordem de compra. nunca executou nem mesmo uma...ordem de venda. isso é simplesmente estranho,

em poucas palavras, os problemas que ainda estou enfrentando agora.

1. ele só executa a compra, mas nunca executa a venda, apesar do fato de eu ter codificado a venda

2. Ainda tendo lucro negativo, o que eu estou confiante que esta estratégia não é suposto.