Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 971

 
korobok777:
No se puede saber sin el código
 

Por la tarde. Escribí un indicador simple para la salida del RSI de las zonas de sobrecompra/sobreventa.

derecho, dibuja flechas donde se supone que debe hacerlo. Pero sólo en tiempo real.

Pregunta: ¿cómo hacer que se dibuje en el historial para n número de barras?

#propiedad ventana_del_gráfica_del_indicador
#property indicator_buffers 2
#property indicator_color1 LimeGreen
#property indicator_color2 LimeGreen

doble rsi,rsi1,rsi2;
doble CrossUp[];
doble CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool Nueva_Barra=false;
int init()
{
//---- indicadores
SetIndexStyle(0, DRAW_ARROW,5,1);
SetIndexArrow(0, 233);
SetIndexBuffer(0, CrossUp);
SetIndexStyle(1, DRAW_ARROW,5,1);
SetIndexArrow(1, 234);
SetIndexBuffer(1, CrossDown);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Función de desinicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
int inicio()
{

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar();
int límite, i, contador;
double Range, AvgRange;
for(i = 0; i <= límite; i++) {
contador=i;
Rango=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(Alto[contador]-Bajo[contador]);
}
Rango=AvgRange/10;
if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
{Alerta ("¡¡¡RSI DOWN!!! en ", Symbol());
CrossDown[i] = High[i]+ Range*1.8;
FLAG = 1;}
if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
{Alerta ("¡¡¡RSI UP!!! en ", Symbol());
CrossUp[i] = Low[i]- Range*1.8;
FLAG1 = 1; }
if( New_Bar==true)
{FLAG=0;}
if( New_Bar==true)
{FLAG1=2;}
}
return(0);
}
void Fun_New_Bar()
{
static datetime New_Time=0;
Nueva_barra=false;
if(¡Tiempo_nuevo!=Tiempo[0])
{
Nueva_Hora=Hora[0];
New_Bar=true;
}
}
 
Vinin:
No se puede saber nada sin el código.
//==================================================================+
extern ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков
//==================================================================+

string _ChartSymbol;
long   _ChartID,
       _ChartFirst,
       _ChartPeriod;
int start()
{//---идентификатор графика начиная с первого 
    _ChartFirst=ChartFirst();
if(_ChartFirst>0)//если идентификатор больше ноля
{
 _ChartSymbol=ChartSymbol(_ChartFirst);//символ графика
 _ChartPeriod=ChartPeriod(_ChartFirst);//Периоды графика
 //---выполним функцию конвертации периода если не совпадает
if( _ChartPeriod!=PERIOD_)
 {
  bool  ch=ChartSetSymbolPeriod(_ChartFirst,_ChartSymbol,PERIOD_);
 } 
}
return(0);
}
int  deinit()
{
Alert("скрипт закончил работу");
return(0);
}
Esto es sólo para el primer gráfico, no he hecho más, la ventana emergente estorba.
 
Red_Manticore:

Por la tarde. Escribí un indicador simple para la salida del RSI de las zonas de sobrecompra/sobreventa.

derecho, dibuja flechas donde se supone que debe hacerlo. Pero sólo en tiempo real.

Pregunta: ¿cómo hacer que se dibuje en el historial para n número de barras?


Inserta el código según las reglas, ¡conócelo antes! Haga clic en el SRC a la izquierda del botón de vídeo, y elimine la "hoja".

#property indicator_chart_window
#property indicator_buffers 2
#property  indicator_color1 LimeGreen
#property  indicator_color2 LimeGreen

double rsi,rsi1,rsi2;
double CrossUp[];
double CrossDown[];
int FLAG = 0;
int FLAG1 = 2;
bool New_Bar=false; 
 
int init()
  {
//---- indicators
  SetIndexStyle(0, DRAW_ARROW,5,1);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW,5,1);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
int start()
{  

rsi = iRSI(NULL,0,4,PRICE_CLOSE,0);
rsi1 = iRSI(NULL,0,4,PRICE_CLOSE,1);
rsi2 = iRSI(NULL,0,4,PRICE_CLOSE,2);



Fun_New_Bar(); 
  
   int limit, i, counter;
   double Range, AvgRange;
    for(i = 0; i <= limit; i++) {
   
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;
      if (FLAG<1 && rsi<rsi2 && rsi2>70 && rsi1<70)
      {Alert ("RSI DOWN!!! on ", Symbol());
      CrossDown[i] = High[i]+ Range*1.8;
          FLAG = 1;} 
      if(FLAG1>1 && rsi>rsi2 && rsi2<30 && rsi1>30)
      {Alert ("RSI UP!!! on ", Symbol());
      CrossUp[i] = Low[i]- Range*1.8;
         FLAG1 = 1; } 
   
       if( New_Bar==true)
       {FLAG=0;}
       if( New_Bar==true)
       {FLAG1=2;} 
   
   }
  return(0);
  } 
  
  void Fun_New_Bar()                              
  {                                             
   static datetime New_Time=0;                  
   New_Bar=false;                               
   if(New_Time!=Time[0])                        
     { 
      New_Time=Time[0];                         
      New_Bar=true;                            
     } 
  }     
ответить
 
korobok777:
Esto es sólo para el primer gráfico, no hice más interferencias con la ventana emergente.

El script procesa todos los gráficos abiertos. El actual se procesa en último lugar. Como los scripts terminan su trabajo al cambiar de marco temporal, la ventana que avisa de la terminación del script aparecerá sólo una vez. En todos los gráficos, el marco temporal se cambiará por el especificado

//+------------------------------------------------------------------+
//|                                             ReplaceTimeFrame.mq4 |
//|                                            Copyright 2015, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict

#property  show_inputs

input ENUM_TIMEFRAMES PERIOD_=PERIOD_H1;//Периоды графиков

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   long id=ChartFirst();
   long id_current=ChartID();
   int i=0;
   while(i<100)
     {
      ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id);//Периоды графика
      if(_ChartPeriod!=PERIOD_ && id!=id_current)
        {
         bool  ch=ChartSetSymbolPeriod(id,ChartSymbol(id),PERIOD_);
        }

      id=ChartNext(id);
      if(id<0){break;}
      i++;
     }
   ENUM_TIMEFRAMES _ChartPeriod=ChartPeriod(id_current);//Периоды графика
   if(_ChartPeriod!=PERIOD_)
     {
      bool  ch=ChartSetSymbolPeriod(id_current,ChartSymbol(id_current),PERIOD_);
     }
  }
 
Vinin:

El script procesa todos los gráficos abiertos. El actual se procesa en último lugar. Como los scripts terminan su trabajo al cambiar de marco temporal, la ventana que avisa de la terminación del script aparecerá sólo una vez. En todos los gráficos el marco temporal se cambiará por el especificado


Ai)))bien hecho!!!!¡¡Gracias!!!
 

Buenas tardes,

Declaro un array

double gdClose_array[];

ArrayResize(gdClose_array, 1);

Copiar los datos en la matriz con la última barra cerrada, desde el gráfico actual

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

Valor de salida de la matriz

double dX=NormalizeDouble(gdClose_array[0],Digits);

Imprimir ("NormalizarDoble(dX,Dígitos) ", dX);

Obtengo un número pero es obviamente incorrecto:

NormalizarDoble(dX,Dígitos) 1.0644.

Aunque no existe tal valor en el gráfico (según la visualización)

Y este valor no cambia en el transcurso de las pruebas.

Añadido

ArraySetAsSeries(gdClose_array,true);

la situación no cambió.

¿Dónde está el error?

 
n0name:

Por la tarde,

...

Copiar datos en una matriz con un cierre por la última barra cerrada, desde el gráfico actual

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array) ;

Aquí has escrito sólo el nombre del array sin especificar el índice del elemento del array. Debido a que previamente ha ArrayResize(gdClose_array, 1); ha establecido el número de elementos del array como 1, su índice es 0. Por eso hay que hacerlo así:

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);


Y un par de preguntas/consejos más.

1) Si sólo necesitas almacenar 1 valor, puedes utilizar una variable en lugar de un array. Entonces, en lugar de:

double gdClose_array[];
ArrayResize(gdClose_array, 1); 

hacer

double gdClose_array;

y luego hacer el resto como su código original.

2) Si necesitas un array, pero sabes de entrada que sólo tendrá 1 elemento, entonces declara un array estático con 1 elemento en lugar de declarar uno dinámico y luego redimensionarlo. No hay necesidad de operaciones adicionales.

En lugar de

double gdClose_array[];
ArrayResize(gdClose_array, 1);

escribir

double gdClose_array[1];

entonces

iX=CopyClose(Symbol(),PERIOD_CURRENT,1,1,gdClose_array[0]);

y luego como su código original.

 

Hola, Pregunta a los programadores.

Tengo un Asesor Experto que se dispara cuando se abre una orden y le coloca un Stop Loss y Take Profit de acuerdo a una cantidad especificada de puntos.

Mi pregunta.

Podemos cambiar el código para que en lugar del Stop Loss, el EA exponga una orden de stop inversa pendiente del mismo tamaño.

¿Qué debo cambiar en el código para ello?

Gracias.

 

Buenas tardes.

Una vez más no puedo salir de lo que parece ser una cosa elemental - ¿por qué todo parece estar de acuerdo con la ayuda, pero el resultado imprime 0,0 ?

  double FractalDown_1 = iFractals(NULL,0,MODE_LOWER,1); Print("FractalDown_1=",FractalDown_1);

¿Por qué no se extrae el valor fractal?

Razón de la queja: