[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 118

 

Il génère beaucoup d'erreurs


 

Désolé, alex12, mais vous ressemblez à un bulldozer (sans vouloir vous offenser, c'est un terme accepté). Vous fabriquez quelque chose à partir de différents morceaux et vous arrivez à le compiler, mais vous ne comprenez pas la signification du code.

Contactez le service Travail.

 
alex12:

Il génère beaucoup d'erreurs


Lorsque vous utilisez certaines des fonctions d'Igor Kim, assurez-vous que vous avez dans votre code les fonctions manquantes dont le compilateur vous parle. Trouvez-les dans sa branche et écrivez-les dans votre code.
 
chief2000:
...

OrderOpenTime() indique l'heure à laquelle la position a été ouverte, ma question est la suivante : comment puis-je connaître l'heure à laquelle l'ordre STOP a été fixé ?
Le rapport MT4 indique cette heure, mais est-il possible de la trouver à partir du code ?


Encore une fois.

Passez en revue tous vos ordres stop dans un cycle "standard", et pour vous-même, relevez la valeur de l'OrderOpenTime() pour chacun d'entre eux - ce doit être l'heure à laquelle ils (chacun d'entre eux) ont été fixés. Voici un exemple pour les ordres de marché - ajustez-le un peu, c'est-à-dire, ou supprimez cette ligne complètement

si ((orderType != OP_BUY) && (orderType != OP_SELL)) continuez ;

ou le remplacer par les données des ordres stop qui vous intéressent...

int orderCount = 0; // сбрасываем счетчик ордеров 
      // ------------------------------------------------Считаем только наши ордера---------------------------
   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue; // если ордер не выбран, то идем на следующий открытый
      if(OrderCloseTime()!=0) continue;                          // если тикет принадлежит закрытому ордеру, то берем следующий открытый
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))   continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))   continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера 
          Time = O rderOpenTime();
         
                     
         
      orderCount++;                     // считаем ордера (не больше i)           

    }   
 
Roman.:


Encore une fois.
Passez en revue tous vos ordres stop dans une boucle "standard", et pour vous-même, imprimez la valeur de OrderOpenTime() pour chacun d'entre eux - ce doit être l'heure à laquelle ils (chacun d'entre eux) sont fixés. Voici un exemple pour les ordres de marché - ajustez-le un peu, c'est-à-dire, ou supprimez cette ligne complètement

si ((orderType != OP_BUY) && (orderType != OP_SELL)) continuez ;

ou le remplacer par les données des ordres stop qui vous intéressent...

À ce stade, j'ai rencontré un dilemme - j'ai besoin du moment de l'ouverture d'un ordre STOP pour certaines "statistiques" et je ne voudrais pas que ce processus soit exécuté en permanence, mais seulement à une certaine étape finale. Pour cette raison, nous n'avons pas besoin de rechercher les ordres actuellement ouverts (OrdersTotal()), mais de rechercher parmi les ordres déjà fermés => OrdersHistoryTotal().
Mais pour les ordres STOP qui ont déjà été fermés, OrderOpenTime() renvoie l'heure d'ouverture de la position, et non l'heure à laquelle l'ordre a été placé.
En conséquence, tout se résume à ceci : est-il possible de récupérer l'heure à laquelle les ordres STOP de la liste de OrdersHistoryTotal(), lorsqu'ils ont été fixés ?
 
chief2000:
C'est là que j'ai rencontré un dilemme - j'ai besoin du temps d'ouverture de l'ordre STOP pour certaines "statistiques" et je ne voudrais pas que ce processus soit exécuté en permanence, mais seulement à un certain stade final. Pour cette raison, nous n'avons pas besoin de rechercher les ordres ouverts à ce moment-là (OrdersTotal()), mais de rechercher parmi les ordres déjà fermés => OrdersHistoryTotal().
Mais pour les ordres STOP qui ont déjà été fermés, OrderOpenTime() renvoie l'heure d'ouverture de la position, et non l'heure à laquelle l'ordre a été placé.
En conséquence, tout se résume à ceci : est-il possible de récupérer l'heure à laquelle les ordres STOP de la liste de OrdersHistoryTotal(), lorsqu'ils ont été fixés ?

Oui... Le défi... JE NE SAIS PAS. On dirait que non - surtout dans les "phases finales"...

Vous devez constamment surveiller ce processus et en garder la trace - voir le post FAQ de la page précédente.

 
Roman.:

Oui... Le défi... JE NE SAIS PAS. On dirait que non - surtout dans les "phases finales"...

Vous devez constamment surveiller ce processus et en garder la trace - voir le post FAQ de la page précédente.

Si aucune autre solution n'est trouvée, j'utiliserai les commandes provenant de OrdersTotal().
Merci quand même !
 
Dans ce cas, il est plus facile d'écrire dans un fichier, moins de tracas, et les statistiques peuvent être organisées en fonction de vos besoins, et non du terminal.
 
FAQ:
Dans ce cas, il est plus facile d'écrire dans un fichier, moins de tracas, et les statistiques peuvent être organisées en fonction de vos besoins, et non du terminal.
Merci !
 

Je veux écrire un Expert Advisor sur le modèle de la pince.

J'ai choisi

Low2=Low[iLowest(NULL,0,MODE_LOW,10,2)]    
High2=High[iHighest(NULL,0,MODE_HIGH,10,2)]     

if(Low[1]==Low2) bull_pincet=true;
if(High[1]==High2) bear_pincet=true;

   while(true)
      {
       
       if(Total==0 && bull_pincet==true)
        {
         sl=Low[1];
         if(sl<Step)sl=Step;
         tp=Ask+((Ask-sl)*k);
                  
         OrderSend(Symb,OP_BUY,Lts,Ask,3,sl,tp);
         return;
        }

        if(Total==0 && bear_pincet==true)
         {
          sl=High[1];
          if(sl<Step)sl=Step;
          tp=Bid-((sl-Bid)*k);
          OrderSend(Symb,OP_SELL,Lts,Bid,3,sl,tp);
          return;
         }
       break;
      }   

Malheureusement pour moi, la condition est erronée car 'sl' est fixé à 100.00000 et 'tp' montre une erreur.

J'ai décidé d'ajouter une condition pour considérer 1 tick.

static datetime TimeSaveH1  = 0;
int init()
{
     TimeSaveH1  = iTime( Symbol(), Period(), 0); // берем открытия время текущего бара
}

int start()
{
         if (TimeSaveH1!=iTime( Symbol(), Period(), 0))
            {
               TimeSaveH1=iTime( Symbol(), Period(), 0); 
            }  

Low2=Low[iLowest(NULL,0,MODE_LOW,10,2)]    
High2=High[iHighest(NULL,0,MODE_HIGH,10,2)]     

if(Low[1]==Low2 && TimeSaveH1===iTime( Symbol(), Period(), 0) bull_pincet=true;
if(High[1]==High2 && TimeSaveH1===iTime( Symbol(), Period(), 0) bear_pincet=true;
   while(true)
      {
       
       if(Total==0 && bull_pincet==true)
        {
         sl=Low[1];
         if(sl<Step)sl=Step;
         tp=Ask+((Ask-sl)*k);
                  
         OrderSend(Symb,OP_BUY,Lts,Ask,3,sl,tp);
         return;
        }

        if(Total==0 && bear_pincet==true)
         {
          sl=High[1];
          if(sl<Step)sl=Step;
          tp=Bid-((sl-Bid)*k);
          OrderSend(Symb,OP_SELL,Lts,Bid,3,sl,tp);
          return;
         }
       break;
      }   




}

le résultat est le même. comment puis-je résoudre mon problème ?