Fonctions utiles de KimIV - page 116

 

La fonction SetChannel().

Cette fonction définit l'objetOBJ_CHANNEL à un canal équidistant sur la carte courante.

  • cl- Couleur de l'objet. Paramètre obligatoire.
  • t[]- Tableau de trois valeurs sur l'axe du temps.Paramètre obligatoire.
  • p[]- Tableau de trois valeurs sur l'axe des prix. Paramètreobligatoire.
  • nm- Nom de l'objet. Lorsque la valeur par défaut est passée -"", l'heure d'ouverture actuelle de la barre est utilisée comme nom.
  • ry- Indicateur de la propriétéBOW. La valeur par défaut estFalse.
  • st- Style de ligne. Les valeurs valides sontSTYLE_SOLID(par défaut),STYLE_DASH,STYLE_DOT,STYLE_DASHDOT.
  • wd- Épaisseur de la ligne. La valeur par défaut est1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2013                                                     |
//|  Описание : Установка объекта OBJ_CHANNEL Равноудаленный канал.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl  - цвет линии                                                        |
//|    t[] - время открытия бара                                               |
//|    p[] - ценовой уровень                                                   |
//|    nm  - наименование              (  ""  - время открытия текущего бара)  |
//|    ry  - луч                       (False - по умолчанию)                  |
//|    st  - стиль линии               (  0   - простая линия)                 |
//|    wd  - ширина линии              (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetChannel(color cl, datetime& t[], double& p[],
                string nm="", bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t[0]<=0) t[0]=Time[20];
  if (p[0]<=0) p[0]=High[20];
  if (t[1]<=0) t[1]=Time[0];
  if (p[1]<=0) p[1]=High[0];
  if (t[2]<=0) t[2]=Time[15];
  if (p[2]<=0) p[2]=Low[15];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_CHANNEL, 0, 0,0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t[0]);
  ObjectSet(nm, OBJPROP_PRICE1, p[0]);
  ObjectSet(nm, OBJPROP_TIME2 , t[1]);
  ObjectSet(nm, OBJPROP_PRICE2, p[1]);
  ObjectSet(nm, OBJPROP_TIME3 , t[2]);
  ObjectSet(nm, OBJPROP_PRICE3, p[2]);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
ZZY. Vous trouverez ci-joint un script pour tester la fonction SetChannel().
Dossiers :
 

Bon après-midi.

J'utilise la fonction SetTLine() de KimIV https://forum.mql4.com/ru/38949/page6#434255 . Le problème est que j'ai besoin de deux lignes (haut et bas), mais cela ne fonctionne pas pour moi. J'ai créé une autre fonction SetTLine1() avec d'autres variables, mais elle ne fonctionne toujours pas. Comment faire ?

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
datetime d1=TimeCurrent()-24*60*60;
while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
d1=StrToTime(TimeToStr(d1, TIME_DATE));
datetime d2=d1-24*60*60;
while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
d2=StrToTime(TimeToStr(d2, TIME_DATE));
int b2=iBarShift(NULL, 0, d2);     // номер бара начала второго дня
int b1=iBarShift(NULL, 0, d1);     // номер бара начала первого дня
int b0=iBarShift(NULL, 0, d0);     // номер бара начала текущего дня
int n2=iLowest(NULL, 0, MODE_LOW, b2-b1-1, b1);
int n1=iLowest(NULL, 0, MODE_LOW, b1-b0-1, b0);
datetime t1=Time[n2];
double   p1=Low[n2];
datetime t2=Time[n1];
double   p2=Low[n1];
SetTLine(Magenta, "", t1, p1, t2, p2, True, STYLE_SOLID, 3);   


