Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 412

 
Ekburg:

Caramba... Estou certamente feliz que você começou a resolver o problema, mas minha mensagem, de alguma forma, você não percebeu, onde eu disse a mesma coisa, palavras um pouco diferentes, e imediatamente disse as falhas, exceto para fechar o arquivo, não imediatamente viu onde você o tem acontecer:)

Você escreveu uma resposta de três parágrafos. No primeiro você cometeu um erro (minha entrada está bastante correta), no segundo você também cometeu um erro (embora esta mensagem o tenha nivelado :) O terceiro ponto soou como se você sugerisse mover o cursor para o final após a entrada, não antes dela (o que foi tomado como um erro novamente). Diante de tal quadro, eu preferi fazer um esclarecimento de um moderador muito experiente que respondeu.

No entanto, obrigado pelo seu feedback. E um Feliz Ano Novo! :)

 

Olá. Diante de uma situação desagradável. Ajude-me aqui.

Eu tenho um consultor especializado. Funciona bem no Testador de Estratégia, não tenho nenhuma reivindicação. Quando o executo em uma demonstração, o Expert Advisor não pode colocar paradas em certas ordens. Há um erro que nem sempre aparece, mas às vezes. Estou desesperado para encontrá-lo por conta própria e espero conseguir sua ajuda. Deve-se notar que a EA trabalha sem falhas em todos os outros aspectos, assim como no testador, sem reclamações, exceto que o problema é que as paradas nem sempre são definidas. O erro aparece em diferentes corretores em diferentes contas. Esta é a parte do código responsável pelas operações comerciais

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {
  //---- обновление инфы
  OrderSelect(ord_ticket,SELECT_BY_TICKET);
  ord_openpr=OrderOpenPrice();
  ZigZagInfo[0][ZZ_TimeP]=t_cur;
  ZigZagInfo[k][ZZ_TryCount]++;
  //---- проверка стопов
  if(ND(a*(ord_tp-ord_openpr)-stops,Digits)<0) ord_tp=ND(ord_openpr+a*stops,Digits); 
  if(ND(a*(ord_openpr-ord_sl)-stops,Digits)<0) ord_sl=ND(ord_openpr-a*stops,Digits);
  //---- время удаления
  if(TimeDelete>0) td=TimeCurrent()+60*TimeDelete;
  else td=0;
  //----
  if(!OrderModify(ord_ticket,ord_openpr,ord_sl,ord_tp,td)) {
    Alert(Error(GetLastError()),"/nSL=",DoubleToStr(ord_sl,5)," TP=",DoubleToStr(ord_tp,5),"/nTimeDel=",TimeToStr(td),
          "OP=",DoubleToStr(ord_openpr,5));
  }
}

Aqui está o código da função Error(int er)

string Error(int er) {
  switch(er) {
    case 0:   return("Нет ошибки");
    case 1:   return("Нет ошибки, но результат неизвестен");
    case 2:   return("Общая ошибка(сбой системы, глюк, и т.п.)");
    case 3:   return("Неправильные параметры");
    case 4:   return("Торговый сервер занят");
    case 6:   return("Нет связи с торговым сервером");
    case 7:   return("Недостаточно прав");
    case 8:   return("Слишком частые запросы");
    case 9:   return("Недопустимая операция нарушающая функционирование сервера");
    case 128: return("Истек срок ожидания совершения сделки");
    case 129: return("Неправильная цена");
    case 130: return("Неправильные стопы");
    case 131: return("Неправильный объем");
    case 133: return("Торговля запрещена");
    case 134: return("Недостаточно денег для совершения операции");
    case 135: return("Цена изменилась");
    case 137: return("Брокер занят");
    case 138: return("Новые цены");
    case 139: return("Ордер заблокирован и уже обрабатывается");
    case 140: return("Разрешена только покупка");
    case 141: return("Слишком много запросов");
    case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
    case 146: return("Подсистема торговли занята");
    case 147: return("Использование даты истечения ордера запрещено брокером");
    case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
    case 149: return("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");
    default:  return("Неизвестная ошибка "+DoubleToStr(er,0));
  }
}

Assim, quando a EA não consegue definir paradas, aparece uma mensagem mostrando informações sobre o erro e os parâmetros da ordem que tentou modificar. O que ele escreve é o verdadeiro mistério para mim. Como você pode ver nas fotos abaixo, ele escreve constantemente que o volume está errado. Isto é estranho. Devo acrescentar que todos os parâmetros do pedido são calculados corretamente antes da modificação, isso pode ser visto nas mensagens. Caso contrário, o erro seria diferente. O programa foi testado com um spread maior do que o da demonstração.

