프로젝트 열기 - DIY 테스터 최적화 도구 - 페이지 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);
  
  }



내... 잃지 않을거야...

 
나는 단지 Renat가 직접 보고 실수를 찾기를 원했습니다.

죄송합니다. 작업량이 매우 많아서 포럼을 볼 시간이 거의 없습니다.
MT4 출시 이후 어떻게 긴장을 풀 것인가 - 추후 논의를 통해 다룰 예정이다.
 
로쉬,
오류 - 주문을 삭제하는 것만으로는 충분하지 않습니다.
      myOrdersTotal--;// уменьшили счетчик открытых ордеров
      pool_pos--;// уменьшили счетчик  в списке терминала


레나트,

MT4 출시 이후 어떻게 긴장을 풀 것인가 - 추후 논의를 통해 다룰 예정이다.

확인.

 
Mak, 나는 주문을 삭제하는 것이 "불완전"하다는 것을 알고 처음에는 카운터를 줄이고 싶지도 않았지만 두 줄을 삽입하는 것이 그렇게 어렵지 않다고 생각했습니다.
아이디어에 따르면 배열의 시작 부분과 ArrayResize() 로 주문을 이동하는 주기를 구성해야 합니다. 이것이 Pascal에서와 같이 컬렉션이라면 이 모든 작업은 한 명의 연산자에 의해 수행되지만 여기에서는 시도해야 합니다. 싶은 분들이 있지 않을까요?
 
예, 해시 배열은 여기서 문제가 되지 않습니다.
그들과 함께 모든 것이 빠르고 쉽습니다..
직접 작성하지 마십시오.
싶은 분들이 있지 않을까요?

아니면 주문을 삭제하지 않고 삭제되었다는 확인란을 선택하시겠습니까?
 
아니요, 삭제해야 합니다. 그렇지 않으면 나중에 디버그하기 위해 괴로워할 것입니다. 분명히.
 
기능이 약간 "완료"되었습니다.

//+------------------------------------------------------------------+
//| 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
저자는 이 문제를 작성하는 데 도움을 준 모든 사람에게 깊은 감사를 표합니다... :)
 
사용법이 이해가 안가는 부분은 전문가와 함께 예시를 들어보시거나 어렵지 않으시다면...