Toutes les tentatives, avec le nouvel indicateur, aboutissent à un raccrochage.
Et avec l'indicateur inchangé, il y a un hoquet momentané.
Quelle pourrait être la solution ?
Dans votre indicateur - au lieu d'utiliser les données d'autres indicateurs personnalisés, en particulier - recherchez des fractales de n'importe quelle dimension, créez simplement une fonction pour rechercher de telles fractales et travaillez avec elles.
Eh bien, vous en avez besoin pour retourner le prix d'une fractale sur la barre requise. Ici, j'ai fait un indicateur simple. Il possède deux fonctions que vous pouvez reprendre et utiliser dans les vôtres - je les ai spécialement organisées comme des fonctions - avec des contrôles pour les valeurs invalides.
Pour détacher complètement les fonctions permettant d'obtenir des fractales arbitraires de l'indicateur, nous ne devons pas passer par référence les tableaux high[] et low[] et la valeur limite dans ceux-ci.
Comme notre code est très proche de MQL5, nous devrons refuser les fonctions High[], Low[], iHigh() et iLow(). Voici comment cela se présente dans cet indicateur :
Bonjour, conseillez moi comment faire un EA utilisant un cadre temporel de 15 minutes pour vérifier la valeur toutes les 20 minutes, disons à 9-20, 9-40 suivi d'un croisement RSI et si le niveau est franchi en vingt minutes, vérifier le changement de prix. C'est ce que je dois réparer :
if (Hour()==9 && (Minute() == 20) && (RSI>70)) Price2==Bid; { if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
Autrement dit, disons qu'à 9-20, le RSI a été franchi. Je veux que mon EA se souvienne du prix à 9-20 et à 9-40 vérifie les 20 dernières minutes par rapport au prix à 9-20. Si elle baisse, elle ouvrira une position courte. Merci beaucoup.
Bonjour, je vous conseille de faire un conseiller expert utilisant un cadre temporel de 15 minutes pour vérifier la valeur toutes les 20 minutes, disons à 9-20, 9-40 suivi d'un croisement RSI et si le niveau est franchi en vingt minutes, vérifié le changement de prix. C'est ce que je dois réparer :
if (Hour()==9 && (Minute() == 20) && (RSI>70)) Price2==Bid; { if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
Autrement dit, disons qu'à 9-20, le RSI a été franchi. Je veux que mon EA se souvienne du prix à 9-20 et à 9-40 vérifie les 20 dernières minutes par rapport au prix à 9-20. Si elle baisse, elle ouvrira une position courte. Merci beaucoup.
:)
Et si vous exécutez le conseiller expert à 9.22 ?
Et s'il y a une défaillance du système ou du terminal ? Le prix sera perdu.
C'est-à-dire qu'il faut chercher ce qui était il y a 20 minutes au moment de ce contrôle. Le moment est venu où les minutes sont supérieures ou égales à un multiple de vingt - vérifiez l'état du RSI sur la barre, qui était il y a 20 minutes. S'il a le bon croisement, alors procédez comme prévu...
Cependant, sur M15, vous ne pouvez pas déterminer le moment exact du passage et le prix exact, mais vous pouvez regarder le prix sur M1 - au moins 15 fois plus précis.
Que se passe-t-il en cas de défaillance du système ou du terminal ? Le prix sera perdu.
C'est-à-dire qu'il faut chercher ce qui était il y a 20 minutes au moment de ce contrôle. Le moment est venu où les minutes sont supérieures ou égales à un multiple de vingt - vérifiez l'état du RSI sur la barre, qui était il y a 20 minutes. S'il a le croisement souhaité, alors nous procédons comme prévu...
Cependant, sur M15, vous ne pouvez pas déterminer le moment exact du passage et le prix exact, mais vous pouvez regarder le prix sur M1 - au moins 15 fois plus précis.
Ok, j'ai compris que je ne peux pas le faire))) Les gars, qui peut écrire cette partie du code ? Je paierai 1000 roubles.
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад. Comment("RSI = ",rci20);
Et où sont les mille ?
(plaisanterie)
La durée du RSI doit être de 15 minutes. Nous avons besoin que l'EA le vérifie toutes les 20 minutes à partir de l'ouverture du marché (9-00, 9-20, 9-40 etc.). Disons qu'à 10-20, il y a un croisement entre le niveau 70 et le niveau inférieur, il se souvient du prix et à 10-40, il vérifie si le prix est inférieur à celui de 10-20, il ouvre une position courte.
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.
Nous devons regarder plus profondément...
Plus profond, où est-ce que c'est?
Toutes les tentatives, avec le nouvel indicateur, aboutissent à un blocage.
Et avec l'indicateur, qui est inchangé, il y a un hoquet momentané.
Quelle pourrait être la solution ?
Plus profond, où est-ce que c'est?
Toutes les tentatives, avec le nouvel indicateur, aboutissent à un raccrochage.
Et avec l'indicateur inchangé, il y a un hoquet momentané.
Quelle pourrait être la solution ?
Il suffit de créer des fonctions permettant de trouver ces fractales et de travailler avec elles.
Pour vous, c'est une chose simple à faire).
mais pour moi, c'est une tâche impossible.
Une fonction comme celle-ci ?
{
//---
for(int i=1; i<=max; i++) {
if(i<=leftSide && low[bar]>low[bar-i]) return(false);
if(i<=rightSide && low[bar]>=low[bar+i]) return(false);
}
//---
return(true);
}
C'est une fractale inférieure.
Comment l'utiliser ?
Pour vous, c'est plus facile à faire).
Mais pour moi, c'est une tâche impossible.
Comment implanter la fonction de cet indicateur dans le mien ?
{
//---
for(int i=1; i<=max; i++) {
if(i<=leftSide && low[bar]>low[bar-i]) return(false);
if(i<=rightSide && low[bar]>=low[bar+i]) return(false);
}
//---
return(true);
}
Eh bien, vous en avez besoin pour retourner le prix d'une fractale sur la barre requise. Ici, j'ai fait un indicateur simple. Il possède deux fonctions que vous pouvez reprendre et utiliser dans les vôtres - je les ai spécialement organisées comme des fonctions - avec des contrôles pour les valeurs invalides.
//| iFreeNumFractals.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link "https://login.mql5.com/ru/users/artmedia70"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot UpperFractal
#property indicator_label1 "UpperFractal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot LowerFractal
#property indicator_label2 "LowerFractal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrSteelBlue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input int LeftNum=2; // Количество баров слева
int leftNum; // Количество баров слева
input int RightNum=2; // Количество баров справа
int rightNum; // Количество баров справа
//--- indicator buffers
double BufferUpperFractal[];
double BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufferUpperFractal);
SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,159);
PlotIndexSetInteger(1,PLOT_ARROW,159);
SetIndexArrow(0,217);
SetIndexArrow(1,218);
//---
leftNum=(LeftNum<1?1:LeftNum);
rightNum=(RightNum<1?1:RightNum);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(rates_total<leftNum+rightNum) return(0);
int limit=rates_total-prev_calculated;
if(limit>0) {
ArrayInitialize(BufferUpperFractal,0.0);
ArrayInitialize(BufferUpperFractal,0.0);
limit=rates_total-leftNum-1;
}
//---
for(int i=limit; i>rightNum; i--) {
if(GetFreeUpperFractal(i,limit,high,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
if(GetFreeLowerFractal(i,limit,low ,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(int shift,const int limit,const double &low[],int left_dimension=2,int right_dimension=2) {
if(left_dimension<1) left_dimension=1;
if(right_dimension<1) right_dimension=1;
if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
for(int i=shift; i>shift-right_dimension; i--) if(low[i]>low[i-1]) return(-1);
for(int i=shift; i<shift+left_dimension; i++) if(low[i]>low[i+1]) return(-1);
return(low[shift]);
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(int shift,const int limit,const double &high[],int left_dimension=2,int right_dimension=2) {
if(left_dimension<1) left_dimension=1;
if(right_dimension<1) right_dimension=1;
if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
for(int i=shift; i>=shift-right_dimension; i--) if(high[i]<high[i-1]) return(-1);
for(int i=shift; i<=shift+left_dimension; i++) if(high[i]<high[i+1]) return(-1);
return(high[shift]);
}
//+----------------------------------------------------------------------------+
Pour détacher complètement les fonctions permettant d'obtenir des fractales arbitraires de l'indicateur, nous ne devons pas passer par référence les tableaux high[] et low[] et la valeur limite dans ceux-ci.
Comme notre code est très proche de MQL5, nous devrons refuser les fonctions High[], Low[], iHigh() et iLow(). Voici comment cela se présente dans cet indicateur :
//| iFreeNumFractals.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link "https://login.mql5.com/ru/users/artmedia70"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- plot UpperFractal
#property indicator_label1 "UpperFractal"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot LowerFractal
#property indicator_label2 "LowerFractal"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrSteelBlue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input int LeftNum=2; // Количество баров слева
int leftNum; // Количество баров слева
input int RightNum=2; // Количество баров справа
int rightNum; // Количество баров справа
//--- indicator buffers
double BufferUpperFractal[];
double BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufferUpperFractal);
SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
// PlotIndexSetInteger(0,PLOT_ARROW,217);
// PlotIndexSetInteger(1,PLOT_ARROW,218);
SetIndexArrow(0,217);
SetIndexArrow(1,218);
//---
leftNum=(LeftNum<1?1:LeftNum);
rightNum=(RightNum<1?1:RightNum);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(rates_total<leftNum+rightNum) return(0);
int limit=rates_total-prev_calculated;
if(limit>0) {
ArrayInitialize(BufferUpperFractal,0.0);
ArrayInitialize(BufferUpperFractal,0.0);
limit=rates_total-leftNum-1;
}
//---
for(int i=limit; i>rightNum; i--) {
if(GetFreeUpperFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
if(GetFreeLowerFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
int bars=Bars(symbol_name,timeframe);
if(left_dimension<1) left_dimension=1;
if(right_dimension<1) right_dimension=1;
if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
for(int i=shift; i>shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i-1)) return(-1);
for(int i=shift; i<shift+left_dimension; i++) if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i+1)) return(-1);
return(GetPriceLow(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
int bars=Bars(symbol_name,timeframe);
if(left_dimension<1) left_dimension=1;
if(right_dimension<1) right_dimension=1;
if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
for(int i=shift; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i-1)) return(-1);
for(int i=shift; i<=shift+left_dimension; i++) if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i+1)) return(-1);
return(GetPriceHigh(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetPriceHigh(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
double array[1];
if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
return(-1);
}
//+----------------------------------------------------------------------------+
double GetPriceLow(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
double array[1];
if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
return(-1);
}
//+----------------------------------------------------------------------------+
Price2==Bid;
{
if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
return(0);
}
}
Price2==Bid;
{
if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
return(0);
}
}
:)
Et si vous exécutez le conseiller expert à 9.22 ?
Et s'il y a une défaillance du système ou du terminal ? Le prix sera perdu.
C'est-à-dire qu'il faut chercher ce qui était il y a 20 minutes au moment de ce contrôle. Le moment est venu où les minutes sont supérieures ou égales à un multiple de vingt - vérifiez l'état du RSI sur la barre, qui était il y a 20 minutes. S'il a le bon croisement, alors procédez comme prévu...
Cependant, sur M15, vous ne pouvez pas déterminer le moment exact du passage et le prix exact, mais vous pouvez regarder le prix sur M1 - au moins 15 fois plus précis.
:)
Et si vous exécutez l'EA à 9.22 ?
Que se passe-t-il en cas de défaillance du système ou du terminal ? Le prix sera perdu.
C'est-à-dire qu'il faut chercher ce qui était il y a 20 minutes au moment de ce contrôle. Le moment est venu où les minutes sont supérieures ou égales à un multiple de vingt - vérifiez l'état du RSI sur la barre, qui était il y a 20 minutes. S'il a le croisement souhaité, alors nous procédons comme prévu...
Cependant, sur M15, vous ne pouvez pas déterminer le moment exact du passage et le prix exact, mais vous pouvez regarder le prix sur M1 - au moins 15 fois plus précis.
Ok, je comprends que je ne peux pas y faire face)))) gars qui peuvent écrire cette partie du code ? Je vais payer 1000 roubles
Comment("RSI = ",rci20);
Et où sont les mille ?
(je plaisante)
Comment("RSI = ",rci20);
Et où sont les mille ?
(plaisanterie)