Enigmaoutro

 
_Vladimir_:

Olá. Diante de uma situação desagradável. Ajude-me aqui.

Eu tenho um consultor especializado. Funciona bem no Testador de Estratégia, não tenho nenhuma reivindicação. No entanto, quando a executo em uma demonstração, vejo que a EA não pode colocar paradas em certas encomendas. Há um erro que nem sempre aparece, mas às vezes. Estou desesperado para encontrá-lo por conta própria e espero conseguir sua ajuda. Deve-se notar que a EA trabalha sem falhas em todos os outros aspectos, assim como no testador, sem reclamações, exceto que o problema é que as paradas nem sempre são definidas. O erro aparece em diferentes corretores em diferentes contas. Esta é a parte do código responsável pelas operações comerciais

Aqui está o código da função Error(int er)

Assim, quando a EA não consegue definir paradas, aparece uma mensagem mostrando informações sobre o erro e os parâmetros da ordem que tentou modificar. O que ele escreve é o verdadeiro mistério para mim. Como você pode ver nas fotos abaixo, ele escreve constantemente que o volume está errado. Isto é estranho. Devo acrescentar que todos os parâmetros do pedido são calculados corretamente antes da modificação, isso pode ser visto nas mensagens. Caso contrário, o erro seria diferente. O programa foi testado com um spread maior do que o da demonstração.

Tenha cuidado com os valores de suas variáveis globais. Posso assumir que o ord_ticket é uma variável global, o que significa que o valor anterior pode ser armazenado nele. E antes de chamar GetLastError() para apanhar o erro, você deve redefinir o valor anterior, chamando-o no início do código.
 
TarasBY:
Você deve ser muito cuidadoso com os valores de suas variáveis globais. Posso sugerir que o ord_ticket é uma variável global e, portanto, pode armazenar o valor anterior. E antes de chamar GetLastError() para apanhar o erro, você deve redefinir o valor anterior, chamando-o no início do código.

ord_ticket é declarado a nível local. E então, mesmo que seja declarado globalmente na primeira linha

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {

seu valor certamente irá mudar. Será ou o número do pedido em caso de transação bem sucedida, ou -1 caso contrário. Portanto, se a ordem não for aberta, não chegamos ao bloco de paradas de ajuste.

Deve-se notar também que a função OrderSend() sempre altera o valor do último erro(de acordo com a documentação e a lógica), portanto, não é necessário reiniciar a leitura anterior neste caso e resultaria em uma simples perda de tempo. Ou seja, o erro 131 aparece após a entrada do bloco de ajuste de parada e antes que a mensagem de erro seja exibida. Como as paradas não são realmente colocadas, a função OrderModify() deve ser a última função a ser chamada, a qual, assim como a anterior, sempre muda o valor do último erro. Mas não consigo entender por que não altera o valor do último erro. De onde vem? Mais uma vez, direi que não houve problemas no testador.

Eu tinha uma idéia de que o corretor estava trapaceando porque o servidor enviaria números de erro ao terminal e este, por sua vez, os enviaria para o Expert Advisor. Eu abandonei esta idéia porque apenas ordens de um EA têm erros, outros EA trabalhando em paralelo não têm tais erros.

 
_Vladimir_:

ord_ticket é declarado a nível local. E então, mesmo que seja declarado globalmente na primeira linha

valor certamente vai mudar. Será ou o número do pedido em caso de transação bem sucedida, ou -1 caso contrário. Portanto, se a ordem não for aberta, não chegamos ao bloco de paradas de ajuste.

Deve-se notar também que a função OrderSend() sempre altera o valor do último erro (de acordo com a documentação e a lógica), portanto, não é necessário reiniciar a leitura anterior neste caso e resultaria em uma simples perda de tempo. Ou seja, o erro 131 aparece após a entrada do bloco de ajuste de parada e antes que a mensagem de erro seja exibida. Como as paradas não são realmente colocadas, a função OrderModify() deve ser a última função a ser chamada, a qual, assim como a anterior, sempre muda o valor do último erro. Mas não consigo entender por que não altera o valor do último erro. De onde vem? Mais uma vez, direi que não houve problemas no testador.

Eu tinha uma idéia de que o corretor estava trapaceando porque o servidor enviaria números de erro ao terminal e este, por sua vez, os enviaria para o Expert Advisor. Eu abandonei rapidamente esta idéia porque apenas ordens de um EA têm tais problemas, outros EA trabalhando em paralelo não têm erros.


Vou acrescentar. O código da EA de trabalho paralelo é exatamente o mesmo, ela é responsável pela definição de paradas. Esta EA nunca teve uma situação em que as paradas não fossem definidas para pedidos.

Parece que há um erro no cálculo dos parâmetros em algum lugar acima, mas se apenas um parâmetro estiver errado, outro erro deve aparecer. Por exemplo, os conhecidos 130

 
_Vladimir_:

ord_ticket é declarado a nível local. E então, mesmo que seja declarado globalmente na primeira linha

valor certamente vai mudar. Será ou o número do pedido em caso de transação bem sucedida, ou -1 caso contrário. Portanto, se a ordem não for aberta, não chegamos ao bloco de paradas de ajuste.

Deve-se notar também que a função OrderSend() sempre altera o valor do último erro (de acordo com a documentação e a lógica), portanto, não é necessário reiniciar a leitura anterior neste caso e resultaria em uma simples perda de tempo. Ou seja, o erro 131 aparece após a entrada do bloco de ajuste de parada e antes que a mensagem de erro seja exibida. Como as paradas não são realmente colocadas, a função OrderModify() deve ser a última função a ser chamada, a qual, assim como a anterior, sempre muda o valor do último erro. Mas não consigo entender por que não altera o valor do último erro. De onde vem? Mais uma vez, direi que não houve problemas no testador.

Eu tinha uma idéia de que o corretor estava trapaceando porque o servidor enviaria números de erro ao terminal e este, por sua vez, os enviaria para o Expert Advisor. Eu abandonei rapidamente esta idéia porque apenas ordens de um EA têm erros, outros EA trabalhando em paralelo não têm tais erros.

O pensamento está correndo! Mas a experiência mostra que o que pensamos (como deveria ser) e o que realmente existe são muitas vezes coisas DIFERENTES. O que pode ser aconselhado: "Pré-imprima toda a seqüência de sua execução de código", - essa é a maneira mais rápida de encontrar um erro (ou ter certeza de que você está certo). :)
 
yan720:

Você escreveu uma resposta de três pontos. No primeiro você cometeu um erro (minha entrada está bastante correta), no segundo você também cometeu um erro (embora esta mensagem o tenha nivelado :) O terceiro ponto soou como se você sugerisse mover o cursor para o final após a entrada, não antes dela (o que foi tomado como um erro novamente). Diante de tal quadro, preferi fazer um esclarecimento para o moderador multiqualificado que respondeu.

No entanto, obrigado por sua resposta. E feliz Ano Novo! :)



D ok, feliz ano novo também para você :)
 
Voltando ao que foi escrito na página 411 ... alguém tem alguma idéia de como combinar esse código e as condições de entrada/saída para atravessar dois MAs? ou as ordens pendentes são a única opção?
 
petya33r:
Voltando ao que foi escrito na página 411 ... alguém tem uma idéia de como combinar esse código e as condições de entrada/saída para atravessar dois MA? ou as ordens pendentes são a única opção?

Após abrir um negócio em um sinal de movimento, comece a monitorar o número de ordens ou esta ordem especificamente, se o número de ordens a diminuir ou como a segunda opção for fechada especificamente esta ordem, então descubra como foi fechada, se uma parada, então abra exatamente a ordem oposta ao preço atual, isso é tudo
 
Ekburg:

Após abrir um negócio em um sinal em movimento, comece a monitorar o número de ordens ou esta ordem especificamente, se o número de ordens a diminuir ou como a segunda opção for fechada especificamente esta ordem, então descubra como ela é fechada, se a parada, então apenas abra a ordem oposta ao preço atual, isso é tudo

Eu entendo isso, mas não posso anotar. O Expert Advisor ou negocia apenas em sinais de muwings e não abre uma posição inversa em caso de perda, ou simplesmente trava o terminal quando os testes são iniciados. Assim, escrevi algo que não pode ser processado de forma alguma. Eu não sou muito bom em escrever. Preciso de ajuda na forma de código escrito.

//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         old_order_type = OrderType();
         if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         {
                break; //прекращаем поиск
         }
     }
  }
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, Lot,  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }

Se OrderProfit()<0, abrirá ordemoposta. Mas não funciona em conjunto com os sinais das ajudas de movimento. Você pode escrever um único código para fornecer tanto sinais de muwings quanto condições para abrir uma posição oposta?