Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 110

 
ilnur17021992:

Per favore aiutatemi a scrivere una funzione che calcoli il numero di ordini e il loro profitto totale chiuso negli ultimi 60 secondi sulla coppia corrente. Non riesco a formularlo correttamente.

   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())
      {
    
         
      }
   }

Credo che lei possa capirlo:

//----------------- Возвращает суммарный профит последних закрытых позиций ---------------------+
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:

Per favore aiutatemi a scrivere una funzione che calcoli il numero di ordini e il loro profitto totale chiuso negli ultimi 60 secondi sulla coppia corrente. Non riesco a trovarlo sulla lingua, non riesco a formularlo correttamente.

   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();
              }
           }
        }
     }
...
 
Come posso specificare un trailing stop quando apro un ordine?
 
DenZell:
Come posso specificare un trailing stop quando apro un ordine?
Non si può. Lo stop traina dopo l'apertura.
 
trader781:

Se il prezzo è zero o non è impostato , imposta la coordinata della linea al prezzo dell'ultimo ordine. Questo va bene.

Anche il registro è normale, prosciuga l'account come dovrebbe essere. Non guardo gli errori di deposito insufficiente.

Ma la linea è ancora rossa. Cioè chiamiamo la linea di acquisto, è così com'è, passiamo i parametri ma ne vengono passati altri.

Questa condizione non dovrebbe assolutamente essere scritta come nel vostro codice. Ti crei le tue difficoltà per superarle "eroicamente" ))))

Tutto ciò che crea la linea rossa nel codice è commentato, quindi è creato da qualcun altro. Oppure è rimasto appeso al grafico da quando quella parte del codice era in lavorazione.

Raccomando la stessa cosa che ho raccomandato molte volte in precedenza - stampare tutte le azioni e i codici di ritorno (errori) nel log, risponderà a molte domande.

 
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);
  }
//+------------------------------------------------------------------+
Non hai un modello completo - probabilmente non hai impostato i buffer degli indicatori nella procedura guidata, dove verranno scritti i dati calcolati.

Ma il principio di base per la maggior parte degli indicatori è questo:

//+------------------------------------------------------------------+
//| 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:

Questa condizione non dovrebbe certamente essere scritta come nel vostro codice. Ti crei le tue difficoltà per superarle "eroicamente" ))))

Tutto ciò che crea la linea rossa nel codice è commentato, quindi è creato da qualcun altro. Oppure è rimasto appeso al grafico da quando quella parte del codice era in lavorazione.

Raccomando la stessa cosa che ho raccomandato molte volte in precedenza - stampare tutte le azioni e i codici di ritorno (errori) nel log, questo risponderà a molte domande.

200 linea mistica

:)

 
Artyom Trishkin:
Non hai un modello completo - probabilmente non hai impostato i buffer degli indicatori nella procedura guidata, dove verranno scritti i dati calcolati.

Ma il principio di base per la maggior parte degli indicatori è questo:

//+------------------------------------------------------------------+
//| 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. Grazie! L'ho trasferito a me. Ci darò un'occhiata.
 

Per favore, aiutatemi!

C'è una stringa ABCDEF come dividerla in 3 stringhe (salvare in una stringa variabile):

AB

CD

EF

 
-Aleks-:

Per favore, aiutatemi!

C'è una stringa ABCDEF come dividerla in 3 stringhe (salvare in una stringa variabile):

AB

CD

EF

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