Características úteis da KimIV - página 75

 

Olá, querido Igor! Meu sistema utiliza supressores de tendências. E tanto o tempo quanto o preço do crossover são importantes nele.
Uma seqüência de barras nem sempre tem um tempo "contínuo". Saídas, furos, etc.
O uso do CrossPointOfLines ( em test_CrossPointOfLines.mq4) para o cálculo do tempo em sua forma natural leva aos seguintes resultados

à esquerda da barra de zero

(A posição das linhas de tendência nos gráficos não tem nada a ver com o sistema - seleção aleatória. Os pontos de referência da linha de tendência podem

sendo uma do lado esquerdo da barra de zero, a outra do lado direito).


e à direita

Os cálculos não devem ser feitos em horas, mas de acordo com a situação: tanto em bares como em horas . A unidade de tempo à esquerda é a barra. E para o lado direito, após a barra zero, ela deve ser medida em horas.

A busca de soluções prontas ainda não rendeu nada. A função CrossPointOfLines é a única no site até agora. Ela requer uma história perfeita :(

 

Bom dia Igor!

Por favor, ajude-me com conselhos ou uma solução. Estou tentando fazer o Expert Advisor dar um sinal quando uma barra anterior "absorve" a barra anterior.

1 - se a absorção ocorreu para cima
2 - se a absorção ocorreu para baixo.

Eu achei muito simples, basta comparar preços abertos e fechados e voilá ... mas não é. Quando passo o mouse sobre as duas barras anteriores, fica claro que a última está comendo a penúltima.

Muita esperança de ajuda, e obrigado antecipadamente


Aqui está o texto:

int start()
{
//
if (SShort()==1)
Alerta("1");
}
if (SLong()==1)
Alerta("2");
}
//

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

Conjunto de filtros de tempo: C e PO

(e mais...).

Uma vez perguntado o que estava acontecendo, aqui está o resultado que eu mesmo cheguei.


1. Proibir ou permitir as atividades diárias.


Opção 1.

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


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

Observe que o "tempo de validade" nestas opções se estende até o final da hora e 59 segundos do número de minutos.

ou seja, o horário final do evento indicado como 23:59 é na verdade 23:59:59

E até o final da hora porque os minutos utilizam o operador de comparação ">=", que no entanto não é um problema e você pode especificar "==",

mas a redução do tempo para 59 segundos ainda funcionará em qualquer caso.


Opção 2.

Mais preciso do ponto de vista da definição das condições...

// Выборка ОТ и ДО
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);}

O tempo é definido especificando de passagem parâmetros para funcionar, por exemplo 21:15:23 como (21,15,23).

É claro que não é legal, mas é um código bastante funcional...

SZY: a verificação da validade dos parâmetros inseridos não é acidental.

Pois, se você entrar errado, isso lhe arrebenta a mente. Eu não consegui encontrar outra maneira, por isso comentei.

Portanto, eu ficaria muito grato por uma maneira de resolver este problema...


Variante nº 3.

Afinal, é o mais simples e o mais exato.

// Внешние параметры, могут быть экстернами
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()
}

O aspecto da simplicidade, ao que parece, está nas peculiaridades de transformação dos parâmetros passados a ela pela função StrToTime().

Por exemplo, se você entrar apenas a hora "HH:MM:SS", então a saída será a hora de cada dia atual...


A propósito...

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

Combinando a amostragem por horas com dias você pode filtrar por tipo:

- o que estava às 18:00 de cada dia, ou o que estava todos os dias em um período especificado a partir de C e acima de horas:minutos:segundos

No entanto, a gama de dias também pode ser abarrotada de e para...


2. Função DataFirstDayMonday()

(com base em DateOfMonday() )

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

Data de retorno do primeiro dia como 00:00:00 do mês corrente.

Necessidade de filtrar eventos aNTES do início do mês.

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

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

DateFirstDayMonday()-1 na segunda amostra imprime "último dia do mês anterior 23:59:59".


...

Por favor, não me chute com antecedência, porque sou um boneco.

:)))

 
Igor por favor ajude a anexar um alerta a este indicador
Arquivos anexados:
 
kombat >> :

Por favor, não me chute com antecedência, porque eu sou um boneco. :)))

Não é um tédio, mas se você pegou o mato, siga-o até o fim. Gostaríamos de mover o tempo de operação permitido e o tempo de fechamento para separar as funções booleanas deste tipo:

bool TradeTime(hora de início do comércio, hora de término do comércio)

Então será muito conveniente usar, se (TradeTime(.,....)) e trabalhar!

 
granit77 >> :

Chyneg não é um chyneg, mas se você pegou o leme, siga em frente. Ele implora para colocar o tempo de operação permitido, tempo de fechamento em funções booleanas separadas:

bool TradeTime(hora de início do comércio, hora de término do comércio)

Será muito conveniente usar então, se (TradeTime(.,...)) e trabalhar!



Bem, já... ;)

Para um banco eu faço uma variante com dois temporizadores simultâneos:

- fechar todos os pedidos e posições antes da prorrogação às 22:00

- pausa comercial desde o início da prorrogação às 22:00 até o final do dia às 23:59

(versão bruta sem verificações adicionais)

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

...(versão em bruto sem verificações adicionais)

Vinin tinha funções separadas para o tempo, muito detalhadas e trabalhadas. Veja nos EAs em seu site ou bata em sua porta.

 
granit77 >> :

A EA da Vinin tem funções separadas para trabalhar com o tempo, que são muito detalhadas e minuciosas. Olhe através dos Conselheiros Especialistas em seu site ou simplesmente bata em sua porta.

Obrigado, mas ainda não há necessidade disso...

De momento, não tenho muito tempo para este assessor,

Sei o que escrever lá e também sei como escrevê-lo...

*

Colocarei o texto principal no fórum do banco a fim de não colocar este tópico em lixo.

Em seu tempo, é claro. ;)

 
granit77 >> :

bool TradeTime(hora de início do comércio, hora de término do comércio)

Então será muito conveniente usar, se (TradeTime(.,...)) e trabalhar!

É necessário encomendar tal função para Igor Kim.

 
goldtrader писал(а) >>

Igor Kim deveria encomendar tal função.

Eu me associo ao pedido! Seria uma função muito útil e necessária. À luz das realidades comerciais atuais....

É até mesmo possível fornecer dois intervalos de tempo ali.