Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 34
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
Muéstrame tu indicador completo, veamos qué es lo que falla.
Gracias.
Aquí está.
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LawnGreen
#property indicator_color2 DeepPink
#property indicator_width1 1
#property indicator_width2 1
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
extern string Stochastic = "Configure Stochastic Settings";
extern int TimeFrame1=1;
extern int KPeriod = 5;
extern int DPeriod = 3;
extern int Slowing = 3;
extern int OverBought = 80;
extern int OverSold = 20;
extern int TimeFrame2=5;
extern int KPeriod1 = 5;
extern int DPeriod1 = 3;
extern int Slowing1 = 3;
extern int OverBought1 = 55;
extern int OverSold1 = 45;
extern string Alerts = "Configure Alerts";
extern bool PopUpAlert = true; //Popup Alert
extern bool EmailAlert = true; //Email Alert
extern bool PushAlert = true; //Push Notifications Alert
// UP and DOWN Buffers
double UP[];
double DOWN[];
// Distance of arrows from the high or low of a bar
int distance = 3;
double MyPoint;
datetime CTime;
int OnInit()
{
//--- indicator buffers mapping
//UP Arrow Buffer
SetIndexEmptyValue(0,0.0);
SetIndexStyle(0,DRAW_ARROW,0,EMPTY);
SetIndexArrow(0,233);
SetIndexBuffer(0,UP);
//DOWN Arrow Buffer
SetIndexEmptyValue(1,0.0);
SetIndexStyle(1,DRAW_ARROW,0,EMPTY);
SetIndexArrow(1,234);
SetIndexBuffer(1,DOWN);
//Auto Adjustment for broker digits
if (Digits()==5||Digits()==3){MyPoint=Point*10;} else{MyPoint=Point;}
CTime=Time[0];
//---
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
//--- delete an object from a chart
Comment("");
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;
for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic(NULL,TimeFrame1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
double Stoch2 = iStochastic(NULL,TimeFrame1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
double Stoch50_1 = iStochastic(NULL,TimeFrame2,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
double Stoch50_2 = iStochastic(NULL,TimeFrame2,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50&&Stoch50_1>Stoch50_2)
{
UP[i]=Low[i]-distance*MyPoint;
}
if(Stoch1<80 && Stoch2>80&&Stoch50_1<50&&Stoch50_1<Stoch50_2)
{
DOWN[i]=High[i]+distance*MyPoint;
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Gracias.
Aquí está
...
Sólo para aclarar.
Quiero poner la flecha hacia arriba si la línea del indicador ha cruzado el nivel 20, en el período M1, y la línea del indicador se dirige hacia arriba, por encima del nivel 50, en el período M5.
Veamos cómo obtener los valores del marco temporal superior, estando en el inferior:
//| iTwoStoch.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 UP
#property indicator_label1 "UP"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrLawnGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot DN
#property indicator_label2 "DN"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrDeepPink
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- enums
enum enumYN
{
enYes=1, // Да
enNo=0, // Нет
};
//--- input parameters
extern string Stochastic1 = "Параметры стохастика 1";
input ENUM_TIMEFRAMES TimeFrame1 = PERIOD_M1; // Таймфрейм
input int KPeriod1 = 5; // Период %K
input int DPeriod1 = 3; // Период %D
input int Slowing1 = 3; // Замедление
input double OverBought1 = 80; // Уровень перекупленности
input double OverSold1 = 20; // Уровень перепроданности
extern string Stochastic2 = "Параметры стохастика 2";
input ENUM_TIMEFRAMES TimeFrame2 = PERIOD_M5; // Таймфрейм
input int KPeriod2 = 5; // Период %K
input int DPeriod2 = 3; // Период %D
input int Slowing2 = 3; // Замедление
input double OverBought2 = 55; // Уровень перекупленности
input double OverSold2 = 45; // Уровень перепроданности
extern string Alerts = "Configure Alerts";
input enumYN UsePopUpAlert = enYes; // Popup Alert
input enumYN UseEmailAlert = enYes; // Email Alert
input enumYN UsePushAlert = enYes; // Push Notifications Alert
//--- indicator buffers
double BufferUP[];
double BufferDN[];
//--- global variables
int kperiod1; // Период %K стох.1
int dperiod1; // Период %D стох.1
int slowing1; // Замедление стох.1
double overBought1; // Уровень перекупленности стох.1
double overSold1; // Уровень перепроданности стох.1
//---
int kperiod2; // Период %K стох.2
int dperiod2; // Период %D стох.2
int slowing2; // Замедление стох.2
double overBought2; // Уровень перекупленности стох.2
double overSold2; // Уровень перепроданности стох.2
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufferUP);
SetIndexBuffer(1,BufferDN);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
SetIndexArrow(0,233);
SetIndexArrow(1,234);
//---
kperiod1=(KPeriod1<1?1:KPeriod1);
kperiod2=(KPeriod2<1?1:KPeriod2);
dperiod1=(DPeriod1<1?1:DPeriod1);
dperiod2=(DPeriod2<1?1:DPeriod2);
slowing1=(Slowing1<1?1:Slowing1);
slowing2=(Slowing2<1?1:Slowing2);
//---
overBought1=(OverBought1>100.0?100.0:OverBought1<0.1?0.1:OverBought1);
overSold1=(OverSold1<0?0:OverSold1>99.9?99.9:OverSold1);
if(overBought1<=overSold1) overBought1=overSold1+0.1;
if(overSold1>=overBought1) overSold1=overBought1-0.1;
//---
overBought2=(OverBought2>100.0?100.0:OverBought2<0.1?0.1:OverBought2);
overSold2=(OverSold2<0?0:OverSold2>99.9?99.9:OverSold2);
if(overBought2<=overSold2) overBought2=overSold2+0.1;
if(overSold2>=overBought2) overSold2=overBought2-0.1;
//---
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<2) return(0);
int limit=rates_total-prev_calculated;
if(limit>1) {
limit=rates_total-2;
ArrayInitialize(BufferUP,EMPTY_VALUE);
ArrayInitialize(BufferDN,EMPTY_VALUE);
}
for(int i=limit; i>=0; i--) {
int bar_sto2_0=iBarShift(Symbol(),TimeFrame2,iTime(Symbol(),TimeFrame2,i));
int bar_sto2_1=iBarShift(Symbol(),TimeFrame2,iTime(Symbol(),TimeFrame2,i+1));
double sto1_0=iStochastic(Symbol(),TimeFrame1,kperiod1,dperiod1,slowing1,MODE_SMA,STO_LOWHIGH,MODE_MAIN,i);
double sto1_1=iStochastic(Symbol(),TimeFrame1,kperiod1,dperiod1,slowing1,MODE_SMA,STO_LOWHIGH,MODE_MAIN,i+1);
double sto2_0=iStochastic(Symbol(),TimeFrame2,kperiod2,dperiod2,slowing2,MODE_SMA,STO_LOWHIGH,MODE_MAIN,bar_sto2_0);
double sto2_1=iStochastic(Symbol(),TimeFrame2,kperiod2,dperiod2,slowing2,MODE_SMA,STO_LOWHIGH,MODE_MAIN,bar_sto2_1);
Comment(
"\n",
"Stoch ",EnumToString(TimeFrame1),
", бар ",(i+1)," > время: ",TimeToString(time[i+1],TIME_MINUTES),", значение: ",DoubleToString(sto1_1,Digits()),
"; бар ",i," > время: ",TimeToString(time[i],TIME_MINUTES),", значение: ",DoubleToString(sto1_0,Digits()),"\n",
//---
"Stoch ",EnumToString(TimeFrame2),
", бар ",bar_sto2_1," > время: ",TimeToString(iTime(Symbol(),TimeFrame2,bar_sto2_1),TIME_MINUTES),", значение: ",DoubleToString(sto2_1,Digits()),
"; бар ",bar_sto2_0," > время: ",TimeToString(iTime(Symbol(),TimeFrame2,bar_sto2_0),TIME_MINUTES),", значение: ",DoubleToString(sto2_0,Digits())
);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
A continuación, intente hacer la lógica que desea en lugar de Comment().
Veamos...
Veamos cómo obtener valores de un marco temporal superior mientras se está en uno inferior:
Y luego trata de hacer la lógica que quieres en lugar de Comment().
Veremos...
Gracias, ha funcionado )
En el Asesor Experto, al llamar al indicador, sólo tengo que especificar el número del marco temporal deseado, mientras el indicador "baila" con el desplazamiento. ¿Dónde puedo leer más sobre el tema?
Gracias, ha funcionado )
En el EA, cuando llamo al indicador, sólo tengo que especificar el número del marco temporal deseado, y el indicador "baila" con el cambio. ¿Dónde puedo leer más sobre el tema?
No lo he leído en ningún sitio, no tengo ni idea.
Imagínese esto: usted recorre los bares de la M1. Los valores de los indicadores se toman del número de barra al que se refiere el índice de ciclo i.
En la tabla en la cabecera en la parte superior el índice de ciclo M1, debajo está el valor del tiempo de barra al que se refiere el índice M1
En la parte inferior se encuentra el índice de ciclo M5, encima está el valor del tiempo de barra al que se refiere el índice M5
Al pasar el valor del índice del marco temporal actual, en el que comienza el ciclo, a la función iCustom(), se obtienen los valores del indicador del marco temporal más antiguo según el índice. Pero el índice no se refiere a la barra necesaria, como se puede ver en la tabla.
Y esto debe hacerse también en los asesores expertos, de lo contrario - no está tomando los valores de la barra esperada y piensa que lo tiene correcto. Bueno, has acertado, pero no desde el bar equivocado. Esto debe conocerse y tenerse en cuenta.
Es decir, en la recepción de datos multitiempo es necesario basarse en el tiempo, y recalcularlo al número de barra en el marco temporal requerido.
Artyom, por favor ayúdame también, tengo problemas con los indicadores.
Las funciones en el Asesor Experto funcionan y son simples de conectar, bueno, es comprensible - sólo necesitan valores actuales, pero ¿cómo transferirlos al indicador, para dibujar la coincidencia en la historia?
Las flechas deben ser dibujadas en una vela, tan pronto como el Alto[1] y el Bajo[1] coincidan.
//| iTwo.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 UP
#property indicator_label1 "UP"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrLawnGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot DN
#property indicator_label2 "DN"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrDeepPink
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- input parameters
input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1;
input string dSymbol = "AUDUSD";
//--- indicator buffers
double BufferUP[];
double BufferDN[];
//--- global variables
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufferUP);
SetIndexBuffer(1,BufferDN);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
SetIndexArrow(0,233);
SetIndexArrow(1,234);
//---
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<2) return(0);
int limit=rates_total-prev_calculated;
if(limit>1) {
limit=rates_total-2;
ArrayInitialize(BufferUP,EMPTY_VALUE);
ArrayInitialize(BufferDN,EMPTY_VALUE);
}
int NumFrUp = GetFractalBar(dSymbol,PERIOD_CURRENT,0,MODE_UPPER); // номер бара Up
int NumFrDn = GetFractalBar(dSymbol,PERIOD_CURRENT,0,MODE_LOWER); // номер бара Dn
Comment( "Bear: " , GetBearBull(dSymbol, TimeFrame, 3) == 1, // Подряд 3 бара вверх
"\nBull: ", GetBearBull(dSymbol, TimeFrame, 3) == 2, // Подряд 3 бара вниз
"\nNumFrUp: " , NumFrUp, // номер бара Up
"\nNumFrDn: ", NumFrDn, // номер бара Dn
"\nPriceFrUp: " ,iHigh(dSymbol,PERIOD_CURRENT,NumFrUp), // Цена верхнего фрактала
"\nPriceDn: ", iLow(dSymbol,PERIOD_CURRENT,NumFrDn) // Цена нижнего фрактала
);
for(int i=limit; i>=0; i--) {
//--
if(/* что сюда */0)
{
BufferUP[i]=Low[i]-50*_Point;
}
//--
if(/* что сюда */0)
{
BufferDN[i]=High[i]+50*_Point;
}
} // end for
//--- return value of prev_calculated for next call
return(rates_total);
}
//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
for(int i=3; i<iBars(symb, tf)-1; i++) {
if(mode==MODE_LOWER){
f=iFractals(symb, tf, MODE_LOWER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}
if(mode==MODE_UPPER){
f=iFractals(symb, tf, MODE_UPPER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}}
return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
double open1=0,close1=0,open2=0,close2=0;
int b=1,s=1;
for(int i=1; i<ne; i++) {
open1=iOpen(symb,tf,i);
close1=iClose(symb,tf,i);
open2= iOpen(symb,tf,i+1);
close2= iClose(symb,tf,i+1);
if(open2<close2 && open1<close1 && open2<open1) { // бычьи
b++;
if(b==ne) { return(1);}
}
if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
s++;
if(s==ne) { return(2);}
}
}
return(0);
}
//===============================================================================================
Luego intentaré introducir otros patrones siguiendo la analogía, para no molestar al Asesor Experto.
Gracias.
Artyom, por favor ayúdame también, tengo problemas con los indicadores.
Las funciones en el Asesor Experto funcionan y son simples de conectar, bueno, es comprensible - sólo necesitan valores actuales, pero ¿cómo transferirlos al indicador, para dibujar la coincidencia en la historia?
Las flechas se dibujan en una vela, cuando se produce la coincidencia del Alto[1] y el Bajo[1].
...
Luego intentaré introducir otros patrones siguiendo la analogía, para no molestar al Asesor Experto.
Gracias.
Debería haber una lógica diferente para los distintos patrones, porque no todos son iguales. Y para un mismo patrón, la lógica debe ser escrita de manera diferente por diferentes programadores.
¿Y qué es exactamente, qué patrón quiere determinar?
Empecemos con esto.
Debe haber una lógica diferente para los distintos patrones, porque no todos los patrones son iguales. Y para el mismo patrón, diferentes programadores escribirán una lógica diferente.
¿Y qué es exactamente, qué patrón quieres definir?
Empecemos con esto.
He adjuntado una imagen.
La condición: el fractal "3" es más alto que el fractal "2" y el fractal "1" es más alto que "2" -FrDn3 > FrDn2&& FrDn2< FrDn1 Miramos las velas, los fractales ya están formados y esperamos la confirmación del patrón de velas,
y si hay"3" subidas seguidas - comprar (flecha) -GetBearBull(dSymbol,0,3)==1(1 - comprar)
En el caso de la venta es al revés.
Es fácil ponerlo en un Asesor Experto, pero en un indicador ...
He adjuntado la imagen.
Condición requerida: el fractal "3" es mayor que el fractal "2" y el fractal "1" es mayor que el "2" -FrDn3 > FrDn2&& FrDn2< FrDn1 Miramos la vela, los fractales ya se han formado y esperamos la confirmación del patrón de la vela,
y si hay"3" aumentando en una fila - comprar (flecha) -GetBearBull(dSymbol,0,3)==1(1 - comprar)
En el caso de la venta, es al revés.
Es fácil ponerlo en un Asesor Experto, pero en un indicador...
En el indicador es viceversa - si se empieza a buscar en la profundidad de la historia, en el indicador - desde su principio. Busca primero el fractal de la izquierda, luego el del medio y después el de la derecha.
Gestiona las banderas.
En el indicador, la lógica es la contraria: si en el EA se empieza a buscar en la profundidad del historial, en el indicador se empieza desde el principio del historial. Busca primero el fractal de la izquierda, luego el del medio y después el de la derecha.
Gestiona las banderas.
Pido que se muestre la variante lista. Puede que la vea una vez y se me quiten las dudas, pero ahora tengo mil y no puedo decidirme.
Qué hacer con todo esto en un indicador - no tengo ni idea(
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
for(int i=3; i<iBars(symb, tf)-1; i++) {
if(mode==MODE_LOWER){
f=iFractals(symb, tf, MODE_LOWER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}
if(mode==MODE_UPPER){
f=iFractals(symb, tf, MODE_UPPER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}}
return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
double open1=0,close1=0,open2=0,close2=0;
int b=1,s=1;
for(int i=1; i<ne; i++) {
open1=iOpen(symb,tf,i);
close1=iClose(symb,tf,i);
open2= iOpen(symb,tf,i+1);
close2= iClose(symb,tf,i+1);
if(open2<close2 && open1<close1 && open2<open1) { // бычьи
b++;
if(b==ne) { return(1);}
}
if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
s++;
if(s==ne) { return(2);}
}
}
return(0);
}
//===============================================================================================
Si pudiera, entonces no hay preguntas, entiendo la lógica, pero no puedo implementarla en el código, así que por favor muéstrame una variante lista, la veré una vez y las preguntas desaparecerán en el futuro, pero ahora hay miles de ellas y no puedo resolverlas yo mismo.
Qué hacer con todo esto en un indicador - ni idea(
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar(string symb="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
if(symb=="0") { symb=Symbol();}
double f=0;
int kf=0;
for(int i=3; i<iBars(symb, tf)-1; i++) {
if(mode==MODE_LOWER){
f=iFractals(symb, tf, MODE_LOWER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}
if(mode==MODE_UPPER){
f=iFractals(symb, tf, MODE_UPPER, i);
if(f!=0) {
kf++;
if(kf>nf) { return(i);}
}}}
return(-1);
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=5) {
if(symb=="0") { symb=Symbol();}
double open1=0,close1=0,open2=0,close2=0;
int b=1,s=1;
for(int i=1; i<ne; i++) {
open1=iOpen(symb,tf,i);
close1=iClose(symb,tf,i);
open2= iOpen(symb,tf,i+1);
close2= iClose(symb,tf,i+1);
if(open2<close2 && open1<close1 && open2<open1) { // бычьи
b++;
if(b==ne) { return(1);}
}
if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
s++;
if(s==ne) { return(2);}
}
}
return(0);
}
//===============================================================================================
¿Necesita una función que devuelva un número de barra fractal por su número?
Necesita una función que devuelva la presencia de un fractal en la barra requerida (índice de ciclo+3)