Reafinada a redefinição da função OrderClose(), mas está incompleta, o processamento da matriz TradeOrdersArray está incompleto. O código fonte está disponível aqui - http://forexsystems.ru/phpBB/viewtopic.php?p=4389#4389 Algumas coisas acrescentadas, algumas corrigidas...
//+------------------------------------------------------------------+
//| Redefine OrderClose() function |
//+------------------------------------------------------------------+
bool funt_OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
{
if (CorrectClosePrice(TradeOrdersArray[ticket,0],price,myCurrentTime))&&((TradeOrdersArray[ticket,3]=myOP_BUY)||(TradeOrdersArray[ticket,3]=myOP_BUY))
{
ClosedOrdersArray[myHistoryTotal]=TradeOrdersArray[ticket,0];// записали иструмент
ClosedOrdersArray[myHistoryTotal,1]=history_pool;// записали номер в истории
ClosedOrdersArray[myHistoryTotal,2]=TradeOrdersArray[ticket,2];// записали номер тикета у брокера
ClosedOrdersArray[myHistoryTotal,3]=TradeOrdersArray[ticket,3];// записали тип ордера
ClosedOrdersArray[myHistoryTotal,4]=TradeOrdersArray[ticket,4];// записали размер ордера
// ClosedOrdersArray[myHistoryTotal,4]=lots;//??? альтернативный вариант, надо доработать
ClosedOrdersArray[myHistoryTotal,5]=TradeOrdersArray[ticket,5];// записали цену открытия
ClosedOrdersArray[myHistoryTotal,6]=TradeOrdersArray[ticket,6];// записали проскальзывание в пунктах
// ClosedOrdersArray[myHistoryTotal,6]=;slippage //??? альтернативный вариант, можно еще MathCeil (double (slippage*MathRand()/32767))
ClosedOrdersArray[myHistoryTotal,7]=TradeOrdersArray[ticket,7];// записали stoploss
ClosedOrdersArray[myHistoryTotal,8]=TradeOrdersArray[ticket,8];// записали takeprofit
ClosedOrdersArray[myHistoryTotal,9]=TradeOrdersArray[ticket,9];// записали комментарии
ClosedOrdersArray[myHistoryTotal,10]=TradeOrdersArray[ticket,10];// записали MagicNumber
ClosedOrdersArray[myHistoryTotal,11]=TradeOrdersArray[ticket,11];// записали дату открытия ордера
ClosedOrdersArray[myHistoryTotal,12]=myCurrentTime;// записали дату закрытия ордера
ClosedOrdersArray[myHistoryTotal,13]=myCurrentPrice(TradeOrdersArray[ticket,3]);// записали дату закрытия ордера
ClosedOrdersArray[myHistoryTotal,14]=TradeOrdersArray[ticket,14];// записали профит по закрытому ордеру
//-------------------------------------------------------------------------------
// здесь блок по удалению ордера из массива TradeOrdersArray[][]
myOrdersTotal--;// уменьшили счетчик открытых ордеров
pool_pos--;// уменьшили счетчик в списке терминала
//-------------------------------------------------------------------------------
DrawCloseArrowOnChart(TradeOrdersArray[ticket,0],myCurrentTime,price,Color);
DeltaBalance=DeltaBalance+ClosedOrdersArray[myHistoryTotal,14];// накапливаем изменени баланса на текущем баре
DeltaProfit=DeltaProfit-ClosedOrdersArray[myHistoryTotal,14];// накапливаем изменени профита на текущем баре
myHistoryTotal++;
return(true);
}
else return(false);
}
Eu só queria que Renat desse uma olhada por si mesmo e encontrasse o erro.
Desculpe, eu raramente encontro tempo para olhar o fórum - uma carga de trabalho muito pesada. Assim que a pressão for aliviada após o lançamento do MT4, vamos retomar as discussões.
Mak, eu sei que remover um pedido é "incompleto", eu não queria nem mesmo reduzir os contadores no início, mas depois pensei - duas linhas não são tão difíceis de inserir. Quanto à idéia, devemos organizar um loop para mover as ordens para o início da matriz e talvez ArrayResize(). Se fossem Coleções como em Pascal, tudo isso seria feito por uma única operação. Talvez haja alguém que gostaria de fazer isso?
//+------------------------------------------------------------------+
//| Redefine OrderClose() function |
//+------------------------------------------------------------------+
bool funt_OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
{
int i,k,pointer_pool;
if (CorrectClosePrice(TradeOrdersArray[ticket,0],price,myCurrentTime))&&((TradeOrdersArray[ticket,3]=myOP_BUY)||(TradeOrdersArray[ticket,3]=myOP_BUY))
{
ClosedOrdersArray[myHistoryTotal]=TradeOrdersArray[ticket,0];// записали иструмент
ClosedOrdersArray[myHistoryTotal,1]=history_pool;// записали номер в истории
ClosedOrdersArray[myHistoryTotal,2]=TradeOrdersArray[ticket,2];// записали номер тикета у брокера
ClosedOrdersArray[myHistoryTotal,3]=TradeOrdersArray[ticket,3];// записали тип ордера
ClosedOrdersArray[myHistoryTotal,4]=TradeOrdersArray[ticket,4];// записали размер ордера
// ClosedOrdersArray[myHistoryTotal,4]=lots;//??? альтернативный вариант, надо доработать
ClosedOrdersArray[myHistoryTotal,5]=TradeOrdersArray[ticket,5];// записали цену открытия
ClosedOrdersArray[myHistoryTotal,6]=TradeOrdersArray[ticket,6];// записали проскальзывание в пунктах
// ClosedOrdersArray[myHistoryTotal,6]=;slippage //??? альтернативный вариант, можно еще MathCeil (double (slippage*MathRand()/32767))
ClosedOrdersArray[myHistoryTotal,7]=TradeOrdersArray[ticket,7];// записали stoploss
ClosedOrdersArray[myHistoryTotal,8]=TradeOrdersArray[ticket,8];// записали takeprofit
ClosedOrdersArray[myHistoryTotal,9]=TradeOrdersArray[ticket,9];// записали комментарии
ClosedOrdersArray[myHistoryTotal,10]=TradeOrdersArray[ticket,10];// записали MagicNumber
ClosedOrdersArray[myHistoryTotal,11]=TradeOrdersArray[ticket,11];// записали дату открытия ордера
ClosedOrdersArray[myHistoryTotal,12]=myCurrentTime;// записали дату закрытия ордера
ClosedOrdersArray[myHistoryTotal,13]=myCurrentPrice(TradeOrdersArray[ticket,3]);// записали дату закрытия ордера
ClosedOrdersArray[myHistoryTotal,14]=TradeOrdersArray[ticket,14];// записали профит по закрытому ордеру
//-------------------------------------------------------------------------------
// здесь блок по удалению ордера из массива TradeOrdersArray[][]
i=0;
while (!TradeOrdersArray[i,1]==ticket) {i++}; pointer_pool=i; // нашли ордер по списку терминала
for (i=pointer_pool;i<=pool_pos;i++) // перемещение ордеров от конца к удаляемому ордеру (фактически мы его стираем)
{
for (k=0;k<=14;k++) {TradeOrdersArray[i,k]=TradeOrdersArray[i+1,k]}// копирование параметров ордера
}
for (k=0;k<=14;k++)
{
TradeOrdersArray[myOrdersTotal,k]=NULL; // скорее всего некорректное "зануление"
}
myOrdersTotal--;// уменьшили счетчик открытых ордеров
pool_pos--;// уменьшили счетчик в списке терминала
// ArrayResize(TradeOrdersArray,pool_pos) ; // не неуверен, что эта процедура не приведет к краху массива
//-------------------------------------------------------------------------------
DrawCloseArrowOnChart(TradeOrdersArray[ticket,0],myCurrentTime,price,Color);
DeltaBalance=DeltaBalance+ClosedOrdersArray[myHistoryTotal,14];// накапливаем изменени баланса на текущем баре
DeltaProfit=DeltaProfit-ClosedOrdersArray[myHistoryTotal,14];// накапливаем изменени профита на текущем баре
myHistoryTotal++;
return(true);
}
else return(false);
}
Em princípio, a função DeleteOrder() pode ser derivada daqui. O número de erros está se acumulando...
Adicionado um pouco de código. Se quiser, você pode testar um simples EA adicionando um par de linhas. O código fonte está no mesmo lugar - http://forexsystems.ru/phpBB/viewtopic.php?p=4574#4574 O autor gostaria de agradecer a todos pela ajuda na escrita deste problema... :)
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
O código fonte está disponível aqui - http://forexsystems.ru/phpBB/viewtopic.php?p=4389#4389
Algumas coisas acrescentadas, algumas corrigidas...
//+------------------------------------------------------------------+ //| Redefine OrderClose() function | //+------------------------------------------------------------------+ bool funt_OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE) { if (CorrectClosePrice(TradeOrdersArray[ticket,0],price,myCurrentTime))&&((TradeOrdersArray[ticket,3]=myOP_BUY)||(TradeOrdersArray[ticket,3]=myOP_BUY)) { ClosedOrdersArray[myHistoryTotal]=TradeOrdersArray[ticket,0];// записали иструмент ClosedOrdersArray[myHistoryTotal,1]=history_pool;// записали номер в истории ClosedOrdersArray[myHistoryTotal,2]=TradeOrdersArray[ticket,2];// записали номер тикета у брокера ClosedOrdersArray[myHistoryTotal,3]=TradeOrdersArray[ticket,3];// записали тип ордера ClosedOrdersArray[myHistoryTotal,4]=TradeOrdersArray[ticket,4];// записали размер ордера // ClosedOrdersArray[myHistoryTotal,4]=lots;//??? альтернативный вариант, надо доработать ClosedOrdersArray[myHistoryTotal,5]=TradeOrdersArray[ticket,5];// записали цену открытия ClosedOrdersArray[myHistoryTotal,6]=TradeOrdersArray[ticket,6];// записали проскальзывание в пунктах // ClosedOrdersArray[myHistoryTotal,6]=;slippage //??? альтернативный вариант, можно еще MathCeil (double (slippage*MathRand()/32767)) ClosedOrdersArray[myHistoryTotal,7]=TradeOrdersArray[ticket,7];// записали stoploss ClosedOrdersArray[myHistoryTotal,8]=TradeOrdersArray[ticket,8];// записали takeprofit ClosedOrdersArray[myHistoryTotal,9]=TradeOrdersArray[ticket,9];// записали комментарии ClosedOrdersArray[myHistoryTotal,10]=TradeOrdersArray[ticket,10];// записали MagicNumber ClosedOrdersArray[myHistoryTotal,11]=TradeOrdersArray[ticket,11];// записали дату открытия ордера ClosedOrdersArray[myHistoryTotal,12]=myCurrentTime;// записали дату закрытия ордера ClosedOrdersArray[myHistoryTotal,13]=myCurrentPrice(TradeOrdersArray[ticket,3]);// записали дату закрытия ордера ClosedOrdersArray[myHistoryTotal,14]=TradeOrdersArray[ticket,14];// записали профит по закрытому ордеру //------------------------------------------------------------------------------- // здесь блок по удалению ордера из массива TradeOrdersArray[][] myOrdersTotal--;// уменьшили счетчик открытых ордеров pool_pos--;// уменьшили счетчик в списке терминала //------------------------------------------------------------------------------- DrawCloseArrowOnChart(TradeOrdersArray[ticket,0],myCurrentTime,price,Color); DeltaBalance=DeltaBalance+ClosedOrdersArray[myHistoryTotal,14];// накапливаем изменени баланса на текущем баре DeltaProfit=DeltaProfit-ClosedOrdersArray[myHistoryTotal,14];// накапливаем изменени профита на текущем баре myHistoryTotal++; return(true); } else return(false); }Não sinto falta do meu ...
Desculpe, eu raramente encontro tempo para olhar o fórum - uma carga de trabalho muito pesada.
Assim que a pressão for aliviada após o lançamento do MT4, vamos retomar as discussões.
erro - apagar um pedido não é suficiente para fazer
myOrdersTotal--;// уменьшили счетчик открытых ордеров pool_pos--;// уменьшили счетчик в списке терминалаRenat,
OK.
Quanto à idéia, devemos organizar um loop para mover as ordens para o início da matriz e talvez ArrayResize(). Se fossem Coleções como em Pascal, tudo isso seria feito por uma única operação. Talvez haja alguém que gostaria de fazer isso?
É rápido e fácil...
Você não precisa escrevê-los você mesmo.
Que tal não apagar as ordens, mas assinalar na caixa que elas foram apagadas?
//+------------------------------------------------------------------+ //| Redefine OrderClose() function | //+------------------------------------------------------------------+ bool funt_OrderClose( int ticket, double lots, double price, int slippage, color Color=CLR_NONE) { int i,k,pointer_pool; if (CorrectClosePrice(TradeOrdersArray[ticket,0],price,myCurrentTime))&&((TradeOrdersArray[ticket,3]=myOP_BUY)||(TradeOrdersArray[ticket,3]=myOP_BUY)) { ClosedOrdersArray[myHistoryTotal]=TradeOrdersArray[ticket,0];// записали иструмент ClosedOrdersArray[myHistoryTotal,1]=history_pool;// записали номер в истории ClosedOrdersArray[myHistoryTotal,2]=TradeOrdersArray[ticket,2];// записали номер тикета у брокера ClosedOrdersArray[myHistoryTotal,3]=TradeOrdersArray[ticket,3];// записали тип ордера ClosedOrdersArray[myHistoryTotal,4]=TradeOrdersArray[ticket,4];// записали размер ордера // ClosedOrdersArray[myHistoryTotal,4]=lots;//??? альтернативный вариант, надо доработать ClosedOrdersArray[myHistoryTotal,5]=TradeOrdersArray[ticket,5];// записали цену открытия ClosedOrdersArray[myHistoryTotal,6]=TradeOrdersArray[ticket,6];// записали проскальзывание в пунктах // ClosedOrdersArray[myHistoryTotal,6]=;slippage //??? альтернативный вариант, можно еще MathCeil (double (slippage*MathRand()/32767)) ClosedOrdersArray[myHistoryTotal,7]=TradeOrdersArray[ticket,7];// записали stoploss ClosedOrdersArray[myHistoryTotal,8]=TradeOrdersArray[ticket,8];// записали takeprofit ClosedOrdersArray[myHistoryTotal,9]=TradeOrdersArray[ticket,9];// записали комментарии ClosedOrdersArray[myHistoryTotal,10]=TradeOrdersArray[ticket,10];// записали MagicNumber ClosedOrdersArray[myHistoryTotal,11]=TradeOrdersArray[ticket,11];// записали дату открытия ордера ClosedOrdersArray[myHistoryTotal,12]=myCurrentTime;// записали дату закрытия ордера ClosedOrdersArray[myHistoryTotal,13]=myCurrentPrice(TradeOrdersArray[ticket,3]);// записали дату закрытия ордера ClosedOrdersArray[myHistoryTotal,14]=TradeOrdersArray[ticket,14];// записали профит по закрытому ордеру //------------------------------------------------------------------------------- // здесь блок по удалению ордера из массива TradeOrdersArray[][] i=0; while (!TradeOrdersArray[i,1]==ticket) {i++}; pointer_pool=i; // нашли ордер по списку терминала for (i=pointer_pool;i<=pool_pos;i++) // перемещение ордеров от конца к удаляемому ордеру (фактически мы его стираем) { for (k=0;k<=14;k++) {TradeOrdersArray[i,k]=TradeOrdersArray[i+1,k]}// копирование параметров ордера } for (k=0;k<=14;k++) { TradeOrdersArray[myOrdersTotal,k]=NULL; // скорее всего некорректное "зануление" } myOrdersTotal--;// уменьшили счетчик открытых ордеров pool_pos--;// уменьшили счетчик в списке терминала // ArrayResize(TradeOrdersArray,pool_pos) ; // не неуверен, что эта процедура не приведет к краху массива //------------------------------------------------------------------------------- DrawCloseArrowOnChart(TradeOrdersArray[ticket,0],myCurrentTime,price,Color); DeltaBalance=DeltaBalance+ClosedOrdersArray[myHistoryTotal,14];// накапливаем изменени баланса на текущем баре DeltaProfit=DeltaProfit-ClosedOrdersArray[myHistoryTotal,14];// накапливаем изменени профита на текущем баре myHistoryTotal++; return(true); } else return(false); }Em princípio, a função DeleteOrder() pode ser derivada daqui. O número de erros está se acumulando...
O código fonte está no mesmo lugar - http://forexsystems.ru/phpBB/viewtopic.php?p=4574#4574
O autor gostaria de agradecer a todos pela ajuda na escrita deste problema... :)