Алексей КоКоКо: Je veux collecter des statistiques sur la taille moyenne d'une bougie de 12 heures, aujourd'hui par exemple on est vendredi, et je veux prendre les données du jeudi, mercredi, mardi et lundi pour les calculs.
Je prends time[], je convertis TimeToString, puis SplitString et TD. Existe-t-il un moyen plus rapide et moins encombrant de se référer à la même bougie horaire un jour ou plus en arrière ? Bien sûr, je pourrais exécuter le nombre de bougies du cadre temporel actuel dans une journée avec des intervalles, mais j'ai peur que s'il y a des trous dans les cotations, elles soient décalées.
Je pense que nous ne pouvons pas nous passer de la boucle. Mais la boucle peut être construite de différentes manières. Faites attention à CopyRates()
intCopyRates(
string symbol_name, // имя символаENUM_TIMEFRAMES timeframe, // периодdatetime start_time, // с какой датыint count, // сколько копируемMqlRates rates_array[] // массив, куда будут скопированы данные
);
Nous définissons PERIOD_H1, start_time - date 12:00 et count 1. À la prochaine itération, nous ajoutons à cette date ou nous la soustrayons (selon la façon dont la boucle est organisée) PeriodSeconds(PERIOD_D1)
MAKSIM KASHFYLGAIANOV: Veuillez me dire comment énumérer les paramètres de l'indicateur dans iCustom.
Vous pouvez définir une chaîne vide à la place des variables de type chaîne, mais les énumérations... nous devons voir comment elles sont écrites dans le code.
J'ai un indicateur stochastique avec allergie, il donne un signal sur le croisement des lignes mobiles. S'il vous plaît, dites-moi comment faire pour qu'il donne un signal en traversant les glissements seulement quand il est au-dessus ou au-dessous de la zone de surachat ou de survente.
#property indicator_separate_window#property indicator_buffers4#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_level180#property indicator_level220#property indicator_maximum100#property indicator_minimum0//---- input parameters/*************************************************************************
PERIOD_M1 1
PERIOD_M5 5
PERIOD_M15 15
PERIOD_M30 30
PERIOD_H1 60
PERIOD_H4 240
PERIOD_D1 1440
PERIOD_W1 10080
PERIOD_MN1 43200
You must use the numeric value of the timeframe that you want to use
when you set the TimeFrame' value with the indicator inputs.
---------------------------------------
MODE_SMA 0 Simple moving average,
MODE_EMA 1 Exponential moving average,
MODE_SMMA 2 Smoothed moving average,
MODE_LWMA 3 Linear weighted moving average.
You must use the numeric value of the MA Method that you want to use
when you set the 'ma_method' value with the indicator inputs.
**************************************************************************/externint TimeFrame=240;
externint KPeriod=5;
externint DPeriod=3;
externint Slowing=3;
externint MAMethod=0;
externint PriceField=0;// PriceField: 0=Hi/Low 1=Close/Closeexternstring note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN";
externstring __MA_Method = "SMA0 EMA1 SMMA2 LWMA3";
externstring __PriceField = "0=Hi/Low 1=Close/Close";
//extern string __Price = "0O,1C 2H3L,4Md 5Tp 6WghC: Md(HL/2)4,Tp(HLC/3)5,Wgh(HLCC/4)6";double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
datetime last_t=0;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
//---- indicator lineSetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
SetIndexLabel(0, "MTF_Stochastic("+KPeriod+","+DPeriod+","+Slowing+")TF"+TimeFrame+"");
SetIndexLabel(1,"MTF_Stochastic("+KPeriod+","+DPeriod+","+Slowing+")TF"+TimeFrame+"");
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexStyle(2,DRAW_ARROW);
SetIndexArrow(2,233);
SetIndexBuffer(3,ExtMapBuffer4);
SetIndexStyle(3,DRAW_ARROW);
SetIndexArrow(3,234);
//---- name for DataWindow and indicator subwindow label switch(TimeFrame)
{
case1 : string TimeFrameStr="Period_M1"; break;
case5 : TimeFrameStr="Period_M5"; break;
case15 : TimeFrameStr="Period_M15"; break;
case30 : TimeFrameStr="Period_M30"; break;
case60 : TimeFrameStr="Period_H1"; break;
case240 : TimeFrameStr="Period_H4"; break;
case1440 : TimeFrameStr="Period_D1"; break;
case10080 : TimeFrameStr="Period_W1"; break;
case43200 : TimeFrameStr="Period_MN1"; break;
default : TimeFrameStr="Current Timeframe";
}
IndicatorShortName("MTF_Stochastic("+KPeriod+","+DPeriod+","+Slowing+") "+TimeFrameStr);
start();
return(0);
}
//----//+------------------------------------------------------------------+//| MTF Stochastic |//+------------------------------------------------------------------+int deinit()
{
for (int i=Bars;i>=0;i--){
ObjectDelete("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0));
}
return(0);
}
bool up_a=false;
bool dn_a=false;
int start()
{
datetime TimeArray[];
ArrayResize(TimeArray,Bars);
int i,limit,y=0,counted_bars=IndicatorCounted();
// Plot defined timeframe on to current timeframe
ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame);
// limit=Bars-counted_bars+TimeFrame/Period(); //igorad
limit=Bars-1;
limit=MathMax(limit,TimeFrame/Period());
//limit=MathMin(limit,BarsToCount);for(i=0,y=0;i<limit;i++)
{
if (Time[i]<TimeArray[y]) y++;
/***********************************************************
Add your main indicator loop below. You can reference an existing
indicator with its iName or iCustom.
Rule 1: Add extern inputs above for all neccesary values
Rule 2: Use 'TimeFrame' for the indicator timeframe
Rule 3: Use 'y' for the indicator's shift value
**********************************************************/
ExtMapBuffer3[i]=EMPTY_VALUE;
ExtMapBuffer4[i]=EMPTY_VALUE;
ExtMapBuffer1[i]=EMPTY_VALUE;
ExtMapBuffer2[i]=EMPTY_VALUE;
ExtMapBuffer1[i]=iStochastic(NULL,TimeFrame,KPeriod,DPeriod,Slowing,MAMethod,PriceField,0,y);
ExtMapBuffer2[i]=iStochastic(NULL,TimeFrame,KPeriod,DPeriod,Slowing,MAMethod,PriceField,1,y);
ObjectDelete("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0));
if (NormalizeDouble(ExtMapBuffer1[i],Digits)>NormalizeDouble(ExtMapBuffer2[i],Digits) && NormalizeDouble(ExtMapBuffer1[i+1],Digits)<=NormalizeDouble(ExtMapBuffer2[i+1],Digits) && NormalizeDouble(ExtMapBuffer1[i+1],Digits)!=NormalizeDouble(ExtMapBuffer1[i],Digits) ){
ExtMapBuffer3[i]=ExtMapBuffer1[i];
ObjectDelete("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0));
ObjectCreate("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),22,0,Time[i],Low[i]-5*Point);
ObjectSet("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),6,Blue);
ObjectSet("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),14,233);
}
if (NormalizeDouble(ExtMapBuffer1[i],Digits)<NormalizeDouble(ExtMapBuffer2[i],Digits) && NormalizeDouble(ExtMapBuffer1[i+1],Digits)>=NormalizeDouble(ExtMapBuffer2[i+1],Digits) && NormalizeDouble(ExtMapBuffer1[i+1],Digits)!=NormalizeDouble(ExtMapBuffer1[i],Digits)){
ExtMapBuffer4[i]=ExtMapBuffer1[i];
ObjectDelete("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0));
ObjectCreate("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),22,0,Time[i],High[i]+5*Point);
ObjectSet("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),6,Red);
ObjectSet("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),14,234);
}
}
////---- Refresh buffers ++++++++++++++ if (TimeFrame < Period()) TimeFrame = Period();
if (TimeFrame>Period()) {
int PerINT=TimeFrame/Period()+1;
datetime TimeArr[]; ArrayResize(TimeArr,PerINT);
ArrayCopySeries(TimeArr,MODE_TIME,Symbol(),Period());
for(i=0;i<PerINT+1;i++) {if (TimeArr[i]>=TimeArray[0]) {
/********************************************************
Refresh buffers: buffer[i] = buffer[0];
************************************************************/
ExtMapBuffer1[i]=ExtMapBuffer1[0];
ExtMapBuffer2[i]=ExtMapBuffer2[0];
} } }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++ Raff if (ExtMapBuffer3[0]!=EMPTY_VALUE && !up_a){
up_a=true;
dn_a=false;
Alert("MTF Stochastic Long cross Signal on "+Symbol());
}
if (ExtMapBuffer4[0]!=EMPTY_VALUE && !dn_a){
dn_a=true;
up_a=false;
Alert("MTF Stochastic Short cross Signal on "+Symbol());
}
return(0);
}
Bonne journée à tous. Pouvez-vous me dire comment coder correctement la condition suivante en utilisant je ne sais plus quelle fonction mathématique.
if (Bid - Low[1]>=0.0030 && Bid - Low[1]<0.0035) {action;} Je sais qu'il existe une fonction mathématique qui peut être utilisée dans la condition ci-dessus sans le signe &&. Mais je ne me souviens pas comment s'appelle cette fonction mathématique et comment l'appliquer. Merci pour votre aide.
Cette question semble relever des principes de base de MQL4. Supposons que des variables X, Y, Z soient déclarées dans la portée globale. Ensuite, le programme appelle la fonction F1() pour obtenir la valeur X. Bien que cette fonction ne renvoie que X, les variables Y et Z sont calculées pendant son fonctionnement, c'est-à-dire qu'on leur attribue des valeurs qui ne seront pas modifiées par la suite. Plus loin, Y et Z sont à nouveau utilisés dans une fonction F2(). Pour calculer ces variables, devons-nous nous adresser à nouveau à la fonction F1() en prévoyant le retour non seulement de X, mais aussi de Y et de Z ? Ou bien Y et Z sont déjà écrasés dans la portée globale et seront automatiquement insérés dans la fonction F2() sous une forme modifiée ?
Si vous modifiez une variable globale dans une fonction, elle sera modifiée. Mais c'est une façon dangereuse de programmer, car dans le code, au fur et à mesure qu'il se développe, il y aura des affectations non évidentes dans différentes fonctions du programme.
Il y a une fonction principale dans le programme, c'est là que vous faites l'affectation des variables globales. Et dans d'autres fonctions, faites-le de cette façon :
int X, Y, Z;
voidOnTick()
{
X=Sum(Y,Z);
}
int Sum(int y, int z)
{
return(y+z);
}
Ou comme ça :
int X, Y, Z;
voidOnTick()
{
Replace(X,Y,Z);
}
void Replace(int& x, int& y, int& z)
{
int a=x;
x=y;
y=z;
z=a;
}
Bonne journée à tous. Pouvez-vous me dire comment coder correctement la condition suivante en utilisant je ne sais plus quelle fonction mathématique.
if (Bid - Low[1]>=0.0030 && Bid - Low[1]<0.0035) {action;} Je sais qu'il existe une fonction mathématique qui peut être utilisée dans la condition ci-dessus sans le signe &&. Mais je ne me souviens pas comment s'appelle cette fonction mathématique et comment l'appliquer. Merci pour votre aide.
Pouvez-vous me dire pourquoi le programme (sur mql4, sur les minutes, tous les ticks) lit le nombre explicitement et le même nombre calculé dans la fonction différemment ? Voici le code
Le programme ne lit pas Pr comme 1.60854 bien quePrint( ) montre la valeur de Pr comme 1.60854 . En conséquence, le programme ouvre le deuxième ordre, mais il ne devrait pas le faire .
Et si nous définissons le nombre 1.60854 au lieu de la variable Pr , le programme le lit et n'ouvre pas le deuxième ordre.
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
Je veux collecter des statistiques sur la taille moyenne d'une bougie de 12 heures, aujourd'hui par exemple on est vendredi, et je veux prendre les données du jeudi, mercredi, mardi et lundi pour les calculs.
Je pense que nous ne pouvons pas nous passer de la boucle. Mais la boucle peut être construite de différentes manières. Faites attention à CopyRates()
Nous définissons PERIOD_H1, start_time - date 12:00 et count 1. À la prochaine itération, nous ajoutons à cette date ou nous la soustrayons (selon la façon dont la boucle est organisée) PeriodSeconds(PERIOD_D1)
Veuillez me dire comment énumérer les paramètres de l'indicateur dans iCustom.
J'ai un indicateur stochastique avec allergie, il donne un signal sur le croisement des lignes mobiles. S'il vous plaît, dites-moi comment faire pour qu'il donne un signal en traversant les glissements seulement quand il est au-dessus ou au-dessous de la zone de surachat ou de survente.
Bonne journée à tous.
Pouvez-vous me dire comment coder correctement la condition suivante en utilisant je ne sais plus quelle fonction mathématique.
if (Bid - Low[1]>=0.0030 && Bid - Low[1]<0.0035) {action;}
Je sais qu'il existe une fonction mathématique qui peut être utilisée dans la condition ci-dessus sans le signe &&. Mais je ne me souviens pas comment s'appelle cette fonction mathématique et comment l'appliquer.
Merci pour votre aide.
Si vous modifiez une variable globale dans une fonction, elle sera modifiée. Mais c'est une façon dangereuse de programmer, car dans le code, au fur et à mesure qu'il se développe, il y aura des affectations non évidentes dans différentes fonctions du programme.
Il y a une fonction principale dans le programme, c'est là que vous faites l'affectation des variables globales. Et dans d'autres fonctions, faites-le de cette façon :
Ou comme ça :
comment coder correctement la condition suivante en utilisant je ne me souviens plus quelle fonction mathématique
Je ne connais pas de meilleure façon d'établir la condition...
Bonne journée à tous.
Pouvez-vous me dire comment coder correctement la condition suivante en utilisant je ne sais plus quelle fonction mathématique.
if (Bid - Low[1]>=0.0030 && Bid - Low[1]<0.0035) {action;}
Je sais qu'il existe une fonction mathématique qui peut être utilisée dans la condition ci-dessus sans le signe &&. Mais je ne me souviens pas comment s'appelle cette fonction mathématique et comment l'appliquer.
Merci pour votre aide.
Sans et
Merci beaucoup pour le conseil.
Voici le code
Le programme ne lit pas Pr comme 1.60854 bien quePrint( ) montre la valeur de Pr comme 1.60854 . En conséquence, le programme ouvre le deuxième ordre, mais il ne devrait pas le faire
.
Et si nous définissons le nombre 1.60854 au lieu de la variable Pr , le programme le lit et n'ouvre pas le deuxième ordre.
QUESTION Quelles modifications devons-nous apporter au code pour que le programme lise Pr et n'ouvre pas le deuxième ordre.
Merci pour votre aide.