Maldito erro 130 para o inferno - página 3

 
delcor wrote >>

Vangrosh

obrigado pela contribuição

você pode me ajudar a ficar de pé

é isto correto

eu faço um EA com trilha automática

if(OrderType()==OP_SELL && OrderSymbol()==Symbol())

{
se (OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); // colocar um TP e SL
}
if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) // lugar TP
{
if(OrderStopLoss()>(Ask+Point*TrailingStop)+Point) // verifique verdadeiro
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red)) // se realmente modificar a ordem
Print("Error_Modify - ",GetLastError()));
else str=StringConcatenate("\n My ticket number is ", OrderTicket(), " and my stop loss setting is ", DoubleToStr(Ask+Point*TrailingStop,Digits)); // novo código
}
}
}

Aqui está o que escrevi em outro post, explicando a abordagem diferente.

>>Aqui está uma solução fácil simplesmente verificando se o preço do novo stoploss é pelo menos 1 ponto ou maior do que o stoploss antigo. Basta fazer o inverso para uma ordem de venda.

      if (OrderType() == OP_BUY)
      {      
         if(Bid-OrderOpenPrice() > (Point* TrailingStop))
         {       
            double oldStopLoss = OrderStopLoss();
            double newStopLoss = Bid-Point* TrailingStop;
            double nextStopLoss = oldStopLoss + Point; // Adding 1 point to oldStopLoss, i.e. 76.78 to 76.79            
                       
            if( newStopLoss >= nextStopLoss) // checking that the new stoploss price is at least 1 point or greater then the old stoploss
            {                              
               OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
               return;
            }
         }
      }


Aqui está a função completa que eu utilizo. Agora que penso nisso, eu poderia ter usado um nome de var melhor que o próximoStopLoss, e eu também deveria adicionar a verificação de erros ao OrderModify().

Também minha função Trailing Stop está em um EA que pode ter várias ordens abertas ao mesmo tempo, e é por isso que ele tem esses parâmetros para que eu possa atualizar o Trailing Stop em várias ordens ao mesmo tempo.

void CheckTrailingStop(int order_Ticket, int trailingStopValue)
{
   double oldStopLoss;
   double newStopLoss;
   double nextStopLoss;
   int _trailingStop = trailingStopValue;
   
   if ( order_Ticket < 0) return;
                                    
   if(OrderSelect( order_Ticket, SELECT_BY_TICKET, MODE_TRADES) == false)
   {
      Print("CheckTrailingStop() - OrderSelect returned the error of ", GetLastError());
      return;   
   }
         
   if (OrderType() == OP_BUY)
   {      
      if(Bid-OrderOpenPrice() > Point*_trailingStop)
      {       
         oldStopLoss = OrderStopLoss();
         newStopLoss = Bid-Point*_trailingStop;
         nextStopLoss = oldStopLoss + Point; // Adding 1 point to oldStopLoss, i.e. 76.78 to 76.79            
                    
         if( newStopLoss >= nextStopLoss)
         {                              
            OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
            return;
         }
      }
   }
                                             
   if (OrderType() == OP_SELL)
   {               
      if(OrderOpenPrice()-Ask > Point*_trailingStop)
      {
         oldStopLoss = OrderStopLoss();
         newStopLoss = Ask+Point*_trailingStop;
         nextStopLoss = oldStopLoss - Point; // Subtracting 1 point from oldStopLoss, i.e. 76.78 to 76.77
                    
         if( newStopLoss <= nextStopLoss || (OrderStopLoss() == 0))
         {                              
            OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
            return;
         }
      }
   }
}

Então, em minha função de início(), eu tenho:

void start()
{                      
   if ( validTimePeriod == false) return;
   if ( validTrailingStop == false) return;
        
   //---- Start Main program ----
   Main();
   
   if ( EnableHedging == true)
   {
      HedgeStopLossCheck();
      CheckHedges();
   }
   
   if ( TrailingStop > 0) CheckTrailingStop( currentOrderTicket, TrailingStop);               
           
   CheckWaiting();
   
   GetOpenTradeLots();   
      
   CheckIfCurrentOrder_Closed();
}

Deixei as outras chamadas de função ali para que você possa ver que gosto de dividir meu código em funções específicas, tanto quanto possível. Isso torna as coisas muito mais fáceis.

Boa sorte com a sua EA.

 
vangrosh:

Aqui está o que escrevi em outro post, explicando a abordagem diferente.

>>Aqui está uma solução fácil, simplesmente verificando se o preço do novo stoploss é pelo menos 1 ponto ou maior do que o stoploss antigo. Basta fazer o inverso para uma ordem de venda.


Aqui está a função completa que eu utilizo. Agora que penso nisso, eu poderia ter usado um nome de var melhor que o próximoStopLoss, e eu também deveria adicionar a verificação de erros ao OrderModify().

Também minha função Trailing Stop está em um EA que pode ter várias ordens abertas ao mesmo tempo, e é por isso que ele tem esses parâmetros para que eu possa atualizar o Trailing Stop em várias ordens ao mesmo tempo.

Então, em minha função de início(), eu tenho:

Deixei as outras chamadas de função ali para que você possa ver que gosto de dividir meu código em funções específicas, tanto quanto possível. Isso torna as coisas muito mais fáceis.

Boa sorte com a sua EA.

obrigado - parece bom

assim você coloca sua função de início() no fundo da ea

 
Eu também tenho um problema com um erro terrível. O problema é que eu não tenho parado de perder ou tirar lucro, simplesmente não consigo colocar a ordem pendente, muitos pips longe do mercado onde não deveria haver problema...
 
TheEconomist wrote >>
Eu também tenho um problema com um erro terrível. O problema é que eu não tenho parado de perder ou tirar lucro, simplesmente não consigo colocar a ordem pendente, muitos pips longe do mercado onde não deveria haver problema...

O problema com o good'ole 130 é que ele indica (um de) uma classe ou grupo de erros e não leva a nenhuma correção imediata...
Você pode até consertar um problema e ele ainda está lá

A única coisa que ocorre aqui é uma gralha?

Talvez você esteja entrando em um limite de compra acima de Pergunte, quando você pretendia um pedido de Buy Stop?

FWIW

-BB-

 
BarrowBoy:

O problema com o good'ole 130 é que ele indica (um dos) uma classe ou grupo de erros e não leva a nenhuma correção instantânea.
Você pode até consertar um problema e ele ainda está lá

A única coisa que ocorre aqui é uma gralha?

Talvez você esteja entrando em um limite de compra acima de Pergunte, quando você pretendia um pedido de Buy Stop?

FWIW

-BB-

Eu tenho uma função que seleciona o tipo de operação:

int SellOperation(double ToCompare)
  {
   int op;
   if (Bid> ToCompare)
     op=OP_SELLSTOP;
   if (Bid== ToCompare)
     op=OP_SELL;
   if (Bid< ToCompare)
     op=OP_SELLLIMIT;        
   return( op);   
  }
  
  
int BuyOperation(double ToCompare)
  { 
   int op;
   if (Ask> ToCompare)
     op=OP_BUYLIMIT;
   if (Ask== ToCompare)
     op=OP_BUY;
   if (Ask< ToCompare)
     op=OP_BUYSTOP;
   return( op);
  }

int WhatOperation(int operation, double ToCompare)
  { 
   if ( operation==OP_BUY)
     return( BuyOperation( ToCompare));
   if ( operation==OP_SELL)
     return( SellOperation( ToCompare));     
  }       

como esta:

09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily: Abertura Vender no nível 2 para pylon 0 @ 0.8024 enquanto lance = 0.8016
09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily: PedidoEnviar erro 130
09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily: ConfiávelOrderSend error : 130 : Paradas inválidas.


 

Olá TheEconomist

apenas alguns quickies...

1. Não veja nenhuma norma no ToCompare, a menos que o WhatOperation() esteja garantido de que a norma tenha sido realmente dada.

2. Os comps duplos têm problemas - por exemplo, 'Falha na Declaração Condicional... [No final da frase] se ( 1,4225 > 1,4225) NÃO for VERDADEIRO!!!!!!'.

3. Você segue as orientações em https://book.mql4.com/appendix/limits

Cumprimentos

 

Estive estudando este posto em lúpulo para resolver meu erro na "Pergunta Rápida" com 130. A função de envio de pedidos está lá, assim como os lançamentos de diário com função Imprimir, algum de vocês sabe o que está acontecendo?

Obrigado,

Bauer Boy

 

.

...como visto em .../24681

if( isBuying ) 
{ 
  if( stopLoss > 0)
  ACCTSL = Ask - ( stopLoss*Point* MyDig);

  if( takeProfit > 0)
  ACCTTP = Ask + ( takeProfit*Point* MyDig);
  // Buy
  ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, ACCTSL, ACCTTP, 
  nameEA, 16384,0,Red); 
  Print ("Stop Loss Value", ACCTSL);
  Print ("Take Profit Value", ACCTTP);

1. StopLevel= MarketInfo(Symbol(),MODE_STOPLEVEL);

SL,TP deve estar pelo menos a pontos de StopLevel longe de Bid

Veja abaixo (**)


