1. Juste une clarification. Il est maintenant clair que nous parlons de la même chose.
Je comprends, mais je ne suis pas d'accord pour dire qu'il faut retourner les tableaux pour le faire. Est-il nécessaire d'avoir un indicateur pour deux terminaux ? C'est presque comme faire 2en1 une faux et une hache.
3. Si je comprends bien, Buffer[] est utilisé par le récepteur dans la fonction CopyBuffer() pour obtenir une seule valeur d'indicateur.
4. Vous n'avez pas fait attention à la chose la plus importante. Le début de la copie des valeurs de l'indicateur ne doit pas être déterminé par l'indice de la barre, mais par le moment de la i-ème barre.
1. Ok.
2. J'ai inversé le tableau parce que je réécris l'indicateur à partir du quatre - tout fonctionne correctement dans celui-ci et toutes les données sont correctes. Tout ce qui s'y trouve est lié à l'obtention des données dans l'ordre exact où elles sont lues dans la boucle. Si nous ne retournons pas le tampon, nous devrons écrire l'indicateur à partir de zéro - pour quoi faire ? C'est assez compliqué. Je n'ai cité cet indicateur qu'à titre d'exemple pour montrer à quel point il est erroné d'obtenir des données à partir d'un cf non-natif.
Non. Dans Buffer[], les données sont insérées dans la boucle une par une - à chaque itération de la boucle, une valeur provenant de AO() est insérée.
2. Je renverse le tableau parce que je réécris l'indicateur à partir de quatre - tout fonctionne correctement dans celui-ci, toutes les données sont correctes. Tout est lié à l'obtention des données dans l'ordre exact dans lequel elles sont lues dans la boucle. Si nous ne retournons pas le tampon, nous devrons écrire l'indicateur à partir de zéro - pour quoi faire ? C'est assez compliqué. Je n'ai cité cet indicateur qu'à titre d'exemple pour montrer à quel point il est erroné d'obtenir des données à partir d'un cf non-natif.
Non. Dans Buffer[], les données sont insérées dans la boucle une par une - à chaque itération de la boucle, une valeur provenant de AO() est insérée.
4. Que voulez-vous dire par "début de la copie" ?
2. Rien ne vous empêche de construire une boucle de 0 à rates_total-1
intCopyBuffer(
int indicator_handle, // handle индикатораint buffer_num, // номер буфера индикатораint start_pos, // откуда начнем int count, // сколько копируемdouble buffer[] // массив, куда будут скопированы данные
);
doit être changé en
intCopyBuffer(
int indicator_handle, // handle индикатора int buffer_num, // номер буфера индикатора datetime start_time, // с какой даты int count, // сколько копируем double buffer[] // массив, куда будут скопированы данные
);
"A partir d'où commencer" ou "à partir de quelle date", c'est le début de la copie des valeurs de l'indicateur dans le tableau récepteur.
"Where do we start from" ou "from what date", c'est le début de la copie des valeurs de l'indicateur dans le tableau du récepteur.
Pourquoi passer la date si je lis la valeur de l'index de la boucle ? Avez-vous exécuté cet indicateur de test ? Il tire toujours AO d'un seul - le facteur de courant spécifié dans les paramètres. Quelle que soit la façon dont vous changez l'horizon temporel actuel, le graphique AO correspond toujours à celui que vous avez défini dans les paramètres.
Dans ce cas, toutes les données sont renvoyées, mais dans mon indicateur que je suis en train de modifier, les données ne sont pas renvoyées à partir d'un prix non natif.
Vous n'avez pas besoin de cet indicateur de test - les données d'un courant non natif sont déjà renvoyées. Mais les données ne sont pas renvoyées dans le mien, mais je les obtiens de la même façon.
Pourquoi passer la date si je lis la valeur de l'index de la boucle ? Avez-vous exécuté cet indicateur de test ? Il trace toujours AO à partir d'un seul - le setff dans les paramètres. Quelle que soit la façon dont vous changez l'horizon temporel actuel, le graphique AO correspond toujours à celui que vous avez défini dans les paramètres.
Dans ce cas, toutes les données sont renvoyées, mais dans mon indicateur que je suis en train de modifier, les données ne sont pas renvoyées à partir d'un prix non natif.
Vous n'avez pas besoin de cet indicateur de test - les données d'un courant non natif sont déjà renvoyées. Le mien ne le fait pas, mais j'obtiens des données exactement de la même manière.
Parce que la barre zéro H4 contient QUATRE barres H1. Et si vous demandez l'indice 2 de la période H1, vous obtiendrez la valeur de l'indicateur sur la barre 2 de la période H4.
Je comprends à peine ce que j'ai pu écrire.
En ce moment, il est 13:35. Heure d'ouverture du bar H1 actuel = 13:00. Vous essayez de copier les valeurs de l'indicateur par l'index de la barre = 1, c'est-à-dire la barre 12:00 de la période H1 actuelle. Mais au lieu de 12h00, vous avez 8h00 à l'heure H4 de la période.
Cela fait quatre jours que j'essaie d'obtenir les données de l'indicateur AO standard à partir de l'horizon temporel senior de l'indicateur, et toujours pas...
Je lis les données AO dans la boucle, mais exactement dans la boucle il n'y a pas de données historiques. Il y a des données sur la barre actuelle. Quel est le problème ? Qu'est-ce que je fais de mal ?
//+------------------------------------------------------------------+//| MTF AO.mq5 |//| Copyright 2017, Artem A. Trishkin, Skype artmedia70 |//| https://login.mql5.com/ru/users/artmedia70 |//+------------------------------------------------------------------+#property copyright"Copyright 2017, Artem A. Trishkin, Skype artmedia70"#property link"https://login.mql5.com/ru/users/artmedia70"#property version"1.00"#property indicator_separate_window#property indicator_buffers1#property indicator_plots1//--- plot AO#property indicator_label1 "AO MTF"#property indicator_type1 DRAW_SECTION#property indicator_color1 clrRed#property indicator_style1 STYLE_SOLID#property indicator_width1 1//--- indicator buffersdouble BufferAO[];
//+------------------------------------------------------------------+//| Enums |//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| Input Variables |//+------------------------------------------------------------------+sinputENUM_TIMEFRAMES PeriodForWork = PERIOD_M5; // Таймфрейм, на котором искать дивергенции//+------------------------------------------------------------------+//| Global Variables |//+------------------------------------------------------------------+string Prefix, symbol;
int handle_ao; // Хэндл AOint size_ao=0; // Количество скопированных данных AOdouble array_ao[]; // Массив данных АОENUM_TIMEFRAMES periodForWork;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,BufferAO);
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
ArrayInitialize(BufferAO,0);
//--- проверка рабочего периода и его смена, если выбран рабочий период меньше текущего
periodForWork=PeriodForWork;
if(Period()>periodForWork && PeriodForWork!=PERIOD_CURRENT) {
Alert("Выбран не корректный период: ",GetNameTF(PeriodForWork),"\nМеняю рабочий период на ",GetNameTF(Period()));
periodForWork=PERIOD_CURRENT;//GetTFasEnum(Period());
}
//--- имена
symbol=Symbol(); // Symbol()
Prefix="MTFdiv"; // Префикс имён объектовIndicatorSetString(INDICATOR_SHORTNAME,Prefix); // Короткое имя индикатора//--- хэндл AO
handle_ao=iAO(symbol,periodForWork);
if(handle_ao==INVALID_HANDLE) {
Print("Не удалось создать хэндл AO");
return(INIT_FAILED);
}
int count=(int)SeriesInfoInteger(symbol,periodForWork,SERIES_BARS_COUNT);
size_ao=CopyBuffer(handle_ao,0,0,count,array_ao);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- delete graphicsObjectsDeleteAll(0,Prefix);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---ArraySetAsSeries(BufferAO,true);
ArraySetAsSeries(array_ao,true);
//---ArraySetAsSeries(open,true);
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
ArraySetAsSeries(close,true);
int count=(int)SeriesInfoInteger(symbol,periodForWork,SERIES_BARS_COUNT);
//---if(rates_total<1) return(0);
//---int limit=rates_total-prev_calculated;
if(limit>1) {
limit=rates_total-1;
ArrayInitialize(BufferAO,0);
}
int periodSeconds=PeriodSeconds(periodForWork); // Количество секунд в рабочем периодеstaticdatetime lastTime=0;
int bar_first=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- основной цикл индикатораfor(int i=limit; i>=0; i--) {
//--- Пропускаем отсутствующие барыif(i>bar_first) continue;
//--- Получаем данные АОResetLastError();
size_ao=CopyBuffer(handle_ao,0,0,count,array_ao);
if(size_ao<0) Print("Ошибка копирования данных AO ",GetLastError());
//--- время открытия бара на рабочем периоде, соответствующее времени бара i на текущем периодеdatetime timePeriod=GetTimeOpen(symbol,periodForWork,i);
//--- если нашли открытие нового бара на рабочем таймфрейме (текущее время больше прошлого)if(timePeriod>0 && timePeriod>lastTime) {
//---datetime time_work=GetTimeOpen(symbol,periodForWork,i); // время открытия i на рабочем таймфреймеint bar_work_to_current=GetBarShift(symbol,PERIOD_CURRENT,time_work); // бар открытия времени time_work на текущем периоде графикаdouble ao_work=GetDataAO(time_work); // значение АО на баре i//---if(i<5) {
Print("Work period: ",GetNameTF(periodForWork),
",i=",i,", bar_work_to_current=",bar_work_to_current,
", time_work=",TimeToString(time_work,TIME_MINUTES),
", ao_work=",DoubleToString(ao_work,Digits())
);
}
BufferAO[bar_work_to_current]=ao_work;
//--- конец обработки текущего бара
lastTime=timePeriod; // запомним прошлое время для дальнейшего сравнения с временем следующего бара
}
//--- конец цикла индикатора
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+//| Functions |//+------------------------------------------------------------------+double GetDataAO(int shift) {
double array[1];
if(CopyBuffer(handle_ao,0,shift,1,array)==1) return(array[0]);
return(0);
}
//+------------------------------------------------------------------+double GetDataAO(datetime shift) {
double array[1];
if(CopyBuffer(handle_ao,0,shift,1,array)==1) return(array[0]);
return(0);
}
//+------------------------------------------------------------------+datetime GetTimeOpen(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
datetime array[1]={-1};
ResetLastError();
if(CopyTime(symbol_name,timeframe,index,1,array)==1) return(array[0]);
Print(__FUNCTION__," > Ошибка получения времени бара ",index,"(",GetNameTF(timeframe),"): ",GetLastError());
return(-1);
}
//+------------------------------------------------------------------+int GetBarShift(conststring symbol_name, constENUM_TIMEFRAMES timeframe, constdatetime time) {
int res=-1;
datetime last_bar;
if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
if(time>last_bar) res=0;
else {
constint shift=Bars(symbol_name,timeframe,time,last_bar);
if(shift>0) res=shift-1;
}
}
return(res);
}
//+------------------------------------------------------------------+string GetNameTF(int timeframe=PERIOD_CURRENT) {
if(timeframe==PERIOD_CURRENT) timeframe=Period();
switch(timeframe) {
//--- MQL4case1: return("M1");
case5: return("M5");
case15: return("M15");
case30: return("M30");
case60: return("H1");
case240: return("H4");
case1440: return("D1");
case10080: return("W1");
case43200: return("MN");
//--- MQL5case2: return("M2");
case3: return("M3");
case4: return("M4");
case6: return("M6");
case10: return("M10");
case12: return("M12");
case16385: return("H1");
case16386: return("H2");
case16387: return("H3");
case16388: return("H4");
case16390: return("H6");
case16392: return("H8");
case16396: return("H12");
case16408: return("D1");
case32769: return("W1");
case49153: return("MN");
default: return("UnknownPeriod");
}
}
//+------------------------------------------------------------------+
Nous devons être clairs sur le fait qu'il peut y avoir des exigences de marge très différentes dans MT5 dans différentes directions. C'est-à-dire qu'une seule variante MT4 peut ne pas fonctionner. Sur le Forex, bien sûr, ce ne sera pas le cas. Mais tu dois te rappeler. Par conséquent, en général, vous devriez l'écrire comme ceci
Alexey Kozitsyn: Je pense que vous faites beaucoup de choses "mal". Veuillez décrire ce que vous devez faire : étape par étape, point par point.
Qu'est-ce qui ne va pas exactement ? C'était la question - qu'est-ce que je fais mal pour obtenir des données d'indicateurs à partir d'une période non native ?
Exemple : l'indicateur fonctionne sur М1, alors que les données de l'AO doivent être obtenues sur М5. Ainsi, alors que nous avons une limite>1 (l'historique doit être recalculé), l'AO de M5 renvoie des zéros en l'absence d'erreur de données. Dès que tout l'historique est calculé (limite==0), les données de l'AO avec M5 commencent à arriver.
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 vérifie si l'indicateur est prêt (au début deOnCalculate).
vous pouvez également ajouter un contrôle de période
1. Juste une clarification. Il est maintenant clair que nous parlons de la même chose.
Je comprends, mais je ne suis pas d'accord pour dire qu'il faut retourner les tableaux pour le faire. Est-il nécessaire d'avoir un indicateur pour deux terminaux ? C'est presque comme faire 2en1 une faux et une hache.
3. Si je comprends bien, Buffer[] est utilisé par le récepteur dans la fonction CopyBuffer() pour obtenir une seule valeur d'indicateur.
4. Vous n'avez pas fait attention à la chose la plus importante. Le début de la copie des valeurs de l'indicateur ne doit pas être déterminé par l'indice de la barre, mais par le moment de la i-ème barre.
1. Ok.
2. J'ai inversé le tableau parce que je réécris l'indicateur à partir du quatre - tout fonctionne correctement dans celui-ci et toutes les données sont correctes. Tout ce qui s'y trouve est lié à l'obtention des données dans l'ordre exact où elles sont lues dans la boucle. Si nous ne retournons pas le tampon, nous devrons écrire l'indicateur à partir de zéro - pour quoi faire ? C'est assez compliqué. Je n'ai cité cet indicateur qu'à titre d'exemple pour montrer à quel point il est erroné d'obtenir des données à partir d'un cf non-natif.
Non. Dans Buffer[], les données sont insérées dans la boucle une par une - à chaque itération de la boucle, une valeur provenant de AO() est insérée.
4. Que voulez-vous dire par "début de la copie" ?
1. Bien.
2. Je renverse le tableau parce que je réécris l'indicateur à partir de quatre - tout fonctionne correctement dans celui-ci, toutes les données sont correctes. Tout est lié à l'obtention des données dans l'ordre exact dans lequel elles sont lues dans la boucle. Si nous ne retournons pas le tampon, nous devrons écrire l'indicateur à partir de zéro - pour quoi faire ? C'est assez compliqué. Je n'ai cité cet indicateur qu'à titre d'exemple pour montrer à quel point il est erroné d'obtenir des données à partir d'un cf non-natif.
Non. Dans Buffer[], les données sont insérées dans la boucle une par une - à chaque itération de la boucle, une valeur provenant de AO() est insérée.
4. Que voulez-vous dire par "début de la copie" ?
2. Rien ne vous empêche de construire une boucle de 0 à rates_total-1
3. Oui, je me suis trompé quelque part.
4.
doit être changé en
"A partir d'où commencer" ou "à partir de quelle date", c'est le début de la copie des valeurs de l'indicateur dans le tableau récepteur.
3. Oui, j'ai fait une erreur quelque part.
4. dans votre code.
doit être changé en
"Where do we start from" ou "from what date", c'est le début de la copie des valeurs de l'indicateur dans le tableau du récepteur.
Pourquoi passer la date si je lis la valeur de l'index de la boucle ? Avez-vous exécuté cet indicateur de test ? Il tire toujours AO d'un seul - le facteur de courant spécifié dans les paramètres. Quelle que soit la façon dont vous changez l'horizon temporel actuel, le graphique AO correspond toujours à celui que vous avez défini dans les paramètres.
Dans ce cas, toutes les données sont renvoyées, mais dans mon indicateur que je suis en train de modifier, les données ne sont pas renvoyées à partir d'un prix non natif.
Vous n'avez pas besoin de cet indicateur de test - les données d'un courant non natif sont déjà renvoyées. Mais les données ne sont pas renvoyées dans le mien, mais je les obtiens de la même façon.
Pourquoi passer la date si je lis la valeur de l'index de la boucle ? Avez-vous exécuté cet indicateur de test ? Il trace toujours AO à partir d'un seul - le setff dans les paramètres. Quelle que soit la façon dont vous changez l'horizon temporel actuel, le graphique AO correspond toujours à celui que vous avez défini dans les paramètres.
Dans ce cas, toutes les données sont renvoyées, mais dans mon indicateur que je suis en train de modifier, les données ne sont pas renvoyées à partir d'un prix non natif.
Vous n'avez pas besoin de cet indicateur de test - les données d'un courant non natif sont déjà renvoyées. Le mien ne le fait pas, mais j'obtiens des données exactement de la même manière.
Parce que la barre zéro H4 contient QUATRE barres H1. Et si vous demandez l'indice 2 de la période H1, vous obtiendrez la valeur de l'indicateur sur la barre 2 de la période H4.
Je comprends à peine ce que j'ai pu écrire.
En ce moment, il est 13:35. Heure d'ouverture du bar H1 actuel = 13:00. Vous essayez de copier les valeurs de l'indicateur par l'index de la barre = 1, c'est-à-dire la barre 12:00 de la période H1 actuelle. Mais au lieu de 12h00, vous avez 8h00 à l'heure H4 de la période.
Pour H1, la première barre est à 12:00
Pour H4 la première barre est 8:00
Ici et là, l'indice de la barre est le premier...
Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading
Bugs, bugs, questions
fxsaber, 2017.04.12 08:38
Un peu comme un coup de chapeau. Contournement de l'opérateur d'affectationForum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading
Je n'arrive pas à obtenir les données de l'indicateur à partir de l'image haute.
Artyom Trishkin, 2017.04.14 01:23
Cela fait quatre jours que j'essaie d'obtenir les données de l'indicateur AO standard à partir de l'horizon temporel senior de l'indicateur, et toujours pas...
Je lis les données AO dans la boucle, mais exactement dans la boucle il n'y a pas de données historiques. Il y a des données sur la barre actuelle. Quel est le problème ? Qu'est-ce que je fais de mal ?
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading
Caractéristiques du langage mql5, conseils et astuces
fxsaber, 2017.02.27 18:40
Merci pour le conseil ! Dans la nature, c'est SymbolInfoMarginRate. Donc maintenant c'est comme çadouble GetMarginRequired( const string Symb )
{
MqlTick Tick;
double MarginInit, MarginMain;
return((SymbolInfoTick(Symb, Tick) && SymbolInfoMarginRate(Symb, ORDER_TYPE_BUY, MarginInit, MarginMain)) ? MarginInit * Tick.ask *
SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE) / (SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0);
}
Nous devons être clairs sur le fait qu'il peut y avoir des exigences de marge très différentes dans MT5 dans différentes directions. C'est-à-dire qu'une seule variante MT4 peut ne pas fonctionner. Sur le Forex, bien sûr, ce ne sera pas le cas. Mais tu dois te rappeler. Par conséquent, en général, vous devriez l'écrire comme ceci
bool MyOrderCalcMargin( const ENUM_ORDER_TYPE action, const string symbol, const double volume, const double price, double &margin )
{
double MarginInit, MarginMain;
const bool Res = SymbolInfoMarginRate(symbol, action, MarginInit, MarginMain);
margin = Res ? MarginInit * price * volume * SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE) /
(SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE) * AccountInfoInteger(ACCOUNT_LEVERAGE)) : 0;
return(Res);
}
Lesurligné peut renvoyer 0. BKS a rencontré ce problème.
Je l'ai fait comme ça :
Je pense que vous faites beaucoup de choses "mal". Veuillez décrire ce que vous devez faire : étape par étape, point par point.
Qu'est-ce qui ne va pas exactement ? C'était la question - qu'est-ce que je fais mal pour obtenir des données d'indicateurs à partir d'une période non native ?
Exemple : l'indicateur fonctionne sur М1, alors que les données de l'AO doivent être obtenues sur М5. Ainsi, alors que nous avons une limite>1 (l'historique doit être recalculé), l'AO de M5 renvoie des zéros en l'absence d'erreur de données. Dès que tout l'historique est calculé (limite==0), les données de l'AO avec M5 commencent à arriver.