Chers amis, je vais essayer d'expliquer du mieux que je peux ce que je veux réaliser... ... ou je vais avoir raison... ou je vais embrouiller tout le monde !
...
Continuons la conversation... D'après ce que j'ai compris, la tâche peut être réduite à ce qui suit. Pour simplifier, nous n'étudierons que la journée d'hier, la période H1.
Tout d'abord, nous recherchons la première bougie (en regardant du côté gauche du graphique d'hier) dont la clôture est supérieure à l'ouverture, c'est-à-dire que nous recherchons la première bougie haussière. Si celle-ci est trouvée, alors en partant de celle-ci (en l'incluant) jusqu'au dernier chandelier de la journée en cours, nous devrions trouver le chandelier avec le High le plus élevé. Par exemple, si l'heure d'ouverture de la première bougie haussière est 10:00, alors de celle-ci jusqu'à la bougie de 23:00, nous devrions rechercher la bougie avec le plus haut niveau. N'est-ce pas ?
Poursuivre la conversation... Si je comprends bien, la mission peut être réduite à ce qui suit. Pour simplifier, nous n'examinerons que la journée d'hier, période H1.
Tout d'abord, nous recherchons la première bougie (en regardant du côté gauche du graphique d'hier) dont la clôture est supérieure à l'ouverture, c'est-à-dire que nous recherchons la première bougie haussière. Si celle-ci est trouvée, alors en partant de celle-ci (en l'incluant) jusqu'au dernier chandelier de la journée en cours, nous devrions trouver le chandelier avec le High le plus élevé. Par exemple, si l'heure d'ouverture de la première bougie haussière est 10:00, alors de celle-ci jusqu'à la bougie de 23:00, nous devrions chercher la bougie avec le plus haut niveau. N'est-ce pas ?
Oh, merci mon Dieu... Je l'ai eu ! OUI ! YEAH ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
Vadim_2015: Oh, merci mon Dieu... Je suis compris ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
Compris, je vais essayer d'y réfléchir, mais cela dépend de l'actualité. Si vous avez des questions à l'avenir, veuillez les formuler de manière à ce qu'elles soient plus faciles à comprendre pour les programmeurs.
Vadim_2015: Oh, merci mon Dieu... Je l'ai eu ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
S'il s'agit du chandelier d'hier, il sera le chandelier de fin dans iHigest(), et le chandelier de début sera 00:00 du jour suivant (c'est-à-dire le chandelier d'aujourd'hui) obtenu à partir de iBarShift().
Exemple d'algorithme :
1. Aujourd'hui, nous recherchons la première barre haussière parmi les barres horaires d'hier. Soit l'indice endBar
Déterminez la première barre d'une heure aujourd'hui. Ou bien ce sera zéro.
3. Dans iHighest(), définissez l'avant-dernier paramètre comme endBar (ou endBar +1 pour être précis), et le dernier comme 1.
Le résultat recherché est High[iHighest(avec les paramètres pertinents)] // Ou la variable correspondante, dont la valeur a été assignée dans la clause précédente.
Vadim_2015: Oh, merci mon Dieu... Je suis compris ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
voidOnStart()
{
double longValue;
datetime t1,t2;
int b1,b2,h;
int bStart = iBarOfDayReal();//бар, с которого уходим в историюPrint("",bStart);
for(int i=bStart;i<bStart+1000;i++)
{
longValue = Close[i+1]-Open[i+3];
//--- само условиеif(longValue>0)
{
t1= iTime(NULL,0,i); //
t2= iTime(NULL,PERIOD_D1,iBarShift(NULL,PERIOD_D1,t1,false)-1);//00.00.00 время // Print("",TimeToStr(t1,TIME_DATE|TIME_SECONDS)); // int("",TimeToStr(t2,TIME_DATE|TIME_SECONDS))Pr;
b1= iBarShift(NULL,0,t1,false);
b2= iBarShift(NULL,0,t2,false);
h=iHighest(NULL,0,MODE_HIGH,b1-b2+1,b2);//нашли максимум
SetArrow(159,clrCoral,"h"+(string)Time[h],Time[h],High[h]); //рисуем пипичку
}
}
}
//+------------------------------------------------------------------+void SetArrow(int cd, color cl,
string nm="", datetime t1=0, double p1=0, int sz=0) {
if (nm=="") nm=DoubleToStr(Time[0], 0);
if (t1<=0) t1=Time[0];
if (p1<=0) p1=Bid;
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
ObjectSet(nm, OBJPROP_TIME1 , t1);
ObjectSet(nm, OBJPROP_PRICE1 , p1);
ObjectSet(nm, OBJPROP_ARROWCODE, cd);
ObjectSet(nm, OBJPROP_COLOR , cl);
ObjectSet(nm, OBJPROP_WIDTH , sz);
}
//-------------------------------------------------------------------+int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
if (sy=="" || sy=="0") sy=Symbol();
if (tf<=0) tf=Period();
if (dt<=0) dt=TimeCurrent();
if (tf>PERIOD_D1) {
Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
return(0);
}
int cd=TimeDay(dt); // текущий день месяцаint nb=iBarShift(sy, tf, dt, False); // номер текущего бараint bd=0; // номер бара от начала сутокwhile(TimeDay(iTime(sy, tf, nb))==cd) {
nb++;
bd++;
}
return(bd);
}
//+------------------------------------------------------------------+
r772ra Merci beaucoup ! !! Le script fait ce dont j'ai besoin ! !! Tout n'est pas clair pour moi dans le dernier bloc de code, mais je vais trouver une solution. Je vais trouver une solution. Je vais essayer de l'utiliser dans l'indicateur.
Jevais essayer de l'utiliser dans un indicateur :
Si vous avez des questions à l'avenir, veuillez les formuler de manière à ce qu'elles soient plus faciles à comprendre pour les programmeurs.
r772ra Merci beaucoup ! !! Le script fait ce dont j'ai besoin ! !! Tout n'est pas clair pour moi dans le dernier bloc de code, mais je vais trouver une solution. L'essentiel est que cela fonctionne. Je vais essayer de l'appliquer à l'indicateur.
r772ra: Qu'est-ce qui n'est pas clair exactement ?
Expliquez-moi si je me trompe, je pense que la deuxième moitié du code du script _"void SetArrow(int cd, color cl," est la partie qui fait référence à la fonction"_OnInit()" de l'indicateur.. et la première partie du script _"voidOnStart()" fait référence à la fonction "_OnCalculate" dans l'indicateur ? Je veux dire, en gros, que le script a 1) le calcul au début et ensuite 2) l'initialisation seulement. Dans l'indicateur, c'est l'inverse.
Expliquez-moi si je me trompe, je pense que la deuxième moitié du code du script _"void SetArrow(int cd, color cl," est la partie qui fait référence à la fonction"_OnInit()" de l'indicateur.. et la première partie du script _"voidOnStart()" fait référence à la fonction "_OnCalculate" dans l'indicateur ? Je veux dire, en gros, que le script a 1) le calcul au début et ensuite 2) l'initialisation seulement. Dans l'indicateur, c'est l'inverse.
Il s'agit d'une fonction définie par l'utilisateur qui est en dehors de la portée des autres fonctions.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.10.2007 |//| Описание : Установка значка на графике, объект OBJ_ARROW. |//+----------------------------------------------------------------------------+//| Параметры: |//| cd - код значка |//| cl - цвет значка |//| nm - наименование ("" - время открытия текущего бара) |//| t1 - время открытия бара (0 - текущий бар) |//| p1 - ценовой уровень (0 - Bid) |//| sz - размер значка (0 - по умолчанию) |//+----------------------------------------------------------------------------+void SetArrow(int cd, color cl,
string nm="", datetime t1=0, double p1=0, int sz=0) {
if (nm=="") nm=DoubleToStr(Time[0], 0);
if (t1<=0) t1=Time[0];
if (p1<=0) p1=Bid;
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
ObjectSet(nm, OBJPROP_TIME1 , t1);
ObjectSet(nm, OBJPROP_PRICE1 , p1);
ObjectSet(nm, OBJPROP_ARROWCODE, cd);
ObjectSet(nm, OBJPROP_COLOR , cl);
ObjectSet(nm, OBJPROP_WIDTH , sz);
}
Appel de fonction, à partir de toute autre fonction
Je pense que vous n'en avez pas besoin dans l'indicateur, le tampon est responsable du dessin.
En d'autres termes.
longBarsBuffer[i]=High[h]+5*Point(); - то что необходимо получить.
else
longBarsBuffer[i]=0.0;
Plus d'informations sur
La fonction
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 26.02.2008 |//| Описание : Возвращает реальный номер бара от начала суток. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| dt - дата и время открытия бара ( 0 - текущее время) |//+----------------------------------------------------------------------------+int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
if (sy=="" || sy=="0") sy=Symbol();
if (tf<=0) tf=Period();
if (dt<=0) dt=TimeCurrent();
if (tf>PERIOD_D1) {
Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
return(0);
}
int cd=TimeDay(dt); // текущий день месяцаint nb=iBarShift(sy, tf, dt, False); // номер текущего бараint bd=0; // номер бара от начала сутокwhile(TimeDay(iTime(sy, tf, nb))==cd) {
nb++;
bd++;
}
return(bd);
}
Et l'appel
trouve le nombre de barres depuis le début de la journée (le jour actuel n'est pas recalculé) et cette barre va dans l'historique.
int bStart = iBarOfDayReal();//бар, с которого уходим в историю
Chers amis, je vais essayer d'expliquer du mieux que je peux ce que je veux réaliser... ... ou je vais avoir raison... ou je vais embrouiller tout le monde !
...Continuons la conversation... D'après ce que j'ai compris, la tâche peut être réduite à ce qui suit. Pour simplifier, nous n'étudierons que la journée d'hier, la période H1.
Tout d'abord, nous recherchons la première bougie (en regardant du côté gauche du graphique d'hier) dont la clôture est supérieure à l'ouverture, c'est-à-dire que nous recherchons la première bougie haussière. Si celle-ci est trouvée, alors en partant de celle-ci (en l'incluant) jusqu'au dernier chandelier de la journée en cours, nous devrions trouver le chandelier avec le High le plus élevé. Par exemple, si l'heure d'ouverture de la première bougie haussière est 10:00, alors de celle-ci jusqu'à la bougie de 23:00, nous devrions rechercher la bougie avec le plus haut niveau. N'est-ce pas ?
Poursuivre la conversation... Si je comprends bien, la mission peut être réduite à ce qui suit. Pour simplifier, nous n'examinerons que la journée d'hier, période H1.
Tout d'abord, nous recherchons la première bougie (en regardant du côté gauche du graphique d'hier) dont la clôture est supérieure à l'ouverture, c'est-à-dire que nous recherchons la première bougie haussière. Si celle-ci est trouvée, alors en partant de celle-ci (en l'incluant) jusqu'au dernier chandelier de la journée en cours, nous devrions trouver le chandelier avec le High le plus élevé. Par exemple, si l'heure d'ouverture de la première bougie haussière est 10:00, alors de celle-ci jusqu'à la bougie de 23:00, nous devrions chercher la bougie avec le plus haut niveau. N'est-ce pas ?
Oh, merci mon Dieu... Je suis compris ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
Oh, merci mon Dieu... Je l'ai eu ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
S'il s'agit du chandelier d'hier, il sera le chandelier de fin dans iHigest(), et le chandelier de début sera 00:00 du jour suivant (c'est-à-dire le chandelier d'aujourd'hui) obtenu à partir de iBarShift().
Exemple d'algorithme :
1. Aujourd'hui, nous recherchons la première barre haussière parmi les barres horaires d'hier. Soit l'indice endBar
Déterminez la première barre d'une heure aujourd'hui. Ou bien ce sera zéro.
3. Dans iHighest(), définissez l'avant-dernier paramètre comme endBar (ou endBar +1 pour être précis), et le dernier comme 1.
Le résultat recherché est High[iHighest(avec les paramètres pertinents)] // Ou la variable correspondante, dont la valeur a été assignée dans la clause précédente.
Oh, merci mon Dieu... Je suis compris ! OUI ! OUI ! OUI ! C'est exactement ce que j'essaie de faire. Si vous le savez, pouvez-vous me dire comment faire ?
SCREPT ! éprouvant.
r772ra Merci beaucoup ! !! Le script fait ce dont j'ai besoin ! !! Tout n'est pas clair pour moi dans le dernier bloc de code, mais je vais trouver une solution. Je vais trouver une solution. Je vais essayer de l'utiliser dans l'indicateur.
Jevais essayer de l'utiliser dans un indicateur :
Si vous avez des questions à l'avenir, veuillez les formuler de manière à ce qu'elles soient plus faciles à comprendre pour les programmeurs.J'ai compris, je vais en tenir compte !
Merci beaucoup !
r772ra Merci beaucoup ! !! Le script fait ce dont j'ai besoin ! !! Tout n'est pas clair pour moi dans le dernier bloc de code, mais je vais trouver une solution. L'essentiel est que cela fonctionne. Je vais essayer de l'appliquer à l'indicateur.
Très bien, je vais en tenir compte !
Merci beaucoup !
Qu'est-ce qui n'est pas clair exactement ?
Expliquez-moi si je me trompe, je pense que la deuxième moitié du code du script _"void SetArrow(int cd, color cl," est la partie qui fait référence à la fonction"_OnInit()" de l'indicateur.. et la première partie du script _"void OnStart()" fait référence à la fonction "_OnCalculate" dans l'indicateur ? Je veux dire, en gros, que le script a 1) le calcul au début et ensuite 2) l'initialisation seulement. Dans l'indicateur, c'est l'inverse.
Expliquez-moi si je me trompe, je pense que la deuxième moitié du code du script _"void SetArrow(int cd, color cl," est la partie qui fait référence à la fonction"_OnInit()" de l'indicateur.. et la première partie du script _"void OnStart()" fait référence à la fonction "_OnCalculate" dans l'indicateur ? Je veux dire, en gros, que le script a 1) le calcul au début et ensuite 2) l'initialisation seulement. Dans l'indicateur, c'est l'inverse.
Il s'agit d'une fonction définie par l'utilisateur qui est en dehors de la portée des autres fonctions.
Appel de fonction, à partir de toute autre fonction
Je pense que vous n'en avez pas besoin dans l'indicateur, le tampon est responsable du dessin.
En d'autres termes.
Plus d'informations sur
La fonction
Et l'appel
trouve le nombre de barres depuis le début de la journée (le jour actuel n'est pas recalculé) et cette barre va dans l'historique.