2. ACCTxx = NormalizeDuplo(Pergunte ...(...), Dígitos);


3. Print("Bid=",DoubleToString(Ask,Digits),", Ask=",DoubleToString(Bid,Digits));


4. Imprimir ("Stop Loss Value",DoubleToString( ACCTSL,Digitos),", stopLoss=",stopLoss);
Imprimir ("Take Profit Value", DoubleToString(ACCTTP,Digitos),", takeProfit=",takeProfit);

Por que DoubleToString()? Imprimir() exibe apenas QUATRO DÍGITOS



Btw, eu também estaria em algum lugar pelo menos uma vez Imprimir ("MyDig=",MyDig); Por quê? não há como você então se preocupar com isso. Pode parecer mesquinho, mas você ficaria surpreso com as brincadeiras que envolvem coisas tão simples!


5. TODOS os seus problemas podem ser facilmente resolvidos obtendo todas as informações disponíveis na ponta de seus dedos e exibindo-as.

Então, com o bom e velho papel + lápis você pode ver onde estão os mal-entendidos.



(**)

Ref: https://book.mql4.com/appendix/limits

Limitação de distância mínima StopLevel.

Uma operação comercial não será realizada se alguma das seguintes condições for interrompida.

Tipo de pedido Preço Aberto StopLoss (SL) TakeProfit (TP)
Compre
A modificação é proibida Bid-SL StopLevel TP-Bid StopLevel
Venda
A modificação é proibida SL-Ask StopLevel Ask-TP StopLevel
BuyLimit
Ask-OpenPrice StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellLimit
OpenPrice-Bid StopLevel SL-OpenPrice ≥StopLevel OpenPrice-TP StopLevel
BuyStop
OpenPrice-Ask StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellStop
Bid-OpenPrice StopLevel SL-OpenPrice StopLevel OpenPrice-TP StopLevel

 
fbj wrote >>

.

...como visto em .../24681

1. StopLevel= MarketInfo(Symbol(),MODE_STOPLEVEL);

SL,TP deve estar pelo menos a pontos de StopLevel longe de Bid

Veja abaixo (**)


2. ACCTxx = NormalizeDuplo(Pergunte ...(...), Dígitos);


3. Print("Bid=",DoubleToString(Ask,Digits),", Ask=",DoubleToString(Bid,Digits));


4. Imprimir ("Stop Loss Value",DoubleToString( ACCTSL,Digitos),", stopLoss=",stopLoss);
Imprimir ("Take Profit Value", DoubleToString(ACCTTP,Digitos),", takeProfit=",takeProfit);

Por que DoubleToString()? Imprimir() exibe apenas QUATRO DÍGITOS



Btw, eu também estaria em algum lugar pelo menos uma vez Imprimir ("MyDig=",MyDig); Por quê? não há como você então se preocupar com isso. Pode parecer mesquinho, mas você ficaria surpreso com as brincadeiras que envolvem coisas tão simples!


5. TODOS os seus problemas podem ser facilmente resolvidos obtendo todas as informações disponíveis na ponta de seus dedos e exibindo-as.

Então, com o bom e velho papel + lápis você pode ver onde estão os mal-entendidos.



(**)

Ref: https://book.mql4.com/appendix/limits

Limitação de distância mínima StopLevel.

Uma operação comercial não será realizada se alguma das seguintes condições for interrompida.

Tipo de pedido Preço Aberto StopLoss (SL) TakeProfit (TP)
Compre
A modificação é proibida Bid-SL StopLevel TP-Bid StopLevel
Venda
A modificação é proibida SL-Ask StopLevel Ask-TP StopLevel
BuyLimit
Ask-OpenPrice StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellLimit
OpenPrice-Bid StopLevel SL-OpenPrice ≥StopLevel OpenPrice-TP StopLevel
BuyStop
OpenPrice-Ask StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellStop
Bid-OpenPrice StopLevel SL-OpenPrice StopLevel OpenPrice-TP StopLevel

Realmente não se pode dizer o que está acontecendo e porque isso está acontecendo

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: OrderSend (Trender Beta Test ) falhou com o erro #130

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: MyDig=10

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: Take Profit Value1.43155, takeProfit=110

2009.08.05 14:32:26 Teste de Trender Beta EURUSD,H1: Stop Loss Value1.42255, stopLoss=200

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: Bid=1.44255, Ask=1.44229







 
Bauer_Boy wrote >>

Realmente não se pode dizer o que está acontecendo e porque isso está acontecendo

Realmente é hora de mostrar o código inteiro. Se você hesitar, você pode usar o PM.

Vejo que você tem o TP mais baixo que o Bid

Razão: