I've made a redefinition of the OrderClose() trading function, but it's incomplete, processing of the TradeOrdersArray array is incomplete. You can find the source code here - http://forexsystems.ru/phpBB/viewtopic.php?p=4389#4389 Some things added, some things corrected...
//+------------------------------------------------------------------+
//| 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);
}
I just wanted Renat to take a look for himself and find the error.
Sorry, I rarely find time to look at the forum - very heavy workload. As soon as the pressure is off after the release of MT4, we'll take up further discussions.
Mak, I know that removing an order is "incomplete", I didn't even want to reduce the counters at first, but then I thought - two lines are not so hard to insert. As for the idea, we should organize a loop to move the orders to the beginning of the array and, probably, ArrayResize(). If it were Collections as in Pascal, all this would be done by a single operation. Maybe there is someone who would like to do it?
//+------------------------------------------------------------------+
//| 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);
}
In principle, the DeleteOrder() function can be derived from here. The number of errors is accumulating...
Added a bit of code. If you want, you can test a simple EA by adding a couple of lines. Source code is in the same place - http://forexsystems.ru/phpBB/viewtopic.php?p=4574#4574 The author would like to thank everybody for their help in writing this snag... :)
Allow the use of cookies to log in to the MQL5.com website.
Please enable the necessary setting in your browser, otherwise you will not be able to log in.
You are signed in. Two-factor authentication has been disabled. Set it up again and scan a new QR code, or continue with two-factor authentication disabled.
You can find the source code here - http://forexsystems.ru/phpBB/viewtopic.php?p=4389#4389
Some things added, some things corrected...
//+------------------------------------------------------------------+ //| 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); }Not missing my ...
Sorry, I rarely find time to look at the forum - very heavy workload.
As soon as the pressure is off after the release of MT4, we'll take up further discussions.
error - to delete an order is not enough to do
myOrdersTotal--;// уменьшили счетчик открытых ордеров pool_pos--;// уменьшили счетчик в списке терминалаRenat,
OK.
As for the idea, we should organize a loop to move the orders to the beginning of the array and, probably, ArrayResize(). If it were Collections as in Pascal, all this would be done by a single operation. Maybe there is someone who would like to do it?
It's quick and easy...
You don't have to write them yourself.
How about not deleting orders, but ticking the box that they have been deleted?
//+------------------------------------------------------------------+ //| 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); }In principle, the DeleteOrder() function can be derived from here. The number of errors is accumulating...
Source code is in the same place - http://forexsystems.ru/phpBB/viewtopic.php?p=4574#4574
The author would like to thank everybody for their help in writing this snag... :)