datetime di0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
datetime di1=TimeCurrent()-24*60*60;
while (TimeDayOfWeek(di1)==0 || TimeDayOfWeek(di1)==6) di1-=24*60*60;
di1=StrToTime(TimeToStr(di1, TIME_DATE));
datetime di2=di1-24*60*60;
while (TimeDayOfWeek(di2)==0 || TimeDayOfWeek(di2)==6) di2-=24*60*60;
di2=StrToTime(TimeToStr(di2, TIME_DATE));
int bi2=iBarShift(NULL, 0, di2);     // номер бара начала второго дня
int bi1=iBarShift(NULL, 0, di1);     // номер бара начала первого дня
int bi0=iBarShift(NULL, 0, di0);     // номер бара начала текущего дня
int ni2=iHighest(NULL, 0, MODE_HIGH, bi2-bi1-1, bi1);
int ni1=iHighest(NULL, 0, MODE_HIGH, bi1-bi0-1, bi0);
datetime t1i=Time[ni2];
double   p1i=High[ni2];
datetime t2i=Time[ni1];
double   p2i=High[ni1];
SetTLine1(Magenta, "", t1i, p1i, t2i, p2i, True, STYLE_SOLID, 3);
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}


void SetTLine1(color cli, string nmi="",
              datetime t1i=0, double p1i=0, datetime t2i=0, double p2i=0,
              bool ryi=False, int sti=0, int wdi=1) {
  if (nmi=="") nmi=DoubleToStr(Time[0], 0);
  if (t1i<=0) t1i=Time[10];
  if (p1i<=0) p1i=Low[10];
  if (t2i<=0) t2i=Time[0];
  if (p2i<=0) p2i=Bid;
  if (ObjectFind(nmi)<0) ObjectCreate(nmi, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nmi, OBJPROP_TIME1 , t1i);
  ObjectSet(nmi, OBJPROP_PRICE1, p1i);
  ObjectSet(nmi, OBJPROP_TIME2 , t2i);
  ObjectSet(nmi, OBJPROP_PRICE2, p2i);
  ObjectSet(nmi, OBJPROP_COLOR , cli);
  ObjectSet(nmi, OBJPROP_RAY   , ryi);
  ObjectSet(nmi, OBJPROP_STYLE , sti);
  ObjectSet(nmi, OBJPROP_WIDTH , wdi);
}
 

Vous n'avez pas besoin de faire deux fonctions. Vous devez en appeler un avec des paramètres différents. Vous avez appelé deux fonctions, mais vous avez passé un nom vide pour l'objet LINE à chacune d'entre elles. Par défaut, la fonction SetTLine() définit l'heure d'ouverture de la barre actuelle comme nom. Dans votre cas, cela signifie que, quel que soit le nombre de fois où vous avez appeléSetTLine(), vous avez créé à chaque fois un objet portant le même nom, c'est-à-dire UN objet LINE.

J'ai retravaillé votre code. Voir la pièce jointe. Et pour un exemple de ce que votre code dessine, une image

Dossiers :
 
KimIV:

Vous n'avez pas besoin de faire deux fonctions. Vous devez en appeler un avec des paramètres différents. Vous avez appelé deux fonctions, mais vous avez passé un nom vide de l'objet LINE à chacune d'entre elles. Par défaut, la fonction SetTLine() définit l'heure d'ouverture de la barre actuelle comme nom. Dans votre cas, cela signifie que, quel que soit le nombre de fois où vous avez appeléSetTLine(), vous avez créé à chaque fois un objet portant le même nom, c'est-à-dire UN objet LINE.

J'ai retravaillé votre code. Voir la pièce jointe. Et pour un exemple de ce que votre code dessine, une image


Je vois, merci.

 

Bonjour !

Je tiens à vous dire un GRAND MERCI pour votre travail. J'ai téléchargé 2 fichiers(ByMarketBuy(Sell)+e-SARTrailing) de votre site web pour construire mon système de trading.J' envoie le scriptByMarketBuy(Sell) sur la paire EUR/USD sur 1 écran, prescrivant MAGIC 30 pour un ordre etMAGIC 60 pour un autre ordre (respectivement M30 et H1) et le conseillere-SARTrailing sur 2 et 3 écrans avec les paramètresSAR.TF=30 et 60respectivement. Et puisque deux ordres sont ouverts sur la même paire de devises, alors ils vont co-rotation et il s'avère que sansMagicNumber conseillerse-SARTrailing sur deux écrans seront en conflit les uns avec les autres. J'ai une GRANDEDEMANDEà voussi vous pouviez modifier le conseiller (à écrire) une telle fonctionnalité queMagicNumber mai être un tel supplément serait apprécié beaucoup. Et cela fonctionnera sur tous les horizons temporels en même temps sans conflit entre eux, quelle que soit la directionalité.

Merci d'avance!

 
tim-time:

J'ai une GRANDE DEMANDE à vous faire si vous pouvez modifier votre Expert Advisor avec lafonctionMagicNumber.

Merci pour le conseil. J'ai ajouté un filtre pour les magiciens...
 

Fonction GetTimeOpenBar().

Cette fonction renvoie le temps d'ouverture d'un symbole arbitraire et d'une barre de temps arbitraire. En général, il s'agit simplement d'une combinaison des fonctions de base iBarShift() et iTime(). Par conséquent, il n'y a rien de nouveau ici, et l'utilisation d'une variante particulière est une question de commodité. Vous pouvez passer les paramètres facultatifs suivants à la fonction

  • sy- Nom de l'instrument commercial (symbole). Les valeurs "" et NULL signifient le symbole actuel. La valeur par défaut est "".
  • tf- Cadre temporel. Valeur par défaut - 0 - période actuelle.
  • dt- Date et heure. Valeur par défaut - 0 - heure actuelle.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.01.2012                                                     |
//|  Описание : Возвращает время открытия бара.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий)                 |
//|    dt - дата/время                 (    0       - текущее)                 |
//+----------------------------------------------------------------------------+
datetime GetTimeOpenBar(string sy="", int tf=0, int dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf==0) tf=Period();
  if (dt==0) dt=TimeCurrent();
  
  int sh=iBarShift(sy, tf, dt, False);

  return(iTime(sy, tf, sh));
}

 
KimIV:
Merci pour le conseil. J'ai ajouté un filtre pour les magiciens...

BONJOUR !

WOW ! !! C'EST LE RYTHME ! !! (Je le fais moi-même ou je dis NON !)

UNÉNORME RESPECTPOUR LES PROFESSIONNELS(un professionnel doit connaître tous les moindres détails + le travail acharné dans son domaine et bien sûr l'expérience qui s'accumule au fil des ans).

Je suis engagé dans le mobilier intégré déjà 4 5 ans et 1 5 ans termine le trading Forex (travail dur+expérience des moments de succès et d'échec dans le commerce, il reste à apprendre les plus petits détails).

MON OBJECTIF EST DE DEVENIR UN PROFESSIONNEL DU TRADING.

J'APPRÉCIEVOTRE AIDE !

AVEC RESPECT !

 

J'ai mis au point la fonction ErrorRU(), qui renvoie une description russe courte ou détaillée d'une erreur par son code. Tant les erreurs renvoyées par le serveur commercial que les erreurs d'exécution des programmes MQL sont détectées. Toutes les erreurs, cependant, n'ont pas une description détaillée avec des recommandations "Que faire", mais c'est ainsi.

Je publie la fonction dans le script pour la tester.

Si quelqu'un a besoin d'une variation sous la forme d'un fichier MQH, vous pouvez l'obtenir sur mon site web.

Dossiers :
 

Bonjour !

Est-il possible d'ajouter des notifications PUSH à votre EAe-SignalOfTrade ?

https://www.mql5.com/ru/forum/6960

https://www.mql5.com/ru/docs/common/sendnotification

(Le serveurVPS loué refuse de donner les données SMTP-serveur qui devrait être spécifié dans les paramètres de messagerie MT4 pour le travail du conseiller avecUseSendMail=True- e-mail. )

Merci d'avance!