Características úteis da KimIV - página 85

 

Como resultado, uma contagem de posição personalizada foi adicionada ao bloco de fechamento, o que resultou em um fechamento "correto", mas oerro 131 ainda aparece algumas vezes no registro:

Essa inserção de uma contagem de pedidos em um loop é normal, considerando que já existe uma verificação de pedidos e

Você poderia corrigir o código para evitar o erro 131?

Muito obrigado.

Arquivos anexados:
codz2.mq4  5 kb
 
hope писал(а) >>

Você poderia por favor corrigir o código para evitar o erro 131?

Muito obrigado.

E quem vai normalizar o tamanho do lote para você após a divisão? Daí o erro.

 

Alex, antes de passar o lote para a função de fechamento, normalize seu tamanho com NormalizeLot().

 

Obrigado Igor, Alexander,

De fato, eu verifiquei os lotes substituindo o Lote/3 (Lote/2, Lote) por 0,01 na função SELLCLOSED_1=OrderClose( OrderTicket(), Lote/3, Ask, 0, Vermelho ); e e evitei o erro 131. Poderíamos deixá-lo assim (0,01), mas, primeiro, o fechamento no formulário de Lote é mais correto. Em segundo lugar, nunca tinha encontrado funções de usuário e sua chamada no programa antes, o que acabou se revelando bastante interessante. Pareço ter anexado tudo corretamente no código e tudo funciona, mas o erro 131 ainda permanece. Dê uma olhada no código, por favor. Talvez eu tenha estragado algo na função de chamada NormalizeLot.

Arquivos anexados:
cod3.mq4  6 kb
 

Desculpas. No código original, a linha

RefreshRates();
BUYCLOSED_1=OrderClose( OrderTicket(), CloseLot, Bid, 0, Red );

é o LotClose correto, de acordo com a condição.

Lote =OrderLots(); // NÚMERO DE LOTES
LotClose =NormalizarLot(Lote); // o valor do LOT NORMALIZADO é atribuído ao LOT FECHADO

errado ao postar........

 
hope писал(а) >>

Dê uma olhada no código, por favor. Talvez você tenha estragado algo na função de chamada NormalizeLot.

Tente substituir

  if ( ro) l=MathCeil( lo* k)/ k; else l=MathFloor( lo* k)/ k;

para

  if ( ro) l=NormalizeDouble(MathCeil( lo* k)/ k,2); else l=NormalizeDouble(MathFloor( lo* k)/ k,2);
 

Bom dia Alexander,

Infelizmente, sua dica não ajudou. Eu analisei o registro e descobri que o erro ocorre em dois casos, quando o fechamento de uma parte de um lote, quase coincide com o fechamento de outra parte do lote.

No caso de não haver coincidência no tempo, então parte do lote é fechada sem um erro.

Tentei normalizar lotes para fechamento de compra e lotes para fechamento de venda separadamente, mas sem sucesso:

duplo
Lote, // Número de lotes na ordem selecionada
LotCloseBuy,
LotCloseSell,

............................

Lote =OrderLots();
LotCloseBuy =NormalizeLot(Lote);

LotCloseSell =NormalizeLot(Lote);

............................

BUYCLOSED_3=OrderClose( OrderTicket(), LotCloseBuy, Bid, 0, Red )

...........................

SELLCLOSED_3=OrderClose( OrderTicket(), LotCloseSell, Ask, 0, Red );

...................

A função de Igor

NormalizeLot.........

Você tem alguma idéia?

 

Que ovelha eu sou! Ugh - é nojento....

Normalizou os lotes no ciclo do pedido

//--------------------------------------------------------------- 4 --
// Pedidos de contagem
Symb=Symbol(); // Nome do instrumento financeiro.
BuyTotal=0; // Número de pedidos de compra
SellTotal=0; // Número de pedidos de venda
for(int i=1; i<=OrdersTotal(); i++) // Laço de pedidos
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Se o seguinte
{ // Análise do pedido:
if (OrderSymbol()!=Symb)continuar; // Não nosso instrumento financeiro
if (OrderType()>1) // Pendente
{
Alert(" Ordem pendente detectada. Expert Advisor não funciona.");
return; // Sair início()
}
if (OrderType()==OP_BUY)
{
BuyTotal++; // Contador de pedidos de compra
BuyOrdOpPrice=OrderOpenPrice(); // Preço de compra aberto
}
if (OrderType()==OP_SELLL)
{
SellTotal++; // Contador de pedidos de venda
SellOrdOpPrice=OrderOpenPrice(); // Preço de compra aberto
}
Ticket=OrderTicket(); // Número do pedido selecionado.
Dica =OrderType(); // Tipo da ordem selecionada.
Lote =OrderLots();

LotCloseBuy =NormalizeLot(Lote);

LotCloseSell =NormalizeLot(Lot);
}
}

.... e criei um loop separado para contabilizar os pedidos abertos, onde tive que normalizar lotes para fechá-los!!!

//--------------------------------------------------------------- 6 --

// Verificação de pedidos abertos
int _GetLastError = 0, _OrdensTotal = OrdersTotal();
int z;


//
passar por todas as posições abertas
para ( z = _OrdensTotal-1 ; z >=0; z -- )
{ // O laço para - passar por todas as ordens abertas
//---- se ocorrer um erro durante a seleção da posição, proceder para o próximo
se ( !OrderSelect( z, SELECT_BY_POS )
{
_GetLastError = GetLastError();
Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
//Finished
//Binding to Currency and Majik
//
se a posição estiver aberta não para o instrumento atual, pule se ( OrderSymbol() != Symbol() ) continuar; // ERROR
//Finished

//
se MagicNumber não for igual a Expert_ID, pule esta posição
if ( OrderMagicNumber() != Expert_ID ) continue; // ERROR
//Finished if (OrderType()==OP_BUY)
{
BuyClot=OrderLots();
}
if (OrderType()==OP_SELL)
{
SellClLot=OrderLots();
}
OpenedLots=OrderLots();
LotCloseBuy =NormalizeLot(OpenedLots); // Número de lotes
LotCloseSell =NormalizeLot(OpenedLots); // Número de lotes

//Cheque se uma posição de compra está aberta,

........................................

Obrigado Igor, Alexander. Sem a função de normalização de lotes, ainda estaria em um impasse....

 

Boa noite,

E o primeiro erro que ocorre:

2009.07.08 21:05:45 TestGenerator: erro de dados incomparável (limite de volume 651 em 2009.07.08 19:00 excedido)
é crítico ou é apenas um erro do testador?

Obrigado.

 
Igor - por favor, veja o 'Indicador GAP' aqui