Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 360

 
gyfto:

Tengo una pregunta infantil. Las variables se declaran en la cabecera del código. Se supone que son globales. Pero no entiendo la diferencia

de

si esta variable se declara en la cabecera. Idealmente, por alcance de la variable. Pero en ambos casos es visible dentro de la función. He hecho una prueba (script):

- No he notado ninguna diferencia. ¿Puedes explicar su diferencia, porque no la entiendo?

Hay un estativo extra ahí. También funcionará sin ella. Tiene sentido declarar la estática dentro de las funciones. Sólo el ámbito del bloque de funciones.
 
Zhunko:
Tiene sentido declarar la estática dentro de las funciones. El ámbito de aplicación es sólo un bloque de funciones.


Funciona de la misma manera:

int a = 10;
int start(){
   Alert(StringConcatenate("st: a = ", a));//st: a = 10
   f1(); Alert(StringConcatenate("f1: a = ", a));//f1: a = 10
   f2(); Alert(StringConcatenate("f2: a = ", a));//f2: a = 10
}
void f1(){
   int a = 11;
   return;
}
void f2(){
   static int a = 12;
   return;
}

¿En qué caso se notará la diferencia? ALXIMIKS, gracias también por la respuesta.

 

¡Hola!

Me podéis decir cómo instalar un indicador/robot adicional en un mt4 instalado en un iphone/ipad? Es, en principio, posible? Con Windows es elementalmente sencillo, pero con los productos móviles de Apple no es tan obvio.

La lógica dice que es posible. Al fin y al cabo, varios indicadores ya están preinstalados. Pero qué y dónde copiar no está claro, la estructura de los archivos es diferente. ¿Hay alguien que no se haya encontrado con este problema?

Gracias de antemano.

 

Estoy haciendo un indicador basado en medias móviles . La idea es cortar los movimientos insignificantes dentro de los puntos especificados. Digamos que establecemos un filtro de 50 pips. El indicador está disminuyendo, pero la disminución es inferior a 50 pips, por lo tanto, tomamos el valor de ayer de la media y lo anotamos y fijamos su nivel para la fecha actual. En la siguiente barra comprobamos la diferencia, el valor actual menos el valor que hemos registrado, si el total no supera los 50 pips, fijamos el nivel que se almacena en la variable estática al valor actual. Si el valor lo supera, el valor se convierte en el valor actual, es decir, similar a una media móvil con un desplazamiento de cero.He probado diferentes variaciones, pero hasta ahora no he encontrado la solución adecuada.

Para simplificar adjunto el código para dibujar sólo los declives. El problema es que el indicador dibuja al alza. Y la principal es que cuando lo ejecuto en el probador puedo ver visualmente el cambio del indicador, mientras que no hay salida fuera del filtro. Supongo que en algún lugar se pierde el valor de la "MA_otshet" registrada.

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red 
//--- input parameters
//--- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double
    raznica,raznica_static,MA_0_t,MA_1_t;
   static double MA_otshet;  //здесь хранится запись значения MA_otshet
   
   for(int i=0;i<Bars;i++)
   {  
      MA_0_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+0);  
      MA_1_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+1); 
      raznica=MA_0_t-MA_1_t; //разница между сегодня и вчера по скользящей средней
      raznica_static=MA_0_t-MA_otshet; //разница между сегодня и MA_otshet

      if(raznica > -0.005 && raznica <= 0) // если raznica не превышает заданное число 
          {
          MA_otshet=MA_1_t; // записываем значение MA_otshet
          }
      if(raznica_static > - 0.005 && raznica_static <= 0) //если raznica_static не превышает заданное число
          {
          ExtMapBuffer1[i]=MA_otshet;  // то рисуем значение индикатора, как записанный MA_otshet
          }
      if(raznica_static < - 0.005) // если raznica превышает заданное число
          {
          ExtMapBuffer1[i]=MA_0_t; // то рисуем значение по текущей цене
          }
   } 
   return(0);
  }
//+------------------------------------------------------------------+
 

Buenas tardes. Por favor, ayuda.

Necesito que todas las órdenes se cierren a las 23:55 y el viernes la negociación termina a las 22:00, por lo que hay un problema con la operación

he encontrado en el tutorial de la secuencia de comandos en la sección de ayuda de tiempo por favor, agregue el número de parámetro del día, es decir, el viernes las órdenes se cerraron a las 21 55 y en días normales a las 23 55 o puede compartir el enlace si hay soluciones ya hechas

//--------------------------------------------------------------------
// timeevents.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10;          // Время закрытия ордеров
bool Flag_Time=false;                  // Флаг, сообщения ещё не было 
//--------------------------------------------------------------- 2 --
int start()                            // Спец. функция start
  {
   int    Cur_Hour=Hour();             // Серверное время в часах
   double Cur_Min =Minute();           // Серверное время в минутах
   double Cur_time=Cur_Hour + Cur_Min100; // Текущее время
   Alert(Cur_time);
   if (Cur_time>=Time_Cls)             // Если наступило время события
      Executor();                      //.. то выполняем задуманное
   return;                             // Выход из start()
  }
//--------------------------------------------------------------- 3 --
int Executor()                         // Пользовательская функция
  {
   if (Flag_Time==false)               // Если ещё не было сообщения..
     {                                 // .. то сообщаем (1 раз)
      Alert("Время важных новостей. Закройте ордера.");
      Flag_Time=true;                  // Теперь сообщение уже было
     }
   return;                             // Выход из польз. функции
  }

//--------------------------------------------------------------- 4 --

 
r772ra:
¡¡Fácil!!


Gracias. Pero tienes una idea. Sólo necesito la información de un día. Esto es para mostrar la información de los beneficios del último día laborable

Se declaran las variables. No funciona. Todo son ceros.

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();

 
Zolotai:


Gracias. Pero, ¿puedes darme una pista? Sólo necesito 1 día. Es decir, para mostrar la información de los beneficios del último día laborable

Se declaran las variables. No funciona. Todo es nulo.

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();


Este Asesor Experto tiene la biblioteca MM_Light y la función en ella:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Считаем итоги работы по своим ордерам                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculate_Pribul (int fi_OP = -2,              // тип (BUY\SELL) учитываемых ордеров
                          datetime fdt_TimeBegin = 0,  // момент времени, с которого производим расчёт
                          string fs_Comment = "")      // комментарий ордеров
{
    double   ld_Pribul = 0.0;
    int      history_total = OrdersHistoryTotal();
//----
    for (int li_ORD = 0; li_ORD < history_total; li_ORD++)
    {
        if (!fCheck_MyOrders (li_ORD, fi_OP, MODE_HISTORY)) continue;
        if (fdt_TimeBegin > OrderCloseTime()) continue;
        if (fs_Comment != "") {if (StringFind (OrderComment(), fs_Comment) < 0) continue;}
        ld_Pribul += (OrderProfit() + OrderSwap() + OrderCommission());
    }
//----
    return (ld_Pribul);
}
El principio no es difícil de entender. Para calcular el beneficio/pérdida del día actual, hay que pasarle el valor: fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "").
 
sannin:

Buenas tardes. Por favor, ayuda.

Necesito que todas las órdenes se cierren a las 23:55 y el viernes la negociación termina a las 22:00, por lo que hay un problema con la operación

he encontrado en el tutorial de la secuencia de comandos en la sección de ayuda de tiempo por favor, agregue el número de parámetro del día, es decir, el viernes las órdenes se cerraron a las 21 55 y en días normales a las 23 55 o puede compartir el enlace si hay soluciones ya hechas

//--------------------------------------------------------------- 4 --

Por supuesto, el código fue escrito desde cero, pero debería funcionar, al menos debería entenderlo

int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.
 case 4://пятница
 case 5://суббота на всякий случай
 case 6://воскресенье на всякий случай
             if((Hour()==22 && Minute()>=00) || Hour()>22){
                 //   Выполняем какое то действие  в пятницу после 22:00
             }
             break;
 case 0://понедельник
 case 1://вторник
 case 2://среда
 case 3://четверг
             if(Hour()>23 || (Hour()==23 && Minute()>55)){
                // все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
             }
              break;
  default:   {//все остальные действия в нормальные рабочии дни до 23:55
  
             }
 }                   
}
 
SetIndexStyle(1,DRAW_LINE,STYLE_DASH,0);
¿Dónde especifica esta parte el grosor de la línea? Incluso estaba avergonzado. :(
 
Link_x:
¿Dónde especifica esta parte el grosor de la línea? Incluso estaba avergonzado. :(
El último parámetro.