Verificação de Velas Abertas - página 4

 
GumRai:

Pequena mudança, pois estava verificando o fechamento de um pedido quando não havia nenhum.

De acordo com o código, não há motivo para que uma venda seja aberta imediatamente, uma compra é fechada.

A condição para sair de uma compra não é a mesma que as condições para abrir uma venda .

Lembre-se que como você só está verificando na vela aberta, Fechar[0] será o valor da oferta do primeiro tick recebido para a vela.

Ei GumRai,

Eu estava me perguntando se você seria capaz/ disposto a me ajudar um pouco mais com meu código? Se você pudesse me dizer quais códigos eu deveria pesquisar, eu mesmo tentarei codificá-los primeiro e depois voltarei com quaisquer perguntas.

O que eu quero é que, uma vez que uma troca é feita, ela coloque um Stop Loss em, digamos, 50 pips (que é o que ela faz agora). No entanto, uma vez que o preço se move 60 pips na direção da troca, ele move SL para o breakeven, e mais adiante se torna uma parada móvel a 70 pips de distância da troca.

Como eu faria isso? Como sempre, qualquer ajuda seria muito apreciada.

 

Para o break-even, eu sempre mudo o SL para break-even + 1 ponto, pelo menos. Isso evita possíveis problemas com a comparação de duplas em verificações posteriores.

É simplesmente um caso de verificação de 2 condições (para uma compra)

OrderOpenPrice()>OrderStopLoss()

e

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

então modifique o pedido para que o SL seja o preço aberto +1 ponto ou qualquer quantia que você possa decidir trancar.

Para uma venda, são as condições opostas, mas você também deve codificar se SL é 0 inicialmente.

OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()==0 
 
GumRai:

Para o break-even, eu sempre mudo o SL para break-even + 1 ponto, pelo menos. Isso evita possíveis problemas com a comparação de duplas em verificações posteriores.

É simplesmente um caso de verificação de 2 condições (para uma compra)

e

então modifique o pedido para que o SL seja o preço aberto +1 ponto ou qualquer quantia que você possa decidir trancar.

Para uma venda, são as condições opostas, mas você também deve codificar se SL é 0 inicialmente.

Muito obrigado. Na verdade, o que vou fazer é acrescentar pontos suficientes para que ele apenas (aproximadamente) cubra o custo da corretagem para o comércio.

Para a segunda linha...por que eu usaria Orderclose price-OrderOpenPrice? Eu não entendi bem esse código. Não deveria eu usar Bid-OrderOpenPrice, já que isso rastrearia o quanto o preço se moveu?

Estou perto mesmo do que estou fazendo aqui embaixo?

 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

Declarei a comissão acima como uma comissão externa. E usei Bid em seu lugar.

Editar:

Então eu acho (com base no que encontrei abaixo) que o código que coloquei acima está incorreto? Encontrei o seguinte no livro/ajuda MQL4... Parece ser apenas uma parada de trilha, enquanto que o que eu preciso é de uma parada de breakeven primeiro, seguida de uma parada de trilha. Como eu modificaria isto?

 int TrailingStop = 50;
               //--- modifies Stop Loss price for buy order 
            if(TrailingStop>0)
               {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
                if(Bid-OrderOpenPrice()>Point*TrailingStop)
                {
                if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                  bool res =OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,clrNONE);
                   if(!res)
                        Print("Error in OrderModify. Error code=",GetLastError());
                     else
                        Print("Order modified successfully.");
                    }
                 }
                 }
 
 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

Todo o seu bloco de código está condicionado a BuyTicket==-1

Se um pedido for aberto, então BuyTicket não = -1, portanto não serão feitos cheques para a mudança para BE enquanto o comércio estiver aberto.

if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))

O que o número do bilhete tem a ver com o preço?

Você deve selecionar um pedido antes de usar o OrderOpenPrice()

OrderClosePrice() é a Licitação no momento em que o pedido é selecionado para uma compra, peça uma venda.(enquanto o pedido ainda está aberto)

 
SharkWaters:

Então eu acho (com base no que encontrei abaixo) que o código que coloquei acima está incorreto? Encontrei o seguinte no livro/ajuda MQL4... Parece ser apenas uma parada de trilha, enquanto que o que eu preciso é de uma parada de breakeven primeiro, seguida de uma parada de trilha. Como eu modificaria isto?

  int BreakEvenPoints=50;
  double BE_Decimal=BreakEvenPoints*Point;
//--- modifies Stop Loss price for buy order 
  if(BreakEvenPoints>0)
  {
   OrderSelect(BuyTicket,SELECT_BY_TICKET);
   if(Bid-OrderOpenPrice()>BE_Decimal)
     {
      if(OrderStopLoss()<OrderOpenPrice())
        {
         bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),
                              OrderTakeProfit(),0,clrNONE);
         if(!res)
            Print("Error in OrderModify to BE. Error code=",GetLastError());
         else
            Print("Order modified to BE successfully.");
        }
     }
  }
Tente isto
 
GumRai:
Tente isto

Obrigado pelos pontos! Fiz as mudanças necessárias. Quando compenso, mostra um alerta de que "o valor de retorno da 'OrderSelect' deve ser verificado". Isto, estranhamente, se traduz em apenas uma compra sendo acionada e então para o resto é novamente um código de erro 4108. Vender funciona bem (eu não fiz nenhuma alteração nisso).

Aqui está toda a seção do código de compra, caso eu esteja fazendo algo errado - mas essa parte não deveria estar, já que tudo o que eu acrescentei foi este código no meio. O resto foi como antes, o que funcionou perfeitamente bem. O que eu estou recebendo de errado aqui?

int start()
  {
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
               }
           }
   //Stop Order Modify for buy starts here
         int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                 }
              }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }
        

Atualização:

Procurei no Google mais algumas, e mudei-as para as seguintes:

int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               if (OrderSelect(BuyTicket,SELECT_BY_TICKET))
               {
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                  }  
                 }
              }


Isto remove o erro gerado quando clico em compilar. Mas ainda cria o erro OrderModify 4108 no Jornal.

 

Todo seu código está contido na condição se

 if(bar_time!=Time[0])  

portanto, só é executado uma vez por bar novo.

 

Quando BuyTicket == -1 você está tentando selecionar o pedido com um número de bilhete de -1 e, é claro, ele não existe

Verifique que BuyTicket>0 antes de tentar selecionar um pedido

 
GumRai:

Todo seu código está contido na condição se

portanto, só é executado uma vez por bar novo.


Obrigado por apontar isto.

Então, por isto, criei um suporte extra na parte superior, logo após o Start like:

int start() 
{
{

e depois fechei um colchete (que terminou toda a seçãoif(bar_time!=Time[0]) e depois coloquei o código no final seguido por um retorno (0); e o colchete final para fechar o start().

Sem erros, seja no código, ou no Diário de retaguarda, mas só foi preciso uma compra e pronto - que também fechou logo em aberto, embora o preço não tenha subido mais do que o aberto - só é preciso mover 50 pips.

Pense que isto pode ter a ver com o fato de o BuyTicket ser == -1 que você mencionou. Mas, sinceramente, não tenho idéia de como mudar isso. Eu colocaria essa -1 coisa com base em sua recomendação para o código inicial - que funcionou fantasticamente. Mas como euverificaria esse BuyTicket>0 antes de tentar selecionar um pedido?

 
SharkWaters:

Mas como euverificaria esse BuyTicket>0 antes de tentar selecionar um pedido?

Sinto muito, mas se você tem que perguntar isto, você está tentando escrever código muito complicado para seu nível de conhecimento.

Não posso escrever seu código para você um pouco de cada vez.

Razão: