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(){
staticint a = 12;
return;
}
¿En qué caso se notará la diferencia? ALXIMIKS, gracias también por la respuesta.
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?
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_buffers1#property indicator_color1 Red
//--- input parameters//--- buffersdouble ExtMapBuffer1[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
//---- indicatorsSetIndexStyle(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;
staticdouble MA_otshet; //здесь хранится запись значения MA_otshetfor(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_otshetif(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);
}
//+------------------------------------------------------------------+
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 --externdoubleTime_Cls=16.10; // Время закрытия ордеровboolFlag_Time=false; // Флаг, сообщения ещё не было //--------------------------------------------------------------- 2 --intstart()// Спец. функция start{intCur_Hour=Hour(); // Серверное время в часахdoubleCur_Min =Minute(); // Серверное время в минутахdoubleCur_time=Cur_Hour + Cur_Min100; // Текущее времяAlert(Cur_time);
if(Cur_time>=Time_Cls)// Если наступило время событияExecutor(); //.. то выполняем задуманноеreturn; // Выход из start()}//--------------------------------------------------------------- 3 --intExecutor()// Пользовательская функция{if(Flag_Time==false)// Если ещё не было сообщения..{// .. то сообщаем (1 раз)Alert("Время важных новостей. Закройте ордера.");
Flag_Time=true; // Теперь сообщение уже было}return; // Выход из польз. функции}
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), "").
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
Por supuesto, el código fue escrito desde cero, pero debería funcionar, al menos debería entenderlo
int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.case4://пятницаcase5://суббота на всякий случайcase6://воскресенье на всякий случайif((Hour()==22 && Minute()>=00) || Hour()>22){
// Выполняем какое то действие в пятницу после 22:00
}
break;
case0://понедельникcase1://вторникcase2://средаcase3://четвергif(Hour()>23 || (Hour()==23 && Minute()>55)){
// все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
}
break;
default: {//все остальные действия в нормальные рабочии дни до 23:55
}
}
}
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?
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:
¿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.
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 --
¡¡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();
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();
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), "").
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
¿Dónde especifica esta parte el grosor de la línea? Incluso estaba avergonzado. :(