Erro nº 1 na modificação de ordens

 

Como posso me livrar deste maldito erro? Estou farto disso. Estou verificando cada parâmetro de entrada da função. Para mim, no momento, é assim:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))
   New_OOP = ND (fd_MurreyLevelsValue[11]);
else New_OOP = OrderOpenPrice();
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Ou seja, se o parâmetro não tiver sido alterado, não há necessidade de alterá-lo. Nunca tinha feito isso antes, mas decidi...

Em seguida, os parâmetros são passados para o método de modificação de pedidos como este:

 if (!fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
{
   if (_LastError != 0)
     WriteLog (StringConcatenate (__FUNCTION__, ". В строке ", __LINE__, " ", CErrs.ErrorToString (_LastError)),
                     CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
}

Nw saída no registro:

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1

Então, a revista nos notifica, como modificação: OK, mas então um erro. Nenhum dos parâmetros foi alterado.

O pedido está pendente. Portanto, podemos mudar aberto, parar e tomar preço. E isto, pelo que entendi, não contradizia a documentação.

Quem já encontrou algo assim? Como resolvê-lo?

 
hoz:

Como posso me livrar deste maldito erro? Estou farto disso. Estou verificando cada parâmetro de entrada da função. Para mim, no momento, é assim:

Ou seja, se o parâmetro não tiver sido alterado, não há necessidade de alterá-lo. Nunca tinha feito isso antes, mas decidi...

Em seguida, os parâmetros são passados para o método de modificação de pedidos como este:

Nw saída no registro:

Então, a revista nos notifica, como modificação: OK, mas depois... um erro. Nenhum dos parâmetros foi alterado.

O pedido está pendente. Portanto, podemos mudar aberto, parar e tomar preço. E isto, pelo que entendi, não contradizia a documentação.

Quem já encontrou algo assim? Como resolvê-lo?

Você está manipulando mal o código de erro, esquecendo que o código de erro já está anulado após suas inúmeras funções.

Portanto, quando ocorre um erro, você precisa salvar o código de erro em uma variável local e imprimi-lo de lá, após a massa de suas chamadas subseqüentes.

 
Renat:

Você está manipulando mal o código de erro, esquecendo que o código de erro já está anulado após suas inúmeras funções.

Portanto, quando ocorre um erro, seu código deve ser salvo em uma variável local e somente então, após a massa de suas chamadas subseqüentes, imprimi-lo.

Por que você não cria também uma matriz de erros? Está escrito em preto e branco na documentação que a variável _LastError armazena o número do último erro. E é reinicializada pela função ResetLastError(). Se não houver mais erros entre chamadas de _LastError, _LastError armazena o valor do último erro. Não houve mais erros em meu código. Bem, não é essa a questão.

Além disso, não é muito lógico criar variáveis para erros em cada método e depois imprimir essas variáveis em Expert Advisors.

Afinal, se existe uma variável para coletar erros, por que fazer novos erros?

 

mal vivo, o que você quer dizer com "não há cheques"? Eu escrevi acima:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Eu até fiz um comentário para o primeiro. Embora lá tudo seja elementar.

De que outra forma você pode verificar aqui?

 
Eu faço uma dupla verificação de que não é igual e direcionado para onde você espera!
 
evillive:
Eu percebi, é por isso que eu limpei))))
Você está sendo mal-educado! ;)
 
borilunad:
Eu faço dupla verificação de que não é igual e direcionado para onde você espera!

Boris, o que você quer dizer com isso? Porque tenho escrito claramente que se o preço não for assim... caso contrário... atual... Qual é o objetivo? Você pode verificá-lo 20 vezes... :) Isso não faz sentido. Tenho me debatido com este código desde o segundo dia. Nunca havia encontrado um bicho assim antes. Agora eu já o enfrentei. Eu já escrevi e testei todos esses métodos muitas vezes. Eu enfrentei um problema aqui.

A questão é que sou mais um fã de táticas ligeiramente diferentes. Mas escrevendo as últimas Owls, deparou-se com esta falha. Eu mesmo não sei onde cavar, porque pristrintovav todos os códigos longitudinalmente e caso contrário não tenho mais pensamentos. É por isso que a função OrderModify( ) é incorporada. E eu não conheço sua implementação.

 
hoz:

mal vivo, o que você quer dizer com "não há cheques"? Eu escrevi acima:

Eu até fiz um comentário para o primeiro. Embora lá tudo seja elementar.

De que outra forma você pode verificar aqui?

Victor, depois de verificar, o novo valor é atribuído ou não. Você tem que verificar.

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11])  // Если текущая цена не равна новой.. из массива
 || OrderStopLoss() != ND (fd_MurreyLevelsValue[12])   // или 
 || OrderTakeProfit() != ND (fd_MurreyLevelsValue[2])) // или
  // если одно из условий выполнено пойдём в модифай... 
 
AlexeyVik:

Victor, após verificar se o novo valor é atribuído ou não. Você tem que verificar

Alexey, e onde você tem um cheque para se certificar de que o valor das funções que estão sendo passadas não sofreu alterações? Eu já levei isto em consideração acima. E a necessidade de modificações em geral é feita no início. Há níveis lá, se o indicador informa que o nível mudou, vamos seguir em frente...

 
hoz:

Boris, o que você quer dizer com isso? Porque tenho escrito claramente que se o preço não for assim... caso contrário... atual... Qual é o objetivo? Você pode verificá-lo 20 vezes... :) Isso não faz sentido. Tenho me debatido com este código desde o segundo dia. Nunca havia encontrado um bicho assim antes. Agora eu já o enfrentei. Eu já escrevi e testei todos esses métodos muitas vezes. Eu enfrentei um problema aqui.

A questão é que sou mais um fã de táticas ligeiramente diferentes. Mas escrevendo as últimas Owls, deparou-se com esta falha. Eu mesmo não sei onde cavar, porque pristrintovav todos os códigos longitudinalmente e caso contrário não tenho mais pensamentos. É por isso que a função OrderModify( ) é incorporada. E não sei sua implementação...

Victor, você Renat, em geral, notou corretamente, Alexey mostrou a última verificação necessária, e antes, verifique todas as verificações necessárias para cada parâmetro com todas as nuances, para evitar ambiguidade de significado e sem perder nenhuma condição!
 
hoz:

mal vivo, o que você quer dizer com "não há cheques"? Eu escrevi acima:

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Eu até fiz um comentário para o primeiro. Embora lá tudo seja elementar.

De que outra forma você pode verificar aqui?

Também precisamos verificar que se nenhum dos 3 parâmetros não mudou, então a OrderModify não deve ser tocada. Ou melhor, se pelo menos um desses parâmetros mudou, só então vá para OrderModify.