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

 
ilnur17021992:

Veuillez m'aider à écrire une fonction qui calculera le nombre d'ordres et leur profit total fermés dans les 60 dernières secondes sur la paire actuelle. Je n'arrive pas à le formuler correctement.

   int CountClosedSellOrders=0, CountClosedBuyOrders;
   double ClosingSellProfit=0, ClosingBuyProfit;
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
      {
    
         
      }
   }

Je pense que vous pouvez le comprendre :

//----------------- Возвращает суммарный профит последних закрытых позиций ---------------------+
double GetProfitOldClosePos(string symb="", int type=-1, int mg=-1) {
if(symb=="0") symb=Symbol();
datetime gt=0,ct=0;
double pr=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
    if(OrderSymbol()==symb &&(type<0||OrderType()==type)&& OrderMagicNumber()==mg) {
     ct=OrderCloseTime();
     // 120 секунд разницы между закрытием первой и последней в сетке
      if((gt<=ct && ct<=gt+120) || gt==0) {
       gt=ct;
       pr+=OrderProfit()+OrderCommission()+OrderSwap();
  }}}}
  return(pr);
}
 
ilnur17021992:

Veuillez m'aider à écrire une fonction qui calculera le nombre d'ordres et leur profit total fermés dans les 60 dernières secondes sur la paire actuelle. Je n'arrive pas à le trouver sur ma langue, je n'arrive pas à le formuler correctement.

   int CountClosedSellOrders=0, CountClosedBuyOrders;
   double ClosingSellProfit=0, ClosingBuyProfit;
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
      {
         if(OrderType()==OP_SELL)
         {
            if(. . .)                    
            {
               CountClosedSellOrders++;
               ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
            }
         if(OrderType()==OP_BUY)
         {
            if(. . .)                    
            {
               CountClosedBuyOrders++;
               ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
            }
         }
      }
   }


   int CountClosedSellOrders=0,CountClosedBuyOrders;
   double ClosingSellProfit=0,ClosingBuyProfit;
//for(int i=0; i<OrdersHistoryTotal(); i++)
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
        {
         if(OrderCloseTime()>=TimeCurrent()-60)
           {
            if(OrderType()==OP_SELL)
              {
               CountClosedSellOrders++;
               ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
              }
            if(OrderType()==OP_BUY)
              {
               CountClosedBuyOrders++;
               ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
...
 
Comment spécifier un stop suiveur lors de l'ouverture d'un ordre ?
 
DenZell:
Comment spécifier un stop suiveur lors de l'ouverture d'un ordre ?
Tu ne peux pas. L'arrêt chaloupe après l'ouverture.
 
trader781:

Si le prix est égal à zéro ou n'est pas défini , la coordonnée de la ligne est fixée au prix du dernier ordre. C'est bien.

Le journal est également normal, il draine le compte comme il se doit. Je ne regarde pas les erreurs concernant les dépôts insuffisants.

Mais la ligne est toujours rouge. C'est-à-dire qu'on appelle la ligne d'achat, c'est ainsi, on passe les paramètres, mais d'autres sont passés.

Cette condition ne doit absolument pas être écrite comme dans votre code. Vous créez vos propres difficultés pour les surmonter "héroïquement" ))))

Tout ce qui crée la ligne rouge dans le code est commenté, il est donc créé par quelqu'un d'autre. Ou bien il est resté accroché au graphique depuis que cette partie du code était en cours de réalisation.

Je recommande la même chose que ce que j'ai déjà recommandé à plusieurs reprises - imprimez toutes les actions et les codes de retour (erreurs) dans le journal, cela répondra à de nombreuses questions.

 
Andrey Koldorkin:
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Vous n'avez pas un modèle complet - vous n'avez probablement pas défini les tampons d'indicateur dans l'assistant, où les données calculées seront écrites.

Mais le principe de base pour la plupart des indicateurs est le suivant :

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<1) return(0);              // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то проверять нужно это количество, а не 1
  
   //--- Действия для полного перерасчёта индикатора
   int limit=rates_total-prev_calculated;    // количество посчитанных уже баров
   if(limit>1) {                             // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
      limit=rates_total-1;                   // задаём количество требуемых для расчёта баров равным количеству баров в истории,
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
                                             // так же тут нужно при необходимости произвести инициализацию буферов индикатора
      }
  
   //--- Основной цикл индикатора
   for(int i=limit; i>=0; i--) {
      // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
      ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0;   // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
      }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Vitalie Postolache:

Cette condition ne doit certainement pas être écrite comme dans votre code. Vous créez vos propres difficultés pour les surmonter "héroïquement" ))))

Tout ce qui crée la ligne rouge dans le code est commenté, il est donc créé par quelqu'un d'autre. Ou bien il a été suspendu au tableau depuis que cette partie du code était en cours de réalisation.

Je vous recommande la même chose que j'ai déjà recommandée à de nombreuses reprises - imprimez toutes les actions et les codes de retour (erreurs) dans le journal, cela répondra à de nombreuses questions.

200 ligne mystique

:)

 
Artyom Trishkin:
Vous n'avez pas un modèle complet - vous n'avez probablement pas défini les tampons d'indicateur dans l'assistant, où les données calculées seront écrites.

Mais le principe de base pour la plupart des indicateurs est le suivant :

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<1) return(0);              // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то проверять нужно это количество, а не 1
  
   //--- Действия для полного перерасчёта индикатора
   int limit=rates_total-prev_calculated;    // количество посчитанных уже баров
   if(limit>1) {                             // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
      limit=rates_total-1;                   // задаём количество требуемых для расчёта баров равным количеству баров в истории,
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
                                             // так же тут нужно при необходимости произвести инициализацию буферов индикатора
      }
  
   //--- Основной цикл индикатора
   for(int i=limit; i>=0; i--) {
      // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
      ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0;   // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
      }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
OK. Merci ! Je l'ai transféré sur moi. Je me pencherai sur la question.
 

Aidez-moi !

Il y a une chaîne ABCDEF comment la diviser en 3 chaînes (sauvegarder dans une chaîne variable) :

AB

CD

EF

 
-Aleks-:

Aidez-moi !

Il y a une chaîne ABCDEF comment la diviser en 3 chaînes (sauvegarder dans une chaîne variable) :

AB

CD

EF

string  StringSubstr(
   string  string_value,     // строка
   int     start_pos,        // с какой позиции начать
   int     length=0          // длина извлекаемой строки
   );
...
Raison: