Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 3
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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)