He estudiado el Asesor Experto MQL4 durante un mes y decidí escribir un Asesor Experto. No quise escribir uno nuevo debido a la falta de experiencia y decidí usar la plantilla tradingexpert.mq4 del libro.
La esencia de la estrategia es la siguiente: un sistema de tres barras de máximos y mínimos de "Larry Williams", trazar dos EMAs de tres días para máximos y mínimos, vender
a los altos y compra a los bajos.
En la plantilla, en la sección de variables globales he eliminado la línea extern double Rastvor =28,0; (en realidad no es necesaria) y también la he eliminado de los criterios de negociación.
Se han cambiado los valores de MA a 3 en las variables globales:
extern int Period_MA_1= 3; // Periodo MA 1 extern int Period_MA_2= 3; // Periodo MA 2
En el apartado de criterios de negociación estaba:
if (PRICE_HIGH * Point >= MA_1_t * Point) { Opn_S=true; Cls_B=true; }
if (PRICE_LOW * Point <= MA_2_t * Point) { Opn_B=true; //criterio de apertura. Comprar Cls_S=true; // Criterio de cierre. Sell } //---------------------------------------------------------------
Ahora el quid del problema: el sistema sólo abre órdenes de venta, pero no quiere comprar. ¿Cuál puede ser el error?
Es muy posible que tenga errores en alguna otra parte. Por favor, no juzguen, pero ayúdenme con consejos).
¿Qué es esto? PRICE_LOW y PRICE_HIGH. Son constantes enteras que tienen valor 0 o 1, hasta 6.
Debe utilizar iHigh(Symbol(),Period(),i) para obtener el valor máximo de BID en la barra i, e iLow(Symbol(),Period(),i) para obtener el valor mínimo de BID en la barra i.
Si se da una vuelta en la barra actual entonces: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) Y no es necesario multiplicar MA por Point.
He adjuntado un indicador de volumen (Volume) al indicador estándar Awesome.
Quiero organizar el cálculo del volumen total de la onda (contado desde el precio mínimo hasta el máximo y que corresponde al valor mínimo y máximo de Awesome). Véase la figura 1.
Cuál es el error, los valores no se cuentan.
A continuación se muestra el código propiamente dicho.
#property indicator_separate_window#property indicator_buffers 2#property indicator_color1 Red#property indicator_color2 SteelBlue#property indicator_width1 2//---- basic fan indicator parametersexternbool Show_AOLine_2=true;
externint SlowEMA3=34;
externint EMA=2;
externbool Show_Volume=true;
externdouble coaf=1.5;
externbool Show_Vol_line=true;
//---- indicator buffersdouble AOBuffer3[];
double ExtMapBuffer1[];
double VLUP;
double prhgh_e=0, prhgh_s, prlw_e=0, prlw_s;
datetime tmhgh, tmlw;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
//---- drawing settingsstring name_ind = "Awesome_super_volumes";
IndicatorShortName("Awesome_super_volumes");
//---- AO_fan line 2 (basic)if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
else
{Show_AOLine_2=DRAW_NONE; }
SetIndexBuffer(0,AOBuffer3);
SetIndexStyle(0,Show_AOLine_2);
SetIndexLabel(0,"basic line");
SetIndexBuffer(1,ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexLabel(1,"Volume");
//---- initialization donereturn(0);
}
//+------------------------------------------------------------------+//| Awesome Oscillator |//+------------------------------------------------------------------+int start()
{
int limit;
int counted_bars=IndicatorCounted();
double prev,current;
//---- last counted bar will be recountedif(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- AO_fan line 2 (basic) bufferfor(int i=0; i<limit; i++)
{
//---- AO_fan basic line + Volumes
AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
if (Show_Vol_line==true)
{
double Vol_Arr[];
if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;}
//---- dispatch values between 2 buffers
}
//-- Поиск High & Time if (AOBuffer3[i]>=0)
{
prhgh_s = High[i];
if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}
}
//-- Поиск Low & Time if (AOBuffer3[i]<=0)
{
prlw_s = Low[i];
if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
}
// -- Пересчет баров от High до Lowint colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);
int shift=iBarShift(NULL,0,tmlw);
for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));}
SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);
//-- Эти значения должны отображаться в окне Awesome
SetText2("Волна1",DoubleToStr(VLUP,0),980,10,Gray,10);
SetText2("Волна2",TimeToStr(tmlw,0),980,25,Gray,10);
SetText2("Волна3",TimeToStr(tmhgh,0),980,40,Gray,10);
SetText2("Волна4",DoubleToStr(colbr,0),980,55,Gray,10);
//---- donereturn(0);
}
//+------------------------------------------------------------------+void SetText(string name, string Vl, datetime t1, double p1, color c)
{
// if (ObjectFind(name)!=-1) ObjectDelete(name);ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
ObjectSetText(name, Vl, 10, "Times New Roman", c);
ObjectSet(name, OBJPROP_TIME1 , t1);
ObjectSet(name, OBJPROP_PRICE1, p1);
ObjectSet(name, OBJPROP_COLOR, c);
}
//--Ввeл дополнительную процедуру для отображения значений на чарте. Ее не должно быть.void SetText2(string name, string text, int xdist, int ydist, color c, int size)
{
ObjectCreate(name,OBJ_LABEL,0,0,0,0,0);
ObjectSet(name, OBJPROP_XDISTANCE, xdist);
ObjectSet(name, OBJPROP_YDISTANCE, ydist);
ObjectSetText(name,text,7,"Arial Black",c);
}
¿Qué es esto? PRICE_LOW y PRICE_HIGH. Son constantes enteras con valor 0 o 1, hasta 6.
Debería utilizar iHigh(Symbol(),Period(),i) para obtener el valor máximo de BID en la barra i, e iLow(Symbol(),Period(),i) para obtener el valor mínimo de BID en la barra i.
Si se da una vuelta en la barra actual, entonces: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) Y no es necesario multiplicar MA por Point.
Chicos, ¡que alguien me diga qué pasa con el código, por favor!
if (Show_Vol_line==true)
{double Vol_Arr[]; // ошибки: 1. Размещение 2. Область видимости
if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;}
//---- dispatch values between 2 buffers
}
¿Podría decirme si es posible encontrar en algún lugar el corte de las formas de AT como archivos CSV? Puedo utilizar txt, xls o cualquier otro formato que se pueda procesar mediante programación.
Hay ejemplos de figuras de AT en varios artículos de AT, libros de texto, pero por supuesto como imágenes ordinarias. ¿Alguien tiene conjuntos más o menos grandes de símbolos de AT guardados como una porción de la historia de algún par de divisas en los períodos H1-H4, digamos?
He buscado en Google y no he encontrado nada. Por supuesto, podemos recorrer manualmente el historial, marcar las formas, exportar este trozo de historial como .csv; repetir el número de veces necesario, y recoger la base de formas al final. Pero si alguien ya lo ha hecho, me gustaría ahorrar tiempo.
Gracias de antemano :)
¿Por qué necesita las formas como archivos CSV? Escribir una biblioteca de formas... Escríbalos usted mismo, para poder entenderlos, no pida prestados los de otra persona. Mucho no significa mejor.
No lo entiendo. Pero no hay ningún problema con la visualización de los volúmenes. Hay un problema con el recuento del volumen. En algún lugar de aquí.
1. La matriz necesita ser colocada - es decir, asignar memoria. De lo contrario, simplemente no hay ningún lugar para almacenar los valores ;).
2. Cuando reciba un nuevo tick, su matriz colocada de forma uniforme será reposicionada/reiniciada. Esto tiene que ver con el alcance. El array debe ser de tipo "estático" para evitar que esto ocurra.
Lee algo sobre los fundamentos de la programación.
HZ El problema del recuento es donde te señalé los errores de uso del array.
1. Un array debe ser localizado, en otras palabras, la memoria debe ser asignada. De lo contrario, no hay lugar para almacenar valores ;).
2. Cuando reciba un nuevo tick, su matriz colocada de forma uniforme será reposicionada/reiniciada. Esto tiene que ver con el alcance. El array debe ser de tipo "estático" para evitar que esto ocurra.
Lee algo sobre los fundamentos de la programación.
HZ El problema del recuento es donde te he señalado errores en el uso de los arrays.
Es decir,Vol_Arr[ ]debe ser inicializado como un array global según entiendo.
La pregunta es por supuesto una pregunta nula, PERO.
1. Por qué entonces los volúmenes se muestran correctamente en el indicador.
2. Al calcular, accedo aAOBuffer3[] y no aVol_Arr[].
Hola a todos.
He estudiado el Asesor Experto MQL4 durante un mes y decidí escribir un Asesor Experto. No quise escribir uno nuevo debido a la falta de experiencia y decidí usar la plantilla tradingexpert.mq4 del libro.
La esencia de la estrategia es la siguiente: un sistema de tres barras de máximos y mínimos de "Larry Williams", trazar dos EMAs de tres días para máximos y mínimos, vender
a los altos y compra a los bajos.
En la plantilla, en la sección de variables globales he eliminado la línea extern double Rastvor =28,0; (en realidad no es necesaria) y también la he eliminado de los criterios de negociación.
Se han cambiado los valores de MA a 3 en las variables globales:
extern int Period_MA_1= 3; // Periodo MA 1
extern int Period_MA_2= 3; // Periodo MA 2
En el apartado de criterios de negociación estaba:
//--------------------------------------------------------------- 5 --
// Criterios de negociación
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,0); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,0); // MA_2
if (PRICE_HIGH * Point >= MA_1_t * Point)
{
Opn_S=true;
Cls_B=true;
}
if (PRICE_LOW * Point <= MA_2_t * Point)
{
Opn_B=true; //criterio de apertura. Comprar
Cls_S=true; // Criterio de cierre. Sell
}
//---------------------------------------------------------------
Ahora el quid del problema: el sistema sólo abre órdenes de venta, pero no quiere comprar. ¿Cuál puede ser el error?
Es muy posible que haya errores en alguna otra parte, por favor no juzgue con dureza sino que ayude con consejos)
//--------------------------------------------------------------- 5 --
// Criterios de negociación
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,0); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,0); // MA_2
if (PRICE_HIGH * Point >= MA_1_t * Point)
{
Opn_S=true;
Cls_B=true;
}
if (PRICE_LOW * Point <= MA_2_t * Point)
{
Opn_B=true; //criterio de apertura. Comprar
Cls_S=true; // Criterio de cierre. Sell
}
//---------------------------------------------------------------
Ahora el quid del problema: el sistema sólo abre órdenes de venta, pero no quiere comprar. ¿Cuál puede ser el error?
Es muy posible que tenga errores en alguna otra parte. Por favor, no juzguen, pero ayúdenme con consejos).
¿Qué es esto? PRICE_LOW y PRICE_HIGH. Son constantes enteras que tienen valor 0 o 1, hasta 6.
Debe utilizar iHigh(Symbol(),Period(),i) para obtener el valor máximo de BID en la barra i, e iLow(Symbol(),Period(),i) para obtener el valor mínimo de BID en la barra i.
Si se da una vuelta en la barra actual entonces: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) Y no es necesario multiplicar MA por Point.
¡Buenas tardes a todos!
Por favor, dígame cuál es el problema.
He adjuntado un indicador de volumen (Volume) al indicador estándar Awesome.
Quiero organizar el cálculo del volumen total de la onda (contado desde el precio mínimo hasta el máximo y que corresponde al valor mínimo y máximo de Awesome). Véase la figura 1.
Cuál es el error, los valores no se cuentan.
A continuación se muestra el código propiamente dicho.
¿Qué es esto? PRICE_LOW y PRICE_HIGH. Son constantes enteras con valor 0 o 1, hasta 6.
Debería utilizar iHigh(Symbol(),Period(),i) para obtener el valor máximo de BID en la barra i, e iLow(Symbol(),Period(),i) para obtener el valor mínimo de BID en la barra i.
Si se da una vuelta en la barra actual, entonces: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) Y no es necesario multiplicar MA por Point.
Chicos, ¡que alguien me diga qué pasa con el código, por favor!
Chicos, ¡que alguien me diga qué pasa con el código, por favor!
No lo entiendo. Pero no hay problemas con la visualización del volumen. Hay problemas con el cálculo de los volúmenes. En algún lugar de aquí.
¡Buenas tardes!
Mi pregunta se sale un poco del tema.
¿Podría decirme si es posible encontrar en algún lugar el corte de las formas de AT como archivos CSV? Puedo utilizar txt, xls o cualquier otro formato que se pueda procesar mediante programación.
Hay ejemplos de figuras de AT en varios artículos de AT, libros de texto, pero por supuesto como imágenes ordinarias. ¿Alguien tiene conjuntos más o menos grandes de símbolos de AT guardados como una porción de la historia de algún par de divisas en los períodos H1-H4, digamos?
He buscado en Google y no he encontrado nada. Por supuesto, podemos recorrer manualmente el historial, marcar las formas, exportar este trozo de historial como .csv; repetir el número de veces necesario, y recoger la base de formas al final. Pero si alguien ya lo ha hecho, me gustaría ahorrar tiempo.
Gracias de antemano :)
¿Por qué necesita las formas como archivos CSV? Escribir una biblioteca de formas... Escríbalos usted mismo, para poder entenderlos, no pida prestados los de otra persona. Mucho no significa mejor.
No lo entiendo. Pero no hay ningún problema con la visualización de los volúmenes. Hay un problema con el recuento del volumen. En algún lugar de aquí.
1. La matriz necesita ser colocada - es decir, asignar memoria. De lo contrario, simplemente no hay ningún lugar para almacenar los valores ;).
2. Cuando reciba un nuevo tick, su matriz colocada de forma uniforme será reposicionada/reiniciada. Esto tiene que ver con el alcance. El array debe ser de tipo "estático" para evitar que esto ocurra.
Lee algo sobre los fundamentos de la programación.
HZ El problema del recuento es donde te señalé los errores de uso del array.
1. Un array debe ser localizado, en otras palabras, la memoria debe ser asignada. De lo contrario, no hay lugar para almacenar valores ;).
2. Cuando reciba un nuevo tick, su matriz colocada de forma uniforme será reposicionada/reiniciada. Esto tiene que ver con el alcance. El array debe ser de tipo "estático" para evitar que esto ocurra.
Lee algo sobre los fundamentos de la programación.
HZ El problema del recuento es donde te he señalado errores en el uso de los arrays.
Es decir,Vol_Arr[ ]debe ser inicializado como un array global según entiendo.
La pregunta es por supuesto una pregunta nula, PERO.
1. Por qué entonces los volúmenes se muestran correctamente en el indicador.
2. Al calcular, accedo aAOBuffer3[] y no aVol_Arr[].
Gracias.