Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 3
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Tenemos que mirar más profundamente...
Más profundo, ¿dónde está eso?
Todos los intentos, con el nuevo indicador, conducen a un cuelgue.
Y con el indicador, que no cambia, hay un hipo momentáneo.
¿Cuál podría ser la solución?
Más profundo, ¿dónde está eso?
Todos los intentos, con el nuevo indicador, resultan en un cuelgue.
Y con el indicador sin cambios, hay un hipo momentáneo.
¿Cuál podría ser la solución?
Sólo hay que crear funciones para encontrar esos fractales y trabajar con ellos.
Para ti, es algo sencillo).
pero para mí es una tarea imposible.
¿Una función como esta?
{
//---
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);
}
Es un fractal inferior.
¿Cómo se utiliza?
Para ti, es más fácil hacerlo).
Pero para mí es una tarea imposible.
¿Cómo implantar la función de ese indicador en el mío?
{
//---
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);
}
Pues bien, se necesita que devuelva el precio de un fractal en la barra requerida. Aquí, hice un indicador simple. Tiene dos funciones que puedes sacar y utilizar en el tuyo - las he organizado especialmente como funciones - con comprobaciones de valores no válidos.
//| 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]);
}
//+----------------------------------------------------------------------------+
Para separar completamente las funciones para obtener fractales arbitrarios del indicador, no debemos pasar por referencia las matrices high[] y low[] y el valor del límite en ellas.
Como nuestro código es muy cercano a MQL5, tendremos que rechazar las funciones High[], Low[], iHigh() y iLow(). Así es como se verá en este indicador:
//| 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);
}
}
:)
¿Qué pasa si ejecuta el Asesor Experto en 9.22?
¿Y si hay un fallo del sistema o del terminal? El precio se perderá.
Es decir, hay que buscar lo que había hace 20 minutos cuando llega la hora de esta comprobación. Ha llegado el momento en el que los minutos son mayores o iguales a un múltiplo de veinte - compruebe el estado del RSI en la barra, que fue hace 20 minutos. Si tiene el cruce correcto, entonces proceda como está previsto...
Sin embargo, en M15 no se puede determinar la hora exacta del cruce ni el precio exacto, pero se puede mirar el precio en M1 - al menos 15 veces más preciso.
:)
¿Y si ejecutas el EA a 9,22?
¿Qué pasa si hay un fallo del sistema o del terminal? El precio se perderá.
Es decir, hay que buscar lo que había hace 20 minutos cuando llega la hora de esta comprobación. Ha llegado el momento en que los minutos son mayores o iguales a un múltiplo de veinte - compruebe el estado del RSI en la barra, que fue hace 20 minutos. Si tiene el cruce deseado, entonces procedemos como estaba previsto...
Sin embargo, en M15 no se puede determinar la hora exacta del cruce ni el precio exacto, pero se puede mirar el precio en M1 - al menos 15 veces más preciso.
Bueno, entiendo que no puedo hacer frente a ella)))) chicos que pueden escribir esta parte del código? Voy a pagar 1000 rublos
Comment("RSI = ",rci20);
¿Y dónde están los mil?
(es una broma)
Comment("RSI = ",rci20);
¿Y dónde están los mil?
(bromeando)