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

 
Snajper007 ordre de vente est ouvert, la fonction calcule le prix moyen. Cependant, lorsque le 3ème ordre est ouvert, cette fonction affiche la valeur précédente et la nouvelle valeur (j'ai regardé l'impression dans le journal) mais en conséquence, la valeur précédente reste. Qu'est-ce que j'ai fait de mal ?
//+----------------------------------------------------------------------------+
//| Расчет среденй цены (0)-buy (1)-sell                                       |
//+----------------------------------------------------------------------------+
double GetAveragePrice(int ot=-1)
  {
   double order_lots = 0, order_price = 0, avg_price = 0;
     {
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType()==ot||ot<0)
                 {
                  order_lots += OrderLots();
                  order_price += OrderOpenPrice() * OrderLots();
                 }
              }
           }
        }
     }
   avg_price = NormalizeDouble(order_price / order_lots, Digits);
   return(avg_price);
  }
//+----------------------------------------------------------------------------+
 
MakarFX #:
Merci !
 
Bonjour, qui peut aider à mettre en place un filtre d'ouverture de transaction basé sur des indicateurs ?
 
Sergei Pimenov #:
Bonjour, qui peut aider à mettre en place un filtre d'ouverture de transaction basé sur des indicateurs ?
Lire la suite
 

Aidez-moi à affiner la logique. J'ai besoin d'une pause en heures entre les ordres fermés et l'ouverture d'un nouvel ordre. J'ai mis au point certaines choses. Mais cela ne fonctionne pas.

OrderCloseTime() > 0 && TimeCurrent() - OrderCloseTime() > FstOrderTimeHour*3600 // сигнал на открытие ордера

OrderCloseTime() == 0 // сигнал на открытие первого ордера

где int FstOrderTimeHour = 1 // пауза в часах
 
Порт-моне тв #:

Aidez-moi à affiner la logique. J'ai besoin d'une pause en heures entre les ordres fermés et l'ouverture d'un nouvel ordre. J'ai mis au point certaines choses. Mais cela ne fonctionne pas.

//--- input parameters
input int HourPause = 1;   // Пауза в часах
//--- global parameters
datetime  pause;
//+------------------------------------------------------------------+
void OnTick()
  {
   pause=GetInfoLastPos(3)+(HourPause*60*60);
   // выключаем торговлю
   if(TimeCurrent()<pause) return;
  .......
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                             MakarFX|
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos(int a=1)
  {
   datetime t=0;
   double result=0,l=0,p=0,f=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if(a==1) {result=l;} else
   if(a==2) {result=p;} else
   if(a==3) {result=(double)t;}
   else     {result=0;}
   return(result);
  }
//+----------------------------------------------------------------------------+

Si le magicien n'est pas nécessaire - supprimer le jaune.

 
MakarFX #:

Avant d'ouvrir une commande, vous enregistrez le ticket max_ actuel dans le ticket prev_.

Bon temps Makar, cette méthode de définition du ticket d'avant-dernier ordre présente un sérieux inconvénient. Cette méthode fonctionne lorsque l'ordre maximal de la grille sera ouvert et si cela ne se produit pas, l'avant-dernier ordre est le dernier de la grille (voir l'image). J'essaie d'écrire une fonction mais cela ne fonctionne pas, le dernier ticket est détecté. La condition mise en évidence ne veut pas fonctionner.

//+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0;
     {
      for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
        {
         if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                  if(OrderTicket() > penultimate_ticket)
                     if(penultimate_ticket < GetTicketMaxOrder())
                        penultimate_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return(penultimate_ticket);
  }

 
EVGENII SHELIPOV #:

Bon moment Makar, cette méthode pour l'avant-dernier ticket d'ordre a un sérieux inconvénient. Cette méthode fonctionne lorsque l'ordre maximal est ouvert dans la grille. Si ce n'est pas le cas, l'avant-dernier ordre est égal au dernier, voir l'image. J'essaie d'écrire une fonction mais cela ne fonctionne pas, le dernier ticket est détecté. La condition mise en évidence ne veut pas fonctionner.

Je vous ai donné un code qui fonctionne !
 
MakarFX #:
Je vous ai donné un code qui fonctionne !

Ce code est celui que j'ai écrit plus haut et il y a même une photo de celui-ci.

 
EVGENII SHELIPOV #:

Ce code est celui que j'ai écrit plus haut et il y a même une photo de celui-ci.

L'erreur n'est pas dans l'avant-dernier code de recherche, mais très probablement dans la sortie de l'information vers le texte
Raison: