A maioria dos corretores tem um limite para o número de lotes que permitem que você abra. Em alguns casos, é desejável abrir várias negociações para obter um número de lotes abertos que ultrapasse o limite máximo da corretora para qualquer ticket de negociação. Fiz alguns experimentos e descobri que a modificação a seguir na função sqOpenOrderWithErrorHandling() permitirá que isso aconteça. Estou oferecendo isso como uma sugestão a ser incluída em versões futuras, se for considerado desejável pelos desenvolvedores e outros usuários. Se alguém quiser experimentar, pode fazê-lo, mas não se esqueça de testá-lo minuciosamente para ter certeza de que ele não quebrará mais nada. Meus testes pessoais constataram (até o momento) que ele não interrompe outras funções e, portanto, eu o tenho usado com bastante sucesso.
Observe que, em vez de LotsDecimals, que é definido como double pelo EA Wizard, geralmente uso uma variável int, decimals, que é uma variável int global e é definida como o número de casas decimais permitidas para o dimensionamento de lotes por essa corretora específica. Na maioria dos casos, é 2, para corretoras que permitem microlotes. Usei LotsDecimals em minha codificação personalizada abaixo, já que essa é a norma para o EA Wizard, mas, em minha própria prática, uso a variável int decimals.
int sqOpenOrderWithErrorHandling(string symbol, int orderType, double orderLots, double price, double realSL, double realPT, string comment, int orderMagicNumber) {
int ticket, error;
// ***** Código personalizado adicionado
double mmaxlots=MarketInfo(Symbol(), MODE_MAXLOT) ;
double mminlots=MarketInfo(Symbol(), MODE_MINLOT) ;
double jlots=orderLots ;
double ilots=0.0 ;
while(jlots>0.0)
{
ilots=jlots ;
se(ilots>mmaxlots) ilots=mmaxlots ;
se(ilots<mminlots) ilots=mminlots ;
ilots=NormalizeDouble(ilots,LotsDecimals) ;
jlots=jlots-ilots ;
Se (símbolo == "NULL") {
ticket = OrderSend(Symbol(), orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
{} else {
ticket = OrderSend(symbol, orderType, ilots, price, MaxSlippage, 0, 0, comment, orderMagicNumber);
}
// **** Fim do código personalizado adicionado para esta seção... Veja o código adicional no final da função.
if(ticket < 0) {
// o pedido falhou, escreva o erro no registro
return(-1*GetLastError());
}
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
Log("Order opened: ", OrderTicket(), " at price:", OrderOpenPrice());
// definir stop loss e meta de lucro
// tem que ser feito separadamente para dar suporte a corretores ECN
se((realSL > 0 || realPT > 0) && (OrderStopLoss() != realSL || OrderTakeProfit() != realPT)) {
if(OrderModify(ticket, OrderOpenPrice(), realSL, realPT, 0, 0)) {
Log("Ordem modificada, StopLoss: ", realSL,", Profit Target: ", realPT);
{} else {
error = GetLastError();
Log("Erro ao modificar o pedido: ",error, " : ", ErrorDescription(error));
RefreshRates();
if(orderType == OP_BUY) price = Ask;
if(orderType == OP_SELL) price = Bid;
if(OrderClose(ticket, orderLots, price, 6) != true) {
error = GetLastError();
Log("CANNOT CLOSE ORDER: ", OrderTicket(), ", Error opening order : ",error, " : ", ErrorDescription(error));
retornar(-1*erro);
}
}
}
// ***** Código adicional personalizado adicionado
se(jlots>0.0) continue ;
}
// **** Fim do código personalizado adicionado para esta seção
return(ticket);
}