Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 110

 
ilnur17021992:

Por favor, ayúdeme a escribir una función que calcule el número de órdenes y su beneficio total cerrado en los últimos 60 segundos en el par actual. No puedo formularlo correctamente.

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

Creo que puedes entenderlo:

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

Por favor, ayúdeme a escribir una función que calcule el número de órdenes y su beneficio total cerrado en los últimos 60 segundos en el par actual. No puedo encontrarlo en mi lengua, no puedo formularlo correctamente.

   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();
              }
           }
        }
     }
...
 
¿Cómo puedo especificar un trailing stop al abrir una orden?
 
DenZell:
¿Cómo puedo especificar un trailing stop al abrir una orden?
No se puede. La parada se arrastra después de la apertura.
 
trader781:

Si el precio es cero o no está establecido , establece la coordenada de la línea al precio de la última orden. Esto está bien.

El registro también es normal, drena la cuenta como debe ser. No miro los errores sobre el depósito insuficiente.

Pero la línea sigue siendo roja. Es decir, llamamos a la línea de compra, es tal cual, pasamos los parámetros pero se pasan otros.

Esta condición definitivamente no debe ser escrita como en su código. Creas tus propias dificultades para superarlas "heroicamente" ))))

Todo lo que crea la línea roja en el código está comentado, por lo tanto es creado por otra persona. O ha estado colgado en el gráfico desde que esa parte del código estaba en marcha.

Recomiendo lo mismo que he recomendado muchas veces antes - imprimir todas las acciones y los códigos de retorno (errores) en el registro, responderá a muchas preguntas.

 
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);
  }
//+------------------------------------------------------------------+
No tiene una plantilla completa: probablemente no ha configurado los búferes de los indicadores en el asistente, donde se escribirán los datos calculados.

Pero el principio básico para la mayoría de los indicadores es éste:

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

Esta condición no debería escribirse como en su código. Creas tus propias dificultades para superarlas "heroicamente" ))))

Todo lo que crea la línea roja en el código está comentado, por lo tanto es creado por otra persona. O ha estado colgado en el gráfico desde que esa parte del código estaba en marcha.

Recomiendo lo mismo que he recomendado muchas veces antes - imprimir todas las acciones y códigos de retorno (errores) en el registro, esto responderá a muchas preguntas.

Mística de 200 líneas

:)

 
Artyom Trishkin:
No tiene una plantilla completa: probablemente no ha configurado los búferes de los indicadores en el asistente, donde se escribirán los datos calculados.

Pero el principio básico para la mayoría de los indicadores es éste:

//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
DE ACUERDO. Gracias. Lo he transferido a mí. Lo investigaré.
 

¡Por favor, ayuda!

Hay una cadena ABCDEF cómo dividirla en 3 cadenas (guardar en una cadena variable):

AB

CD

EF

 
-Aleks-:

¡Por favor, ayuda!

Hay una cadena ABCDEF cómo dividirla en 3 cadenas (guardar en una cadena variable):

AB

CD

EF

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