Fonctions utiles de KimIV - page 75

 

Bonjour, cher Igor ! Mon système utilise des suppresseurs de tendance. Et le temps et le prix du crossover y sont importants.
Une séquence de mesures n'a pas toujours un temps "continu". Sorties, trous, etc.
L'utilisation de CrossPointOfLines ( dans test_CrossPointOfLines.mq4) pour le calcul du temps dans sa forme naturelle conduit aux résultats suivants

à gauche de la barre de zéro

(La position des lignes de tendance sur les graphiques n'a rien à voir avec le système - sélection aléatoire. Les points de référence de la ligne de tendance peuvent

l'un à gauche de la barre de zéro, l'autre à droite).


et à droite

Les calculs ne doivent pas être effectués en heures, mais en fonction de la situation : à la fois en barres et en heures . L'unité de temps à gauche est la barre. Et pour le côté droit, après la barre de zéro, il faut mesurer en heures.

La recherche de solutions toutes faites n'a encore rien donné. La fonction CrossPointOfLines est la seule présente sur le site jusqu'à présent. Il faut une histoire parfaite :(

 

Bonne journée Igor !

Veuillez m'aider en me donnant des conseils ou une solution. J'essaie de faire en sorte que le Conseiller Expert donne un signal lorsqu'une barre précédente "absorbe" la précédente.

1 - si l'absorption a eu lieu vers le haut
2 - si l'absorption a eu lieu vers le bas.

Je pensais que c'était très simple, il suffit de comparer les prix d'ouverture et de clôture et voilà ... mais ce n'est pas le cas. Lorsque je passe ma souris sur les 2 barres précédentes, il est clair que la dernière mange l'avant-dernière.

J'espère vivement que vous m'aiderez et je vous remercie par avance.


Voici le texte :

int start()
{
//----
if (SShort()==1)
Alert("1") ;
}
si (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) ;
}
//+------------------------------------------------------------------+
 

Jeu de filtres temporels : C et PO

(et plus encore...).

Lorsqu'on m'a demandé ce qu'il en était, voici le résultat que j'ai trouvé moi-même.


1. Interdire ou autoriser les activités quotidiennes.


Option 1.

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


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

Notez que le "délai d'expiration" de ces options s'étend jusqu'à la fin de l'heure et des 59 secondes du nombre de minutes.

c'est-à-dire que l'heure de fin de l'événement indiquée comme étant 23:59 est en réalité 23:59:59

Et jusqu'à la fin de l'heure car les minutes utilisent l'opérateur de comparaison ">=", ce qui n'est cependant pas un problème et vous pouvez spécifier "==",

mais en ramenant le temps à 59 secondes, cela fonctionnera de toute façon...


Option 2.

Plus précis du point de vue de l'établissement des conditions...

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

L'heure est définie en spécifiant en passant des paramètres à la fonction, par exemple 21:15:23 comme (21,15,23).

Il est clair que ce n'est pas cool, mais c'est un code tout à fait exploitable...

SZY : le contrôle de validité des paramètres saisis n'est pas accidentel.

Car si vous entrez dans le mauvais, vous serez époustouflé. Je n'ai pas trouvé d'autre moyen, alors je l'ai commenté.

Par conséquent, je vous serais très reconnaissant de trouver un moyen de résoudre ce problème...


Variante n°3.

Il s'avère que c'est le plus simple et le plus exact.

// Внешние параметры, могут быть экстернами
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 simplicité, semble-t-il, réside dans les particularités de la transformation des paramètres qui lui sont passés par la fonction StrToTime().

Par exemple, si vous entrez uniquement l'heure "HH:MM:SS", la sortie sera l'heure de chaque jour actuel...


D'ailleurs...

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

En combinant l'échantillonnage par heures et par jours, vous pouvez filtrer par type :

- ce qu'il y avait à 18:00 de chaque jour, ou ce qu'il y avait chaque jour de la période spécifiée à partir de C et plus heures:minutes:secondes

Cependant, l'éventail des jours peut aussi être chargé de et vers...


2. Fonction DateFirstDayMonday()

(basé sur DateOfMonday() )

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

Renvoie la date du premier jour à 00:00:00 du mois en cours.

J'avais besoin de filtrer les événements d'AVANT le début du mois...

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

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

DateFirstDayMonday()-1 dans le deuxième échantillon imprime "dernier jour du mois précédent 23:59:59".


...

S'il vous plaît, ne me donnez pas de coup de pied à l'avance, parce que je suis un imbécile.

:)))

 
Igor, aidez-moi à attacher une alerte à cet indicateur.
Dossiers :
 
kombat >> :

S'il vous plaît, ne me donnez pas de coup de pied à l'avance, parce que je suis un imbécile. :)))

Chyneg pas chyneg, mais si vous avez pris le buisson, suivez-le jusqu'au bout. Nous aimerions que les heures de fonctionnement et de fermeture autorisées soient séparées des fonctions booléennes de ce type :

bool TradeTime(Heure de début de transaction, Heure de fin de transaction)

Il sera alors très pratique d'utiliser, if (TradeTime(.,...)) et de travailler !

 
granit77 >> :

Chyneg n'est pas un chyneg, mais si vous avez pris le gouvernail, allez jusqu'au bout. Il faudrait mettre le temps de fonctionnement autorisé et le temps de fermeture dans des fonctions booléennes distinctes :

bool TradeTime(Heure de début de négociation, Heure de fin de négociation)

Il sera très pratique d'utiliser alors, if (TradeTime(.,.)) et de travailler !



Eh bien, déjà... ;)

Pour une banque, je fais une variante avec deux timings simultanés :

- clôturer tous les ordres et toutes les positions avant le retournement à 22h00

- pause commerciale du début du roulement à 22:00 jusqu'à la fin de la journée à 23:59

(version brute sans contrôles supplémentaires)

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

...(version brute sans contrôles supplémentaires)

Vinin avait des fonctions séparées pour le timing, très détaillées et élaborées. Regardez dans les EA sur son site ou frappez à sa porte.

 
granit77 >> :

Vinin a eu des fonctions séparées pour travailler avec le temps, elles sont très détaillées et minutieuses. Regardez les conseillers experts sur son site ou frappez simplement à sa porte.

Merci, mais ce n'est pas encore nécessaire...

Je n'ai pas beaucoup de temps pour ce conseiller en ce moment,

Je sais ce qu'il faut y écrire et je sais aussi comment l'écrire...

*

Je vais poster le texte principal sur le forum de la banque afin de ne pas disperser ce sujet.

En son temps, bien sûr. ;)

 
granit77 >> :

bool TradeTime(Heure de début de transaction, Heure de fin de transaction)

Il sera alors très pratique d'utiliser, if (TradeTime(.,.)) et de travailler !

Il est nécessaire de commander une telle fonction pour Igor Kim.

 
goldtrader писал(а) >>

Igor Kim devrait commander une telle fonction.

Je me joins à la demande ! Ce serait une fonction très utile et nécessaire. A la lumière des réalités commerciales actuelles....

Il est même possible d'y prévoir deux intervalles de temps.

Raison: