Funciones útiles de KimIV - página 75

 

¡Hola, querido Igor! Mi sistema utiliza supresores de tendencia. Y tanto el tiempo como el precio del cruce son importantes en él.
Una secuencia de barras no siempre tiene un tiempo "continuo". Salidas, agujeros, etc.
El uso de CrossPointOfLines ( en test_CrossPointOfLines.mq4) para el cálculo del tiempo en su forma natural conduce a los siguientes resultados

a la izquierda de la barra de cero

(La posición de las líneas de tendencia en los gráficos no tiene nada que ver con el sistema - selección aleatoria. Los puntos de referencia de la línea de tendencia pueden

siendo una a la izquierda de la barra de cero, la otra a la derecha).


y a la derecha

Los cálculos no deben realizarse en horas, sino en función de la situación: tanto en bares como en horas . La unidad de tiempo de la izquierda es el bar. Y para el lado derecho, después de la barra de cero, se debe medir en horas.

La búsqueda de soluciones ya preparadas no ha dado todavía ningún resultado. La función CrossPointOfLines es la única que existe hasta ahora en el sitio. Requiere una historia perfecta :(

 

¡Buenos días Igor!

Por favor, ayúdenme con un consejo o una solución. Estoy intentando que el Asesor Experto dé una señal cuando una barra anterior "absorba" a la anterior.

1 - si la absorción se produjo hacia arriba
2 - si la absorción se produjo hacia abajo.

Pensaba que era muy sencillo, sólo hay que comparar los precios de apertura y cierre y voilá... pero no lo es. Cuando paso el ratón por encima de las 2 barras anteriores, está claro que la última se está comiendo la penúltima.

Espero mucho la ayuda, y gracias de antemano


Este es el texto:

int start()
{
//----
if (SShort()==1)
Alert("1");
}
if (SLong()==1)
Alert("2");
}
//----
return(0);
}
//+------------------------------------------------------------------+
int SShort()
{int MS=0;
if (Open[1]>Close[2] && Close[1]<Open[2] && Open[1]>Close[1] && Open[2]<Close[2])
MS=1;
return(MS);
}
//+------------------------------------------------------------------+
int SLong()
{
int ML=0;
if(Open[1]<Close[2] && Close[1]>Open[2] && Open[1]<Close[1] && Open[2]>Close[2])
ML=1;
return(ML);
}
//+------------------------------------------------------------------+
 

Conjunto de filtros de tiempo: C y PO

(y más...).

Una vez preguntado qué pasa, este es el resultado que se me ocurrió a mí.


1. Prohibir o permitir las actividades diarias.


Opción 1.

// Закрыть все позиции в конце дня в указанное время
if (Hour()==23 && Minute()>=45) 
{ ЗакрытьДень();}


// Запретить эксперту торговать С и ПО
if ( (Hour()==22 && Minute()>=00) && (Hour()==23 && Minute()>=59) ) return;

Tenga en cuenta que el "tiempo de expiración" en estas opciones se extiende hasta el final de la hora y 59 segundos del número de minutos.

es decir, la hora de finalización del evento indicada como 23:59 es en realidad 23:59:59

Y hasta el final de la hora porque los minutos utilizan el operador de comparación ">=", que sin embargo no es un problema y se puede especificar "==",

pero si se borra el tiempo a 59 segundos seguirá funcionando en cualquier caso...


Opción 2.

Más preciso desde el punto de vista del establecimiento de condiciones...

// Выборка ОТ и ДО
if( OtTime(2,15,21) < OrderCloseTime() && OrderCloseTime() < DoTime(4,58,33) )
{ Действия;}

// Функции преобразования 
datetime OtTime(int h=0, int m=0, int s=0) {datetime ot;
ot=( h*3600)+( m*60)+ s+StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
return ( ot);}
//--------------
datetime DoTime(int h=0, int m=0, int s=0) { datetime dt;
//if(h>23||h<0) Alert("Должно быть от 0 до 23"); h=0; 
//if(m>59||m<0) Alert("Должно быть от 0 до 59"); m=0;
dt=( h*3600)+( m*60)+ s+StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
return ( dt);}

La hora se establece especificando al pasar los parámetros a la función, por ejemplo 21:15:23 como (21,15,23).

Está claro que no es genial, pero es un código bastante factible...

SZY: la comprobación de la validez de los parámetros introducidos no es accidental.

Ya que si entras mal, te deja boquiabierto. No he encontrado otra forma, así que lo he comentado.

Por lo tanto, estaría muy agradecido por una forma de resolver este problema...


Variante #3.

Resulta que es la más sencilla y la más exacta.

// Внешние параметры, могут быть экстернами
string ВН="02:15"; // начало события
string ВК="04:58"; // конец события

int start()
{
int m;
datetime vn=StrToTime( ВН);
datetime vk=StrToTime( ВК);
// либо напрямую указывать время по типу:
//  datetime vn=StrToTime("02:15");
//  datetime vk=StrToTime("04:58");

for (int m=0; m < OrdersHistoryTotal() ; m++) 
{
OrderSelect( m, SELECT_BY_POS, MODE_HISTORY);
if( (OrderCloseTime()> vn) && (OrderCloseTime()< vk) )
{ Действия;}
}

return()
}

La cosa de la simplicidad, al parecer, está en las peculiaridades de la transformación de los parámetros que se le pasan por la función StrToTime().

Por ejemplo, si introduce sólo la hora "HH:MM:SS", la salida será la hora de cada día actual...


Por cierto...

// можно написать и так:
if( (OrderCloseTime()>StrToTime( ВН)) && (OrderCloseTime()<StrToTime( ВК)) )
// или даже так:
if( (OrderCloseTime()>StrToTime("02:15")) && (OrderCloseTime()<StrToTime("04:58")) )

Combinando el muestreo por horas con el de días se puede filtrar por tipo:

- lo que fue a las 18:00 de cada día, o lo que fue cada día en el período especificado desde C y hasta horas:minutos:segundos

Sin embargo, el abanico de días también puede estar repleto de...


2. Función DateFirstDayMonday()

(basado en DateOfMonday() )

datetime DateFirstDayMonday() 
{ 
datetime dfdm;
dfdm=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))-((Day()-1)*86400);
return ( dfdm);
}

Devuelve la fecha del primer día como 00:00:00 del mes actual.

Necesidad de filtrar los eventos de ANTES del inicio del mes...

// выборка закрытых ордеров с начала месяца:
if( DateFirstDayMonday() < OrderCloseTime() )
{ Действия;}

// выборка ДО начала месяца (с начала истории счёта):
if( DateFirstDayMonday()-1 > OrderCloseTime() )
{ Действия;}

DateFirstDayMonday()-1 en el segundo ejemplo imprime "último día del mes anterior 23:59:59".


...

Por favor, no me des una patada de antemano, porque soy un tonto.

:)))

 
Igor por favor ayuda a adjuntar una alerta a este indicador
Archivos adjuntos:
 
kombat >> :

Por favor, no me des una patada de antemano, porque soy un tonto. :)))

Chyneg no chyneg, pero si has cogido el arbusto, síguelo hasta el final. Nos gustaría trasladar el tiempo de operación permitido y el tiempo de cierre a funciones booleanas separadas de este tipo:

bool TradeTime(Hora de inicio de la operación, Hora de finalización de la operación)

¡Entonces será muy conveniente utilizar, si (TradeTime(.,...)) y trabajar!

 
granit77 >> :

Chyneg no es un chyneg, pero si has tomado el timón, sigue. Se trata de poner el tiempo de operación permitido, el tiempo de cierre en funciones booleanas separadas de tipo:

bool TradeTime(Hora de inicio de la operación, Hora de finalización de la operación)

¡Será muy conveniente utilizar entonces, si (TradeTime(.,.)) y trabajar!



Bueno, ya... ;)

Para un banco hago variante con dos tiempos simultáneos:

- cerrar todas las órdenes y posiciones antes de la prórroga a las 22:00

- pausa comercial desde el inicio del rollover a las 22:00 hasta el final del día a las 23:59

(versión bruta sin comprobaciones adicionales)

//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
//HHHHH Стартуем... HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH>
int start() {
//--- Общая проверка --------------------------------------------------------+
if(! IsCondition()) {Print("Низззяяя..."); return;}
//--- Задание неторгового времени (паузы) -----------------------------------+
ObjectDelete("НЕТОРГВРЕМЯ");
if((TimeCurrent()>StrToTime("22:00"))&&(TimeCurrent()<StrToTime("23:59:59"))) 
{ NoTradeTime(); return;}
//--- Принудительное закрытие всех ордеров и позиций в конце дня ------------+
if(Hour()==21 && Minute()>=45) { ЗакрытьДень(); return;}
//*метод имеет недостаток: он будет закрывать до конца указаного часа...
//*например время 21:45, закрывать будет до 21:59:59 а с 22:00 прекратит.
//*впринципе это нам не повредит...
//--- Конец условий ---------------------------------------------------------+
// бла-бла-бла...
return(0);
}
 
kombat >> :

...(versión bruta sin controles adicionales)

Vinin tenía funciones separadas para la sincronización, muy detalladas y trabajadas. Busca en los EA de su página web o llama a su puerta.

 
granit77 >> :

El EA de Vinin tiene funciones separadas para trabajar con el tiempo, que son muy detalladas y minuciosas. Busca en los Asesores Expertos de su página web o simplemente llama a su puerta.

Gracias, pero aún no es necesario...

No tengo mucho tiempo para este asesor en este momento,

Sé lo que hay que escribir allí y también sé cómo escribirlo...

*

Publicaré el texto principal en el foro del banco para no ensuciar este tema.

En su tiempo, por supuesto. ;)

 
granit77 >> :

bool TradeTime(Hora de inicio de la operación, Hora de finalización de la operación)

¡Entonces será muy conveniente utilizar, si (TradeTime(.,.)) y trabajar!

Es necesario pedir esa función para Igor Kim.

 
goldtrader писал(а) >>

Igor Kim debería encargar una función de este tipo.

¡Me uno a la petición! Sería una función muy útil y popular. A la luz de las realidades comerciales actuales....

Incluso es posible proporcionar allí dos intervalos de tiempo.

Razón de la queja: