[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 324

 

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 --
   // Торговые критерии
   MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_1
   MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_2
 
   if (MA_1_t > MA_2_t + Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1_t < MA_2_t - Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 
se ha convertido:

//--------------------------------------------------------------- 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)

 
Forexman77:


//--------------------------------------------------------------- 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.

fig1

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 parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=2;
extern bool Show_Volume=true;
extern double coaf=1.5;
extern bool Show_Vol_line=true;
//---- indicator buffers
double 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 settings
   
  string 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 done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

//---- AO_fan line 2 (basic) buffer
   for(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 до Low
  int 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);  
  
  
      
//---- done
   return(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);
 }
 
Sepulca:


¿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.

¡¡¡Muchas gracias!!! ¡¡¡Funciona!!!
 

Chicos, ¡que alguien me diga qué pasa con el código, por favor!

 
Fox_RM:

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
   }
   
 
VladislavVG:


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í.

 //-- Поиск High & Time  
  if (AOBuffer3[i]>=0)
  {
  prhgh_s = High[i];
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];} // -- tmhgh - выводил это значение оно = 0;

  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0)
  {
  prlw_s = Low[i];
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);    tmlw - тоже = 0; Почему?
  
  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);     
 
asdfgh001:

¡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.
 
Fox_RM:


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.

 
VladislavVG:


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.