Le prochain contrôle important consiste à vérifier le type de programme à partir duquel la fonction est appelée. Rappelons que l'envoi d'une demande de rafraîchissement d'une série temporelle ayant la même période que celle de l'indicateur qui appelle le rafraîchissement est hautement indésirable. Le caractère indésirable de la demande de données de la même période que celle de l'indicateur est déterminé par le fait que la mise à jour des données historiques est effectuée dans le même thread, dans lequel l'indicateur travaille. Il y a donc une forte probabilité de conflit. Pour le vérifier, nous utilisons la fonctionMQL5InfoInteger() avec le modificateurMQL5_PROGRAM_TYPE.
J'ai besoin d'obtenir les données exactes des quatre sommets. Il s'avère que le premier, le plus nécessaire des vertex que iCustom donne incorrectement. Il est décalé par rapport à l'image graphique, les trois suivants sont corrects. Une chose similaire a déjà été trouvée - https://www.mql5.com/ru/forum/100123
J'ai essayé tout ce que je pouvais, j'ai même créé un Conseiller Expert séparé juste pour vérifier les données de ZigZag. Voyez par vous-même, peut-être ai-je fait une erreur quelque part ? Il suffit d'installer et d'activer la visualisation des prix d'ouverture. Écoutez ça.
//+------------------------------------------------------------------+//| data_ZigZag.mq5 |//| Copyright 2017, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2017, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"inputstring data_Zig_Zag_IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII;
inputint ExtDepth=12;
inputint ExtDeviation=5;
inputint ExtBackstep =3;
inputint n_zz=100;//n_zz =100; double pd_1,pd_2,pd_3,pd_4;
int pn_1,pn_2,pn_3,pn_4;
int zz_Handle;
double zz_buf[];
datetime time[];
string this_sym;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---
this_sym=Symbol();
//+------------------------------------------------------------------+//--- сохраним текущий символ графика для дальнейшей работы советника именно на этом символе
zz_Handle=iCustom(this_sym,0,"Examples\\Zigzag",
ExtDepth,
ExtDeviation,
ExtBackstep
);
Print(__FUNCTION__,"__LINE__",__LINE__," . . . . . ",
"zz_Handle = ",zz_Handle," error = ",GetLastError());
//--- проверяем наличие хендла индикатораif(zz_Handle==INVALID_HANDLE)
{
//--- хендл не получен, выводим сообщение в лог об ошибке, завершаем работу с ошибкойPrint(__FUNCTION__,"__LINE__",__LINE__," ----- ",
"Не удалось получить хендл индикатора zz_Handle"," error = ",GetLastError());
return(-1);
}
//--- добавляем индикатор на ценовой графикChartIndicatorAdd(ChartID(),0,zz_Handle);
//--- устанавливаем индексацию для массива zz_buf как в таймсерииArraySetAsSeries(zz_buf,true);
ArraySetAsSeries(time,true);
//---//+------------------------------------------------------------------+return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
IndicatorRelease(zz_Handle);
ArrayFree(zz_buf);
ArrayFree(time);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//+------------------------------------------------------------------+int zz_copy=0;
//--- копируем данные из индикаторного массива в динамический массив
zz_copy=CopyBuffer(zz_Handle,0,0,n_zz,zz_buf);
//--- если есть ошибки, то выводим сообщение в лог об ошибке и выходим из функцииif(zz_copy<0)
{
Print("Не удалось скопировать данные из индикаторного буфера zz_buf. error = ",
GetLastError()); return;
}
//+------------------------------------------------------------------+
pd_1 =0;
pd_2 =0;
pd_3 =0;
pd_4 =0;
pn_1 =0;
pn_2 =0;
pn_3 =0;
pn_4 =0;
int zz_q=ArraySize(zz_buf);
int q=0;
for(q=0; q<zz_q; q++)
{
if(zz_buf[q]!=0 && zz_buf[q]!=EMPTY_VALUE)
{
if(pd_1==0) { pn_1=q; pd_1=zz_buf[q]; }
elseif(pd_2==0) { pn_2=q; pd_2=zz_buf[q]; }
elseif(pd_3==0) { pn_3=q; pd_3=zz_buf[q]; }
elseif(pd_4==0) { pn_4=q; pd_4=zz_buf[q]; }
}
if(pn_4>0)break;
}
//+------------------------------------------------------------------+CopyTime(this_sym,Period(),0,n_zz,time);
//+------------------------------------------------------------------+ObjectDelete(0,"name1");
string name1="name1";
if(!ObjectCreate(0,name1,OBJ_ARROW_UP,0,time[pn_1],pd_1))
{
Print(__FUNCTION__,"__LINE__",__LINE__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
}
//--- установим размер знака ObjectSetInteger(0,name1,OBJPROP_WIDTH,6);
//+------------------------------------------------------------------+ObjectDelete(0,"name2");
string name2="name2";
if(!ObjectCreate(0,name2,OBJ_ARROW_UP,0,time[pn_2],pd_2))
{
Print(__FUNCTION__,"__LINE__",__LINE__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
}
//--- установим размер знака ObjectSetInteger(0,name2,OBJPROP_WIDTH,6);
//+------------------------------------------------------------------+ObjectDelete(0,"name3");
string name3="name3";
if(!ObjectCreate(0,name3,OBJ_ARROW_UP,0,time[pn_3],pd_3))
{
Print(__FUNCTION__,"__LINE__",__LINE__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
}
//--- установим размер знака ObjectSetInteger(0,name3,OBJPROP_WIDTH,6);
//+------------------------------------------------------------------+ObjectDelete(0,"name4");
string name4="name4";
if(!ObjectCreate(0,name4,OBJ_ARROW_UP,0,time[pn_4],pd_4))
{
Print(__FUNCTION__,"__LINE__",__LINE__,
": не удалось создать знак \"Стрелка вверх\"! Код ошибки = ",GetLastError());
}
//--- установим размер знака ObjectSetInteger(0,name4,OBJPROP_WIDTH,6);
//+------------------------------------------------------------------+///*if(pd_1!=0 && pd_2!=0 && pd_3!=0 && pd_4!=0)
Alert(__FUNCTION__,"__LINE__",__LINE__,
" q =",q,
" pd_1 =",pd_1,
" pd_2 =",pd_2,
" pd_3 =",pd_3,
" pd_4 =",pd_4,
" pn_1 =",pn_1,
" pn_2 =",pn_2,
" pn_3 =",pn_3,
" pn_4 =",pn_4,
" TimeCurrent()=",TimeCurrent()
);
//*///+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+
Question Puis-je écrire un programme dans Metatrader 4 pour ouvrir de 2 à 250 positions de mon choix avec un stoploss et un profit définis en un clic ? Ainsi, je n'ai pas besoin d'en ouvrir manuellement un à la fois.
Question Puis-je écrire un programme dans Metatrader 4 pour ouvrir de 2 à 250 positions de mon choix avec un stoploss et un profit définis en un clic ? Vous n'avez pas besoin d'ouvrir un par un
Oui, vous pouvez. Mais vous posez la question au mauvais endroit - ici, sur MT5.
Il existe plusieurs fils de discussion pour les débutants sur MT4.
Bon après-midi. Après la dernière mise à jour de MT5 (build 1604), mes indicateurs ne fonctionnent plus correctement. J'utilise Les indicateurs dits "liquides". Par exemple, j'ai plusieurs stochastiques multi-périodes dans une fenêtre. Eh bien, maintenant les courts sont tirés Comme précédemment, les plus longs ne sont dessinés que sur quelques barres et les plus longs ne sont pas dessinés du tout.
J'ai l'impression qu'ils ont soudainement commencé à manquer d'histoire. Pouvez-vous me dire ce qui pourrait clocher ?
Je viens de passer de mql4 à mql5. Je teste un Expert Advisor sur l'indice RTS et j'ai maintenant le problème qu'il ouvre plusieurs transactions, mais l'une des conditions pour ouvrir une transaction est la suivante : si (...)OrdersTotal()==0). Pourquoi cette condition ne fonctionne-t-elle pas ? Que puis-je faire pour n'ouvrir qu'un seul poste ?
RogozaIV: Je viens de passer de mql4 à mql5. Je teste un Expert Advisor sur l'indice RTS et j'ai un problème d'ouverture de plusieurs positions, bien que l'une des conditions d'ouverture d'une position soit spécifiée : if (...OrdersTotal()==0). Pourquoi cette condition ne fonctionne-t-elle pas ? Que puis-je faire pour n'ouvrir qu'une seule transaction ?
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.
Vitaliy, consultez https://www.mql5.com/ru/docs/series/timeseries_access#synchronized, il y a un exemple de script pour charger l'historique, cela pourrait vous aider.
Merci, je vais essayer de m'en occuper.
Maintenant, une question se pose déjà :
Le prochain contrôle important consiste à vérifier le type de programme à partir duquel la fonction est appelée. Rappelons que l'envoi d'une demande de rafraîchissement d'une série temporelle ayant la même période que celle de l'indicateur qui appelle le rafraîchissement est hautement indésirable. Le caractère indésirable de la demande de données de la même période que celle de l'indicateur est déterminé par le fait que la mise à jour des données historiques est effectuée dans le même thread, dans lequel l'indicateur travaille. Il y a donc une forte probabilité de conflit. Pour le vérifier, nous utilisons la fonctionMQL5InfoInteger() avec le modificateurMQL5_PROGRAM_TYPE.
if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR&&Period()==period&&Symbol()==symbol)
retour(-4) ;
Cela devrait fonctionner dans mon indicateur.
Messieurs, j'ai du mal avec ZigZag.
J'ai besoin d'obtenir les données exactes des quatre sommets. Il s'avère que le premier, le plus nécessaire des vertex que iCustom donne incorrectement. Il est décalé par rapport à l'image graphique, les trois suivants sont corrects. Une chose similaire a déjà été trouvée - https://www.mql5.com/ru/forum/100123
J'ai essayé tout ce que je pouvais, j'ai même créé un Conseiller Expert séparé juste pour vérifier les données de ZigZag. Voyez par vous-même, peut-être ai-je fait une erreur quelque part ? Il suffit d'installer et d'activer la visualisation des prix d'ouverture. Écoutez ça.
Comment obtenir des données précises ?Le testeur donne ce résultat :
Je n'arrive pas à comprendre le piège. Chers professionnels, veuillez m'éclairer, je vous en serais très reconnaissant.
Question Puis-je écrire un programme dans Metatrader 4 pour ouvrir de 2 à 250 positions de mon choix avec un stoploss et un profit définis en un clic ? Ainsi, je n'ai pas besoin d'en ouvrir manuellement un à la fois.
Question Puis-je écrire un programme dans Metatrader 4 pour ouvrir de 2 à 250 positions de mon choix avec un stoploss et un profit définis en un clic ? Vous n'avez pas besoin d'ouvrir un par un
Oui, vous pouvez. Mais vous posez la question au mauvais endroit - ici, sur MT5.
Il existe plusieurs fils de discussion pour les débutants sur MT4.
Par exemple - ici.
Bonjour. Avant-hier, j'ai commencé à étudier le MQL.
Le testeur donne ce résultat :
Où est le piège que je n'arrive pas à comprendre. Mesdames et Messieurs les professionnels, veuillez m'éclairer, je vous en serai très reconnaissant.
Traduisez-le en chaîne de caractères avant l'impression. Ou expliquer ce qui ne va pas.
Les indicateurs dits "liquides". Par exemple, j'ai plusieurs stochastiques multi-périodes dans une fenêtre. Eh bien, maintenant les courts sont tirés
Comme précédemment, les plus longs ne sont dessinés que sur quelques barres et les plus longs ne sont pas dessinés du tout.
J'ai l'impression qu'ils ont soudainement commencé à manquer d'histoire. Pouvez-vous me dire ce qui pourrait clocher ?
Je viens de passer de mql4 à mql5. Je teste un Expert Advisor sur l'indice RTS et j'ai un problème d'ouverture de plusieurs positions, bien que l'une des conditions d'ouverture d'une position soit spécifiée : if (...OrdersTotal()==0). Pourquoi cette condition ne fonctionne-t-elle pas ? Que puis-je faire pour n'ouvrir qu'une seule transaction ?
PositionsTotal()