Projet ouvert - tester-optimiser en interne - page 4

 
J'ai fait une redéfinition de la fonction de trading OrderClose(), mais elle est incomplète, le traitement du tableau TradeOrdersArray est incomplet.
Le code source est disponible ici - http://forexsystems.ru/phpBB/viewtopic.php?p=4389#4389
Des choses ajoutées, des choses corrigées...
//+------------------------------------------------------------------+
//| 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);
  
  }



Je ne rate pas mon...

 
Je voulais juste que Renat regarde par lui-même et trouve l'erreur.

Désolé, je trouve rarement le temps de consulter le forum - charge de travail très lourde.
Dès que la pression sera retombée après la sortie de MT4, nous reprendrons les discussions.
 
Rosh,
erreur - il ne suffit pas de supprimer un ordre pour le faire
      myOrdersTotal--;// уменьшили счетчик открытых ордеров
      pool_pos--;// уменьшили счетчик  в списке терминала


Renat,

Dès que la pression sera retombée après la sortie de MT4, nous engagerons de nouvelles discussions.

OK.

 
Mak, je sais que la suppression d'un ordre est "incomplète", je ne voulais même pas réduire les compteurs au début, mais ensuite j'ai pensé - deux lignes ne sont pas si difficiles à insérer.
Quant à l'idée, nous devrions organiser une boucle pour déplacer les commandes au début du tableau et, probablement, ArrayResize(). S'il s'agissait de Collections comme en Pascal, tout cela se ferait par une seule opération. Peut-être y a-t-il quelqu'un qui aimerait le faire ?
 
Oui, les tableaux de hachage seraient une bonne idée.
C'est rapide et facile...
Vous n'avez pas besoin de les écrire vous-même.
Quelqu'un serait-il intéressé ?

Pourquoi ne pas supprimer les commandes, mais cocher la case indiquant qu'elles ont été supprimées ?
 
Non, vous devez le supprimer, sinon vous aurez du mal à le déboguer plus tard. Absolument.
 
Je viens de "terminer" la fonction.

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



En principe, la fonction DeleteOrder() peut être dérivée d'ici. Le nombre d'erreurs s'accumule...

 
J'ai ajouté un peu de code. Si vous le souhaitez, vous pouvez tester un simple EA en ajoutant quelques lignes.
Le code source est au même endroit - http://forexsystems.ru/phpBB/viewtopic.php?p=4574#4574
L'auteur tient à remercier tout le monde pour leur aide dans la rédaction de ce snag... :)
 
Je ne comprends pas comment l'utiliser, postez un exemple avec des experts, si ce n'est pas difficile...