//+------------------------------------------------------------------+
//| 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);
}
ソースコードはこちらで公開しています -http://forexsystems.ru/phpBB/viewtopic.php?p=4389#4389
追加されたもの、修正されたもの...。
私のことを欠かさず ...
申し訳ありませんが、私はほとんどフォーラムを見る時間を見つける - 非常に重い仕事量。
MT4発売後、プレッシャーがなくなり次第、さらに議論を深めていくつもりです。
エラー - 注文の削除を行うには十分ではありません。
レナート
OKです。
アイデアとしては、注文を配列の先頭に移動させるループを整理して、ArrayResize()を するといいかもしれませんね。PascalのようなCollectionsであれば、これらはすべて1回の操作で済んでしまう。もしかしたら、やってみたい人がいるかも?
手軽で簡単...
自分で書かなくてもいいんです。
注文を削除せず、削除されたことにチェックを入れるのはどうでしょうか。
原理的には、ここからDeleteOrder()関数を派生させることができる。エラーがどんどん蓄積されていく...。
ソースコードも同じ場所に -http://forexsystems.ru/phpBB/viewtopic.php?p=4574#4574
このスナッグの執筆にご協力いただいた皆様に感謝いたします。:)