Открытый проект - тестер-оптимизатор своими силами - страница 4

 
Сделал переопределение торговой функции OrderClose(), правда, неполное, не закончена обработка массива TradeOrdersArray
Исходник лежит тут - http://forexsystems.ru/phpBB/viewtopic.php?p=4389#4389
Кое-что добавил, кое-что исправил...
//+------------------------------------------------------------------+
//| 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);
  
  }



Не пропадет мой ...

 
я просто хотел, чтобы Ренат сам посмотрел и нашел ошибку.

Извините, я редко нахожу время смотреть форум - очень большая загрузка по работе.
Как снимем напряжение после выпуска МТ4 - займемся дальнейшими обсуждениями.
 
Rosh,
ошибка - для удаления ордера недостаточно сделать
      myOrdersTotal--;// уменьшили счетчик открытых ордеров
      pool_pos--;// уменьшили счетчик  в списке терминала


Renat,

Как снимем напряжение после выпуска МТ4 - займемся дальнейшими обсуждениями.

ОК.

 
Mak, я знаю что удаление ордера "неполное", я даже сначала не хотел счетчики уменьшать, но потом подумал - две строчки не так тяжело вставить.
По идеи , надо организовать цикл по перемещению ордеров к началу массива и возможно ArrayResize(). Если бы это были Коллекции как в Паскале , то все это делается одним оператом, а тут надо пробовать. Может есть желающие?
 
Да, хеш массивы тут не помешали бы.
С ними все быстро и просто ..
Не писать же их самим ..
Может есть желающие?

А может не удалять ордера, а ставить галочки что мол удален?
 
Нет, удалять надо, иначе потом замучаешься отлаживать. Однозначно.
 
Чуть "доделал" функцию.

//+------------------------------------------------------------------+
//| 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);
  
  }



В принципе, отсюда можно вывести функцию DeleteOrder(). Количество ошибок накапливается...

 
 
Немного добавил кода. При желании, добавив пару строчек, можно уже тестировать простенький советник.
Исходник там же - http://forexsystems.ru/phpBB/viewtopic.php?p=4574#4574
Автор выражает огромную признательность всем за помощь в написании этой коряги... :)
 
Что то не пойму как его юзать выложи пример с какими ни будь экспертом если не сложно...

	          
Причина обращения: