Precisa de ajuda com o erro #130 de perda de dados inválido - página 3

 
mesmo problema. O pedido abre bem com stoploss = 0 e takeprofit = 0.
Mas então a OrderModify falha.

O código abaixo é executado após o código acima do último post.

   bool modify = false;
   entry_price = OrderOpenPrice();
   if(long) {  
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Red);  
   } else {    
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Green); 
   }
   Log("[5] SL: " + SL);
   Log("[5] TP: " + TP);
   
   if(!modify) {
      Log("error="+GetLastError());
      return(-1);
   }

O Log ist:

#ESZ1,M5: Posição de Abertura
#ESZ1,M5: valor do tick: 12.50000000
#ESZ1,M5: tamanho pos: 1.00000000
#ESZ1,M5: Pergunte/ Lance 1242.00000000/1241.75000000
#ESZ1,M5: Espalhamento 0,25000000
#ESZ1,M5: abrir #13679252 comprar 1,00 #ESZ1 a 1242,00 ok
#ESZ1,M5: Ordem 13679252 Aberta com sucesso
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5: erro=130

Assim, mesmo a primeira abertura e depois a colocação de stoploss parece não funcionar :-/
 

O spread é de 0,25

#ESZ1,M5: Espalhamento 0,25000000

OK, você abre uma COMPRA em . . 1242,00 (Pergunte)

#ESZ1,M5: abrir #13679252 comprar 1,00 #ESZ1 a 1242,00 ok

#ESZ1,M5: Ordem 13679252 Aberta com sucesso

Então você tenta modificar com um TP ao preço de Licitação + 2 * Spread e SL ao preço de Licitação Preço de Licitação - 2 * Spread

#ESZ1,M5: SL: 1241.25000000

#ESZ1,M5: TP: 1242.25000000

Se seu FreezeLevel é 0,50 então esse é seu problema . . qual é seu FreezeLevel ?

 
shinobi:
mesmo problema. A ordem abre bem com stoploss = 0 e takeprofit = 0.
Mas depois a OrderModify falha.

Não se ajustando para corretores de 4/5 dígitos. Não abrindo primeiro e depois ajustando paradas.

Como respondido anteriormente

 

sim você provavelmente está negociando com um corretor ECN você tem que abrir ordens com zero paradas e depois modificar a ordem depois que ela é aberta para que haja um problema com 50 pips SL e TP, então faça como o Raptor disse verificar o freezelevel e o stoplevel também no caso de

Verifique também seu código OrderModify() .... talvez funcione assim, mas eu acho que você deve selecionar o pedido usando OrderSelect() antes de poder fazer OrderOpenPrice()

 
Mais uma vez obrigado por sua ajuda!
Infelizmente #130 ainda me assombra à noite ;)

Aqui está minha próxima tentativa:

   double stoploss = 50;
   double SL = 0.0;
   
   //open position
   if(long)  //take long position
      result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);  
   else     //take short position
      result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, 0, 0, "", 12345); 
   //check for errors
   if(result_ticket == -1) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Order "+result_ticket+" Successfully Opened");

   //select order
   if (!OrderSelect(result_ticket, SELECT_BY_TICKET)) {
      Log("error="+GetLastError());
      return(-1);
   }    
   entry_price = OrderOpenPrice();
   
   //check stoplevel
   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

   //checl freezelevel
   double freezelevel = MarketInfo(Symbol(), MODE_FREEZELEVEL);
   Log("Freezelevel: " + freezelevel);
   Log("stoploss: " + stoploss);
   if(stoploss < freezelevel)
      stoploss = freezelevel + 1;
   
   if(long)
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
   else
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
   Log("SL: " + SL*pips2dbl);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Stoploss successfully set");

Como você pode ver, simplifiquei o exemplo, não utilizando o takeprofit. O erro ocorre definitivamente por causa da perda de estoque, portanto não precisamos de takeprofit.
Eu primeiro abro o pedido com 0 stoploss (e takeprofit) e depois tento definir o stoploss usando OrderModify.
Antes disso, chequei Mode_Stoplevel e Mode_Freezelevel e ajustei o stoploss, se necessário. (Um ajuste ocorre abaixo no log, porque o stoploss é inicialmente 50, mas Mode_Stoplevel é 75, eu então defino stoploss para Mode_Stoplevel + 1, portanto 76)

RaptorUK e SDC:
MarketInfo(MODE_FREEZELEVEL) retorna 0. Eu não acho que Freezelevel seja o problema.
Incluí a saída no arquivo de log.

SDC:
Também inseri uma OrderSelect, antes de ligar para OrderOpenPrice só para ter certeza. No log você pode ver que OrderSelect funcionou, caso contrário o código não teria prosseguido tão longe (saída -1).

WHRoeder:
Eu segui o exemplo simples da SDC. Mas agora eu o ampliei usando os pips 4/5 dígitos ao ajustar o stoploss, como você pode ver acima. Você também pode ver que a ordem é aberta primeiro com stoploss e takeprofit ajustado a zero e depois stoploss é ajustado com OrderModify. Como você pode ver no log abaixo com S/L e T/P ajustados a zero, o pedido abre com sucesso, mas ainda não consigo ajustar o S/L na próxima etapa com OrderModify.

Aqui está o log completo:

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/15 9:24
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56489.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Init successfully completed.
#ESZ1,M5: initialized

#ESZ1,M5: Opening Position
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: Ask/Bid 1250.50000000/1250.25000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: pos size: 1
#ESZ1,M5: open #13697436 sell 1.00 #ESZ1 at 1250.25 ok 
#ESZ1,M5: Order 13697436 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 12.51260000
#ESZ1,M5: error=130

Estou muito grato por sua ajuda contínua e acho que estamos diminuindo o problema :)
Então, qual mais poderia ser o problema? Mais alguma coisa que eu poderia tentar?

shinobi
 
RaptorUK:

O spread é de 0,25

#ESZ1,M5: Espalhamento 0,25000000

OK, você abre uma COMPRA em . . 1242,00 (Pergunte)

#ESZ1,M5: abrir #13679252 comprar 1,00 #ESZ1 a 1242,00 ok

#ESZ1,M5: Ordem 13679252 Aberta com sucesso

Então você tenta modificar com um TP ao preço de Licitação + 2 * Spread e SL ao preço de Licitação Preço de Licitação - 2 * Spread

Seu STOP_LEVEL 3 * Spread ? sua parada está muito perto . . .

#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
 
Hey Raptor,

Sim, é por isso que eu verifico o rochedo aqui (a partir do código acima):

   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

Assim, no último exemplo, o stoploss foi ajustado para 76, que é 3*Spread +1.
Isso deve ser longe o suficiente, certo?
 
shinobi:
Olá Raptor,

Sim, é por isso que eu verifico o rochedo aqui (a partir do código acima):


Assim, no último exemplo, o stoploss foi ajustado para 76, que é 3*Spread +1.
Isso deve estar longe o suficiente, certo?
Sim, deveria . . . mas estou me perguntando se você tem um problema de arredondamento aqui e se precisa arredondar para os 0,25 (S&P500 se move em passos de 0,25) para que seu SL fique livre de STOP_LEVEL por 0,25 ou mais . . . se você entender o que quero dizer ?
 
Boa idéia, mas, infelizmente, isso também não ajudou.
Aqui está o que eu fiz.

Primeiro escrevi uma função personalizada para arredondar para o dobro para o dobro mais próximo:
double DoubleRound(double number, double step)
{
    double mod = MathMod(number, step);
    if(mod < step/2.0)
      step = 0;
    double rounded = number - mod + step;
    return (rounded);
}

Ele faz o que você espera. Se você o chamar com DoubleRound(1237.687360000), ele retorna 1237.50.

Então eu o usei em meu S/L pouco antes de ligar para OrderModify. E eu usei MODE_TICKVALUE, que é 0,25 para #ESZ1.
Então:

   //round to nearest Tickvalue   
   SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKVALUE));

 
  Log("SL: " + SL);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }

No registro você pode ver, que o arredondamento funcionou bem. No entanto, o prejuízo ainda foi rejeitado :/

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/16 7:44
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56364.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Opening Position
#ESZ1,M5: Ask/Bid 1240.00000000/1239.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok 
#ESZ1,M5: Order 13708089 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 1237.50000000
#ESZ1,M5: error=130

Não consigo imaginar que mais poderia ser o problema! Este #130 é realmente persistente!!!
 

Você abriu um Sell

#ESZ1,M5: abrir #13708089 vender 1,00 #ESZ1 a 1239,75 ok

e tentou estabelecer um SL abaixo dele . .

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5: erro=130

Razão: