[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 325

 

¿Puede decirme cómo prescribir cuando la diferencia de dos EMAs (cinco días/mínimo y máximo) aumenta, para vender en largo en la EMA máxima y volver a comprar en corto en la EMA mínima?

Utilizo"Rastvor" en la cabecera de la variable global como la diferencia de dos EMAs .

¿Cómo puedo escribir este código en los criterios de negociación?

 
Fox_RM:

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é se muestran correctamente los volúmenes en el indicador?

2. Al calcular, accedo aAOBuffer3[] y no aVol_Arr[].

Gracias.


Cuando se declara un array (no un buffer) se debe especificar explícitamente su tamaño.... al menos.
 
Fox_RM:

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é se muestran correctamente los volúmenes en el indicador?

2. Al calcular, accedo aAOBuffer3[] y no aVol_Arr[].

Gracias.

1.
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
Las dos matrices que utiliza están conectadas a los buffers indicadores, es decir, se les asigna memoria (aunque implícitamente)
SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);

No se asigna memoria para este array(Vol_Arr[]) ni estática ni dinámicamente.

2. Por lo que veo en el código, la diferencia de los volúmenes MA y no MA se calcula en el arrayAOBuffer3[]

   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;
}

Los volúmenes se cuentan enExtMapBuffer1.

Vol_Arr[] puede ser inicializado como global o con un modificador estático - puedes elegir el tuyo, pero la memoria debe ser asignada en cualquier caso o vinculada al buffer del indicador, así como las dos matrices anteriores - nombras algunas variantes.

 
VladislavVG:
1) Las dos matrices que utilizas están conectadas con búferes indicadores, es decir, la memoria está asignada para ellas (aunque implícitamente).

......

Vladislav, he vuelto a revisar el código. Una parte del código conVol_Arr[] quedóde la antigua versión del indicador, la he borrado.

Creo que el error sigue estando en esta parte del código, pero no entiendo dónde. He comentado esta parte del código con más detalle.

 
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  --- Ищу самый высокий бар и определяю время этого бара // -- пока значение  tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}    --- Ищу самый низкий бар и определяю время этого бара // -- пока значение  tmlw = 0
  } 
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);  //-- Здесь считаю общее количество баров от наименьшего до наибольшего значения // -- пока значение  colbr = 0
  
  int shift=iBarShift(NULL,0,tmlw); // -- Это точка отсчета
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));} //-- Значению VLUP суммируем все объемы начиная от самого низкого бара до самого высокого бара // -- Значение  VLUP = 47

Figura 2

 
Fox_RM:

Vladislav, he vuelto a revisar el código. Una parte del código conVol_Arr[] quedóde la antigua versión del indicador, la he borrado.

Creo que el error sigue estando en esta parte del código, pero no entiendo dónde. He comentado esta parte del código con más detalle.

Bien, publica de nuevo el código completo, que ahora funciona, a ver.
 

Aquí está:

#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;
}
  }
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) //Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  //--- Ищу самый высокий бар и определяю время этого бара // -- пока значение tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) //Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}   // --- Ищу самый низкий бар и определяю время этого бара // -- пока значение tmlw = 0
  } 
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);  //-- Здесь считаю общее количество баров от наименьшего до наибольшего значения // -- пока значение colbr = 0
  
  int shift=iBarShift(NULL,0,tmlw); // -- Это точка отсчета
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));} //-- Значению VLUP суммируем все объемы начиная от самого низкого бара до самого высокого бара // -- Значение VLUP = 47
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
  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); 
  }
  
  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);
 }

Gracias de nuevo.

 
Fox_RM:

Aquí está:



De un vistazo:

   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;
}
  } // здесь цикл закончился
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) //Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  //--- Ищу самый высокий бар и определяю время этого бара // -- пока значение tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) //Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}   // --- Ищу самый низкий бар и определяю время этого бара // -- пока значение tmlw = 0
  } 

El fragmento resaltado está fuera del bucle y utiliza el contador de bucle i - algo está mal, ya sea con la lógica o con la implementación

 
hoz:

¿Por qué necesita las cifras como archivos CSV?

Necesario para probar y depurar los algoritmos de reconocimiento.

hoz:

Escríbalos usted mismo para entenderlos en lugar de tomar los de otra persona.

¿Escribir qué exactamente? ¿Te refieres a marcar tú mismo las formas en el gráfico y exportar los trozos de historia correspondientes? Esta solución es la primera en la cola hasta ahora, pero todavía espero que alguien lo haya hecho ya. Al fin y al cabo, es sólo una tarea.

hoz:

La abundancia no significa que sea mejor.

Permítanme discrepar. Cuanto mayor sea el conjunto de pruebas, más fiable será el resultado del programa desde el punto de vista estadístico.


p.d. La pregunta sigue siendo válida.(Ver pregunta en este post )

 

¡¡¡Hola a todos!!!

Podría decirme qué código se necesita para hacer un cierre largo en el máximo de la MA actual.

A continuación se muestran los criterios de negociación reales y se ha resaltado en rojo lo que no está claro.

Tampoco está claro cómo decirle al programa que salga de una posición,

después de aumentar la diferencia entre MA1 y MA2?

//--------------------------------------------------------------- 5 --
// Criterios de negociación
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,1); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,1); // MA_2

if ( iHigh (Symbol(),Period(),0) >= MA_1_t) //
{
Opn_S=true;
}
if ( iLow (Symbol(),Period(),0) <= MA_2_t) //
{
Opn_B=true; // Criterio de compra abierto
}
if(¿qué código se necesita para hacer un cierre largo al máximo iMA de hoy?)
{
Cls_B=true;
}
//--------------------------------------------------------------- 6 --

 
VladislavVG:


Sólo un vistazo rápido:

El fragmento resaltado está fuera del bucle y utiliza el contador del bucle i - algo está mal, ya sea con la lógica o con la implementación


¡Gracias Vladislav! Algo ha empezado a funcionar. ¡Pero por alguna razón sólo así! :(

fig3

Otra pregunta: ¿por qué no se muestran las etiquetas de texto en la ventana del indicador?

// -- Процедура
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); 
  }
// -- Обращение
SetText("Awesome_super_volumes", DoubleToStr(VLUP,0), tmhgh, dist, Black);
Razón de la queja: