Boa tarde, a EA é chamada de "Rollover", mas não funciona como planejado. Ela dobra o lote se fechar em menos, mas o fechamento subsequente do TP por alguma razão não permite o retorno de negócios menos, que foram fechados antes. Por favor, informe o que está errado, eu não consigo descobrir. Gostaria de fazer minha pergunta na minha caixa de correio.
externstring TimeStart = "04:00"; //Время начала контрольного периодаexternstring TimeEnd = "09:00"; //Время окончания контрольного периодаexternstring TimeCloseOrder = "23:30";//Время в которое происходит закрытие всех ордеровexterndouble LOT = 0.1;
externint Magic = 777;
externdouble K_martin = 2;
externbool No_Loss = true;
int slippage = 3;
double marga,Lot,SL,TP;
int tip,Orders,tipOrders,TradeDey;
//-------------------------------------------------------------------+int init()
{
if (Digits==5 || Digits==3) slippage = 30;
}
int start()
{
datetime Time_Start = StrToTime(StringConcatenate(Day(),".",Month(),".",Year()," ",TimeStart, ":00"));
datetime Time_End = StrToTime(StringConcatenate(Day(),".",Month(),".",Year()," ",TimeEnd, ":00"));
datetime Time_CloseOrder = StrToTime(StringConcatenate(Day(),".",Month(),".",Year()," ",TimeCloseOrder,":00"));
if (Time_CloseOrder>Time_End) if (CurTime()>=Time_CloseOrder) CLOSEORDERS();
int tip;
if (Orders>OrdersTotal()) tip=CloseOrder();
Orders=OrdersTotal();
if (ORDERS(0)==0 && tip==0 && (CurTime()<Time_CloseOrder || Time_CloseOrder<=Time_End) && TradeDey!=TimeDay(CurTime()))
{
int BarStart = iBarShift(NULL,0,Time_Start,false);
int BarEnd = iBarShift(NULL,0,Time_End ,false);
double Max_Price=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,BarStart-BarEnd,BarEnd));
double Min_Price=iLow (NULL,0,iLowest (NULL,0,MODE_LOW, BarStart-BarEnd,BarEnd));
if (TimeCurrent()>Time_End && ObjectFind("bar0"+Time_End)==-1)
{
ObjectCreate("bar0"+Time_End, OBJ_RECTANGLE, 0, 0,0, 0,0);
ObjectSet ("bar0"+Time_End, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet ("bar0"+Time_End, OBJPROP_COLOR, Blue);
ObjectSet ("bar0"+Time_End, OBJPROP_BACK, true);
ObjectSet ("bar0"+Time_End, OBJPROP_TIME1 ,Time_Start);
ObjectSet ("bar0"+Time_End, OBJPROP_PRICE1,Max_Price);
ObjectSet ("bar0"+Time_End, OBJPROP_TIME2 ,Time_End);
ObjectSet ("bar0"+Time_End, OBJPROP_PRICE2,Min_Price);
}
if (Bid>Max_Price) OrderSend(Symbol(),OP_BUY,LOT,Bid,slippage,Min_Price,
NormalizeDouble(Ask + Max_Price-Min_Price,Digits),"BreakdownLevel",Magic,Blue);
if (Bid<Min_Price) OrderSend(Symbol(),OP_SELL,LOT,Bid,slippage,Max_Price,
NormalizeDouble(Bid - Max_Price+Min_Price,Digits),"BreakdownLevel",Magic,Blue);
return;
}
if (No_Loss) No_Loss();
if (tip==1 && TradeDey!=TimeDay(CurTime()))
{
Lot=Lot*K_martin;
if (tipOrders==0) OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,SL,TP,"Nevalyashka",Magic,Blue);
if (tipOrders==1) OrderSend(Symbol(),OP_BUY ,Lot,Ask,slippage,SL,TP,"Nevalyashka",Magic,Blue);
}
return(0);
}
//-------------------------------------------------------------------+int CloseOrder()
{
string txt;
double loss;
int i=OrdersHistoryTotal()-1;
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
tipOrders=OrderType();
Lot=OrderLots();
loss = MathAbs(OrderProfit()/MarketInfo(Symbol(),MODE_TICKVALUE)/Lot/K_martin);
if (tipOrders==0)
{
TP=NormalizeDouble(Bid - loss*Point,Digits);
SL=NormalizeDouble(Ask + loss*Point,Digits);
}
if (tipOrders==1)
{
SL=NormalizeDouble(Bid - loss*Point,Digits);
TP=NormalizeDouble(Ask + loss*Point,Digits);
}
if (OrderClosePrice()==OrderTakeProfit() || OrderProfit()>=0) TradeDey=TimeDay(CurTime());
if (OrderClosePrice()==OrderStopLoss()) return(1);
}
}
return(0);
}
//+-----------------------------------------------------------------+int ORDERS(int tip)
{
int N_Sell,N_Buy;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
if (OrderType()==OP_BUY ) N_Buy++;
if (OrderType()==OP_SELL) N_Sell++;
}
}
}
if (tip== 0) return(N_Buy+N_Sell);
if (tip== 1) return(N_Buy);
if (tip==-1) return(N_Sell);
}
//-------------------------------------------------------------------+void No_Loss()
{
int tip;
double TP,OOP;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol())
{
if (OrderMagicNumber()!=Magic) continue;
TP = OrderTakeProfit();
OOP = OrderOpenPrice();
if (tip==0) //Bay
{
if (OrderStopLoss()>OrderOpenPrice()+Ask-Bid) return;
if ((TP-OOP)/2+OOP<=Bid)
OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP+Ask-Bid,Digits),TP,0,White);
}
if (tip==1) //Sell
{
if (OrderStopLoss()<OrderOpenPrice()-Ask+Bid) return;
if (OOP-(OOP-TP)/2>=Ask)
OrderModify(OrderTicket(),OOP,NormalizeDouble(OOP-Ask+Bid,Digits),TP,0,White);
}
}
}
}
}
//------------------------------------------------------------------+void CLOSEORDERS()
{
bool error;
int err;
while (true)
{ error=true;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if (OrderSymbol()!=Symbol()||Magic!=OrderMagicNumber()) continue;
if (OrderType()==OP_BUY)
error=OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
if (OrderType()==OP_SELL)
error=OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
}
if (!error) {err++;Sleep(2000);RefreshRates();}
if (error || err >5) return;
}
}
//-------------------------------------------------------------------+
Tigerfreerun: Eu não entendo bem o que exatamente esta função faz. Mas, como disse o autor, seu propósito é cobrir a perda de pedidos com pedidos lucrativos entre os símbolos. Eu ficaria feliz se você pudesse me ajudar a corrigir e entender a função
void MaxMinProfit()
{
int i, N, MaxTic, MinTic;
double MinProf=0, MaxProf=0, OP, g, a[][2];
string MinSym, MaxSym;
ArrayResize(a, 0);for (i=OrdersTotal()-1; i>=0; i--)
{if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderType()==OP_SELL || OrderType()==OP_BUY )
{
OP = NormalizeDouble(OrderProfit()+OrderSwap()+OrderCommission(),2);
if (MinProf>OP)
{
MinProf=OP;
MinTic=OrderTicket();
MinSym=OrderSymbol();
}
if (OP>0)
{
N++;
ArrayResize(a, N);
a[N-1][0]=OP;
a[N-1][1]=OrderTicket();
}
}
}
}
ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);//MODE_ASCEND);for (i=0; i<Level; i++)
{
g+=a[i][0];
//int ti=a[i-2][1];
}
if(MinProf <0 && (g+MinProf)>=ProcMax)
{
for (i=0; i<Level; i++)
{
if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
{
//Alert(a[i][1]);if (OrderType()== OP_BUY)
{
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slip, CLR_NONE);
}
if (OrderType()== OP_SELL)
{
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), Slip, CLR_NONE);
}
}
}
if (OrderSelect(MinTic, SELECT_BY_TICKET, MODE_TRADES))
{
if (OrderType()== OP_BUY)
{
OrderClose(MinTic, OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slip, CLR_NONE);
}
if (OrderType()== OP_SELL)
{
OrderClose(MinTic, OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), Slip, CLR_NONE);
}
}}
return;
}
Você não entende, e eu não quero entender o que esta função faz. Você o usa. Você o escolheu por si mesmo. Como você pode usar algo sem entender para que serve.
Eu acabei de lhe dizer de onde vem o erro, por que razão.
Mais um esclarecimento:
Uma matriz é declarada. É destacado em verde. Tem comprimento zero na primeira dimensão. A linha em azul não é clara. Se você quiser redefinir o tamanho da matriz, existe o ArrayFree() Mas mesmo esta função será inútil, uma vez que a matriz dinâmica recém declarada tem comprimento zero.
2. Se não houver ordens, o código marcado em vermelho não será executado. Portanto, o tamanho da matriz permanecerá zero.
3. A classificação por matriz é fornecida em cada carrapato. Segue o código. E o que pode ser classificado em um bolso vazio? A menos que sejam 2 ovos de codorniz...?
E aqui está o texto de erro... O que posso dizer? Os desenvolvedores não previram que alguém pudesse tentar classificar uma matriz vazia. Eles não chegaram a uma mensagem especial para isso.
При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически...
Você não entende, e eu não quero entender o que esta função faz. Você o usa. Você o escolheu por si mesmo. Como você pode usar algo sem entender para que serve.
Eu acabei de lhe dizer de onde vem o erro, por que razão.
Mais um esclarecimento:
1. uma matriz é declarada. É destacado em verde no código. Tem comprimento zero na primeira dimensão. A linha destacada em azul não é clara. Se quisermos repor o tamanho da matriz, existe o ArrayFree(), mas mesmo esta função será inútil, uma vez que a matriz dinâmica que acabamos de declarar tem comprimento zero.
2. Se não houver ordens, o código marcado em vermelho não será executado. Portanto, o tamanho da matriz permanecerá zero.
3. A classificação por matriz é fornecida em cada carrapato. Segue o código. E o que pode ser classificado em um bolso vazio? A menos que sejam 2 ovos de codorniz...?
E este é o texto do erro... O que posso dizer? Os desenvolvedores não previram que alguém pudesse tentar ordenar uma matriz vazia. Eles não chegaram a uma mensagem especial para isso.
Alexey, você está errado. ArrayFree() serve para liberar a memória da matriz quando ela não é mais necessária, o que é muito raramente necessário, e certamente não neste caso.
ZeroMemory(a), ArrayInitialize(a,xxx) deve ser usado para zerar a matriz, e ArrayResize(a,xxx) deve ser usado para redimensioná-la na primeira dimensão.
No entanto, esta emenda não afeta seu raciocínio - é correta.
Alexey, isso não é correto. ArrayFree() é usado para liberar a memória de uma matriz quando esta matriz não é mais necessária, o que é muito raro, e definitivamente não neste caso.
ZeroMemory(a), ArrayInitialize(a,xxx) deve ser usado para zerar a matriz, e ArrayResize(a,xxx) deve ser usado para redimensioná-la na primeira dimensão.
No entanto, esta emenda não afeta seu raciocínio - é correta.
De acordo com a documentação
ArrayFree .
libera o buffer de qualquer matriz dinâmica e define o tamanho da dimensão zero como 0.
Talvez eu não tenha me expressado corretamente e você me tenha entendido mal.
Talvez eu não tenha me expressado corretamente e você me tenha entendido mal.
E mais adiante, lá atrás:
Nota
O uso da função ArrayFree() em scripts e indicadores não é necessário muitas vezes, pois toda a memória utilizada é imediatamente liberada após o script parar de funcionar. Nos indicadores personalizados, a maioria das operações com matrizes estão acessando buffers indicadores, cujos tamanhos são automaticamente gerenciados pelo subsistema executivo do terminal do cliente.
Se um programa precisa gerenciar a memória independentemente em condições dinâmicas complexas, a função ArrayFree() permitirá liberar explicitamente e imediatamente a memória ocupada por uma matriz dinâmica desnecessária.
Libera o buffer de qualquer matriz dinâmica e define o tamanho da dimensão zero para 0
Você entendeu? Você leu a segunda parte e perdeu a primeira - importante - parte? Ele libera a memória alocada para a matriz. Foi-se... O espaço de memória alocado para a matriz é liberado e pode então ser ocupado por outros dados. Por que, cada vez que você reentrar na função, a memória deve ser reatribuída a esta matriz? Você é quem deve libertá-la. Tudo que você precisa fazer é mudar o tamanho - ArrayResize() ou zerar o array - ArrayInitialize(), ZeroMemory(). E o espaço de memória para a matriz não será liberado, e permanecerá reservado para esta matriz até que o programa seja concluído.
O uso da função ArrayFree() em scripts e indicadores não é necessário com muita freqüência, pois toda a memória utilizada é liberada imediatamente após a conclusão da operação. Nos indicadores personalizados, a maioria das operações com matrizes estão acessando buffers indicadores, cujos tamanhos são gerenciados automaticamente pelo subsistema executivo do terminal do cliente.
Se um programa precisa gerenciar a memória independentemente em condições dinâmicas complexas, a função ArrayFree() permitirá liberar explicitamente e imediatamente a memória ocupada por uma matriz dinâmica desnecessária.
Libera o buffer de qualquer matriz dinâmica e define o tamanho da dimensão zero para 0
Você entendeu? Você leu a segunda parte e perdeu a primeira parte importante, não leu? Ele libera a memória alocada para a matriz. Isso é tudo... foi-se... O espaço de memória alocado para a matriz é liberado e pode ser ainda mais ocupado por outros dados. Por que, cada vez que você reentrar na função, a memória deve ser reatribuída a esta matriz? Você é quem deve libertá-la. Tudo que você precisa fazer é mudar o tamanho - ArrayResize() ou zerar o array - ArrayInitialize(), ZeroMemory(). E o espaço de memória para a matriz não será liberado, e permanecerá reservado para esta matriz até que o programa seja concluído.
Ok... E se uma matriz local for declarada a cada chamada de uma função ou, o mais improvável, a cada carrapato... Mas a memória para a matriz é alocada cada vez que a matriz é definida. Não é assim? E não importa se a memória é liberada ou não, mas a memória está sendo alocada a cada vez...
Minha idéia principal era que você não deveria fazer isso... e, se o fizer, é melhor fazê-lo através do ArrayFree().
Aqui está o que é interessante: se uma matriz local é declarada cada vez que uma função é chamada, correspondentemente, a memória é reservada para ela cada vez. Mas que endereços são usados quando se faz isso? O mesmo que ao declarar a matriz pela primeira vez, ou o que será usado?
Boa tarde, a EA é chamada de "Rollover", mas não funciona como planejado. Ela dobra o lote se fechar em menos, mas o fechamento subsequente do TP por alguma razão não permite o retorno de negócios menos, que foram fechados antes. Por favor, informe o que está errado, eu não consigo descobrir. Gostaria de agradecer antecipadamente a todos os que comentaram.
Tente verificar a duplicação mais cedo do que o lote inicial. Veja o fechamento por hora.
Bem, você demonstrou que estes não são erros críticos.
Como a função funciona, você mesmo já respondeu:
No testador está tudo bem. É assim que funciona na prática.
Neste caso você precisa lidar com o código, imprimir( Imprimir(...) ) todos os valores e ver de onde vem o erro
No testador, está tudo bem. É assim que funciona na prática.
Você obteve sua resposta:
Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial
Qualquer pergunta de iniciantes sobre MQL4, ajuda e discussão sobre algoritmos e códigos
Alexey Viktorov, 2018.09.06 21:00
Direção para pensar: Se o lucro for inferior a zero... qual será o tamanho da matriz durante a triagem???
E qual é o tamanho da matriz se não há nenhuma ordem???Boa tarde, a EA é chamada de "Rollover", mas não funciona como planejado. Ela dobra o lote se fechar em menos, mas o fechamento subsequente do TP por alguma razão não permite o retorno de negócios menos, que foram fechados antes. Por favor, informe o que está errado, eu não consigo descobrir. Gostaria de fazer minha pergunta na minha caixa de correio.
Eu não entendo bem o que exatamente esta função faz. Mas, como disse o autor, seu propósito é cobrir a perda de pedidos com pedidos lucrativos entre os símbolos. Eu ficaria feliz se você pudesse me ajudar a corrigir e entender a função
Você não entende, e eu não quero entender o que esta função faz. Você o usa. Você o escolheu por si mesmo. Como você pode usar algo sem entender para que serve.
Eu acabei de lhe dizer de onde vem o erro, por que razão.
Mais um esclarecimento:
Uma matriz é declarada. É destacado em verde. Tem comprimento zero na primeira dimensão. A linha em azul não é clara. Se você quiser redefinir o tamanho da matriz, existe o ArrayFree() Mas mesmo esta função será inútil, uma vez que a matriz dinâmica recém declarada tem comprimento zero.
2. Se não houver ordens, o código marcado em vermelho não será executado. Portanto, o tamanho da matriz permanecerá zero.
3. A classificação por matriz é fornecida em cada carrapato. Segue o código. E o que pode ser classificado em um bolso vazio? A menos que sejam 2 ovos de codorniz...?
E aqui está o texto de erro... O que posso dizer? Os desenvolvedores não previram que alguém pudesse tentar classificar uma matriz vazia. Eles não chegaram a uma mensagem especial para isso.
Você não entende, e eu não quero entender o que esta função faz. Você o usa. Você o escolheu por si mesmo. Como você pode usar algo sem entender para que serve.
Eu acabei de lhe dizer de onde vem o erro, por que razão.
Mais um esclarecimento:
1. uma matriz é declarada. É destacado em verde no código. Tem comprimento zero na primeira dimensão. A linha destacada em azul não é clara. Se quisermos repor o tamanho da matriz, existe o ArrayFree() , mas mesmo esta função será inútil, uma vez que a matriz dinâmica que acabamos de declarar tem comprimento zero.
2. Se não houver ordens, o código marcado em vermelho não será executado. Portanto, o tamanho da matriz permanecerá zero.
3. A classificação por matriz é fornecida em cada carrapato. Segue o código. E o que pode ser classificado em um bolso vazio? A menos que sejam 2 ovos de codorniz...?
E este é o texto do erro... O que posso dizer? Os desenvolvedores não previram que alguém pudesse tentar ordenar uma matriz vazia. Eles não chegaram a uma mensagem especial para isso.
Alexey, você está errado. ArrayFree() serve para liberar a memória da matriz quando ela não é mais necessária, o que é muito raramente necessário, e certamente não neste caso.
ZeroMemory(a), ArrayInitialize(a,xxx) deve ser usado para zerar a matriz, e ArrayResize(a,xxx) deve ser usado para redimensioná-la na primeira dimensão.
No entanto, esta emenda não afeta seu raciocínio - é correta.
Alexey, isso não é correto. ArrayFree() é usado para liberar a memória de uma matriz quando esta matriz não é mais necessária, o que é muito raro, e definitivamente não neste caso.
ZeroMemory(a), ArrayInitialize(a,xxx) deve ser usado para zerar a matriz, e ArrayResize(a,xxx) deve ser usado para redimensioná-la na primeira dimensão.
No entanto, esta emenda não afeta seu raciocínio - é correta.
De acordo com a documentação
ArrayFree .
libera o buffer de qualquer matriz dinâmica e define o tamanho da dimensão zero como 0.
De acordo com a documentação
Talvez eu não tenha me expressado corretamente e você me tenha entendido mal.E mais adiante, lá atrás:
Nota
O uso da função ArrayFree() em scripts e indicadores não é necessário muitas vezes, pois toda a memória utilizada é imediatamente liberada após o script parar de funcionar. Nos indicadores personalizados, a maioria das operações com matrizes estão acessando buffers indicadores, cujos tamanhos são automaticamente gerenciados pelo subsistema executivo do terminal do cliente.
Se um programa precisa gerenciar a memória independentemente em condições dinâmicas complexas, a função ArrayFree() permitirá liberar explicitamente e imediatamente a memória ocupada por uma matriz dinâmica desnecessária.
Libera o buffer de qualquer matriz dinâmica e define o tamanho da dimensão zero para 0
Você entendeu? Você leu a segunda parte e perdeu a primeira - importante - parte? Ele libera a memória alocada para a matriz. Foi-se... O espaço de memória alocado para a matriz é liberado e pode então ser ocupado por outros dados. Por que, cada vez que você reentrar na função, a memória deve ser reatribuída a esta matriz? Você é quem deve libertá-la. Tudo que você precisa fazer é mudar o tamanho - ArrayResize() ou zerar o array - ArrayInitialize(), ZeroMemory(). E o espaço de memória para a matriz não será liberado, e permanecerá reservado para esta matriz até que o programa seja concluído.
E depois há o mesmo:
Nota
O uso da função ArrayFree() em scripts e indicadores não é necessário com muita freqüência, pois toda a memória utilizada é liberada imediatamente após a conclusão da operação. Nos indicadores personalizados, a maioria das operações com matrizes estão acessando buffers indicadores, cujos tamanhos são gerenciados automaticamente pelo subsistema executivo do terminal do cliente.
Se um programa precisa gerenciar a memória independentemente em condições dinâmicas complexas, a função ArrayFree() permitirá liberar explicitamente e imediatamente a memória ocupada por uma matriz dinâmica desnecessária.
Libera o buffer de qualquer matriz dinâmica e define o tamanho da dimensão zero para 0
Você entendeu? Você leu a segunda parte e perdeu a primeira parte importante, não leu? Ele libera a memória alocada para a matriz. Isso é tudo... foi-se... O espaço de memória alocado para a matriz é liberado e pode ser ainda mais ocupado por outros dados. Por que, cada vez que você reentrar na função, a memória deve ser reatribuída a esta matriz? Você é quem deve libertá-la. Tudo que você precisa fazer é mudar o tamanho - ArrayResize() ou zerar o array - ArrayInitialize(), ZeroMemory(). E o espaço de memória para a matriz não será liberado, e permanecerá reservado para esta matriz até que o programa seja concluído.
Ok... E se uma matriz local for declarada a cada chamada de uma função ou, o mais improvável, a cada carrapato... Mas a memória para a matriz é alocada cada vez que a matriz é definida. Não é assim? E não importa se a memória é liberada ou não, mas a memória está sendo alocada a cada vez...
Minha idéia principal era que você não deveria fazer isso... e, se o fizer, é melhor fazê-lo através do ArrayFree().
Aqui está o que é interessante: se uma matriz local é declarada cada vez que uma função é chamada, correspondentemente, a memória é reservada para ela cada vez. Mas que endereços são usados quando se faz isso? O mesmo que ao declarar a matriz pela primeira vez, ou o que será usado?
Boa tarde, a EA é chamada de "Rollover", mas não funciona como planejado. Ela dobra o lote se fechar em menos, mas o fechamento subsequente do TP por alguma razão não permite o retorno de negócios menos, que foram fechados antes. Por favor, informe o que está errado, eu não consigo descobrir. Gostaria de agradecer antecipadamente a todos os que comentaram.
Tente verificar a duplicação mais cedo do que o lote inicial. Veja o fechamento por hora.