Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1952

 
Vitaly Muzichenko #:

J'interviens :)

Il existe un indice DAX30 = coté de 9 à 22

Comment savoir combien de barres il y a dans une session sur le Timeframe M15, H1 etc.

Maxim Kuznetsov #:

(22*3600-9*3600)/PeriodSeconds(M15)

mais c'est idéalement "ce nombre de bars devrait se trouver entre 9h00 et 22h00".

Plus l'horizon temporel est petit, plus l'erreur est grande, en réalité elle est presque toujours moindre. Vous ne pouvez pas utiliser l'historique pour calculer "la prochaine session toutes les N barres".

C'est beaucoup plus simple...

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Bonjour à tous.

J'ai besoin de votre aide.

L'EA a une fonction de comptage intégrée pour le profit actuel :

double GetProfitFromStart()
  {
   double lp=0,cp=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(lp+cp);
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot"   ,1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
       DrawLABEL("lab_Take" ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2)));
      TrailingOrders();
   }

void OnTick est constitué comme ci-dessus.

Comment faire en sorte que le compteur de profit se remette à 0.0 lorsque les conditions sont remplies :

si(CountOrders()==0) && (GetProfitFromStart()>0

c'est-à-dire que tous les ordres sont fermés et que le profit total lors de la fermeture du dernier ordre était >0 ?

 

Installé MT4. Ne sauvegarde pas les guillemets après la fermeture du terminal - en charge un nouveau à chaque fois.

 
Maxim Kuznetsov #:

même en 4, il est préférabled'"ouvrir d'abord, modifier ensuite".

Tout le monde ne vous permet pas d'ouvrir sur le marché avec un Stop Loss en même temps.

D'ailleurs, le stop loss ne se produit pas partout. Si vous voulez négocier avec un ordre stop-loss, vous devez le vérifier sur le serveur du courtier, c'est son service personnel (crédit, risque, gains), pas là où vous le pensez, il n'y a pas de canal de négociation des ordres stop-loss.

Merci, oui, même la démo sur différents courtiers montre des conditions trop différentes.

 
законопослушный гражданин #:

Bonjour à tous.

J'ai besoin de votre aide.

L'EA a une fonction de comptage intégrée pour le profit actuel :

void OnTick est constitué comme ci-dessus.

Comment faire en sorte que le compteur de profit se remette à 0.0 lorsque les conditions sont remplies :

si(CountOrders()==0) && (GetProfitFromStart()>0

C'est-à-dire que tous les ordres sont fermés et que le profit total lors de la fermeture du dernier ordre était >0 ?

Cette tâche n'est pas tout à fait claire. À chaque fois, la fonction de calcul commence à parcourir les ordres/positions et résume les bénéfices à partir de zéro.

 double lp=0,cp=0;

Qu'est-ce que tu veux mettre à zéro ? Si vous n'avez pas de positions/ordres de marché ouverts, la fonction de comptage retournera zéro. Il se remettra à zéro tout seul)))

 
законопослушный гражданин #:

Bonjour à tous.

J'ai besoin de votre aide.

Comment faire en sorte que le compteur de profit se remette à 0.0 lorsque les conditions sont remplies :

c'est-à-dire que tous les ordres ont été fermés et que le profit total à la fermeture du dernier ordre était >0 ???

Qu'est-ce qui ne fonctionne pas exactement ?

 

Bon après-midi. Aidez-moi, s'il vous plaît.

Recherche d'ordres fermés avec des retours négatifs.
Par les totaux il manque, je n'obtiens pas le résultat de tous les ordres négatifs.

J'apprends à écrire.

double Minus_profit(){
 for (int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
          if (OrderCloseTime()>=time && OrderTicket()>ticket){
            if (OrderProfit()+OrderSwap()+OrderCommission()<0){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}}return(result);
}
 
Alexander Avksentyev #:

Bon après-midi. Aidez-moi, s'il vous plaît.

Recherche d'ordres fermés avec des retours négatifs.
Par les totaux il manque, je n'obtiens pas le résultat de tous les ordres négatifs.

J'essaie d'apprendre à écrire.

En un coup d'œil rapide, je vois que vous regardez les positions depuis la fin et en même temps, vous écrivez l'heure de clôture dans la variable. Il se peut que vous ayez capturé l'heure de la dernière position fermée et que la condition suivante ne soit plus vraie :

OrderCloseTime()>=time

car d'autres positions ont des temps de fermeture inférieurs. Tout cela dépend du tri, mais dans le tri standard, c'est le problème.


Corrigez également cette condition

(OrderType() == OP_BUY || OP_SELL)

à

(OrderType() == OP_BUY || OrderType() == OP_SELL)

Si nous prenons une position dans l'historique, OrderProfit() stockera déjà le résultat final avec les swaps et la commission. Dans les postes ouverts - non, tout doit être résumé. Mais ce n'est pas certain, vérifiez-le.

 
Nikita Chernyshov #:

En un coup d'œil rapide, je vois que vous examinez les positions depuis la fin et que vous écrivez l'heure de clôture dans la variable. Il se peut que vous ayez capturé l'heure de la dernière position fermée et que la condition suivante ne soit plus vraie :

car d'autres positions ont des temps de fermeture inférieurs. Tout cela dépend du tri, mais dans le tri standard, c'est le problème.


Corrigez également cette condition

à

Si nous prenons une position dans l'historique, OrderProfit() stockera déjà le résultat final avec les swaps et la commission. Dans les postes ouverts - non, tout doit être résumé. Mais ce n'est pas exact, veuillez vérifier.

Merci. Cela fonctionne bien.

double Minus_profit(){
time=TimeCurrent();
 for (int i=0; i<OrdersHistoryTotal(); i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic){
        if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
          if (OrderProfit()+OrderSwap()+OrderCommission()<=0){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}}return(result);
}

De plus, lorsque nous rencontrons un ordre avec un profit positif, nous devons réinitialiser le résultat et rechercher les ordres négatifs.

 
Alexander Avksentyev #:

Bon après-midi. Aidez-moi, s'il vous plaît.

Recherche d'ordres fermés avec des retours négatifs.
Par les totaux il manque, je n'obtiens pas le résultat de tous les ordres négatifs.

J'apprends à écrire.

Je recommande l'utilisation d'un débogueur pour ce genre de situation.

Raison: