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

 
Vladimir:
Existe la posibilidad, si el EA (o script) está a su disposición desde el punto de vista de tomar y corregir el código fuente. Hay que poner una condición alrededor de todas las alertas que compruebe si el botón está pulsado. Si no se pulsa el botón, no se llama a las descripciones.

GraciasVladimir - Creo que usaré tu método o pondré todo el EA en esta condición.

Gracias a Vitalie Postolache- Estudiaré su recomendación. Todavía no he estudiado mql5.

 
miss.natasha:

Necesito escribir los datos en un archivo hst, de modo que pueda utilizar los datos para construir un gráfico autónomo.

Llevo dos días luchando pero nada funciona.

Código:

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
ulong    last_fpos=0;         //
int      HandleHistory=-1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string symbol=Symbol();
   int per=Period()*9;

   ResetLastError();
   if(CreateHeader()==true)//если создали заголовок
     {
      HandleHistory=FileOpenHistory(symbol+(string)per+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
      if(HandleHistory!=INVALID_HANDLE)
        {

         for(int i=199;i>0;i--)//заполняем данными
           {
            MqlRates r;
            r.time=Time[i];//просто пытаюсь записать, это так для примера
            r.open=Open[i];//просто пытаюсь записать, это так для примера
            r.low=Low[i];
            r.high=High[i];
            r.close=Close[i];
            r.tick_volume=(long)10;
            r.spread=0;
            r.real_volume=(long)10;
            uint byteswritten=FileWriteStruct(HandleHistory,r);
            Print("FileOpen OK ",byteswritten," ",Time[i]);
           }
       FileClose(HandleHistory);
       // FileFlush(HandleHistory);
        }
      else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
     }
// long id=ChartOpen(symbol,per);
//Alert(id);
  }
//+------------------------------------------------------------------+
bool CreateHeader()//создаем файл с историей hst(заголовок)
  {

   int      file_version=401;
   string   c_copyright;
   string   c_symbol=Symbol();
   int i_period=Period()*9;
   int      i_digits=Digits;
   int      i_unused[13];
//---  
   ResetLastError();
   HandleHistory=FileOpenHistory(c_symbol+(string)i_period+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
   if(HandleHistory<0)
     {
      Print("Error open ",c_symbol+(string)i_period,".hst file ",GetLastError());
      return(false);
     }
   c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   ArrayInitialize(i_unused,0);
//--- write history file header
   FileWriteInteger(HandleHistory,file_version,LONG_VALUE);
   FileWriteString(HandleHistory,c_copyright,64);
   FileWriteString(HandleHistory,c_symbol,12);
   FileWriteInteger(HandleHistory,i_period,LONG_VALUE);
   FileWriteInteger(HandleHistory,i_digits,LONG_VALUE);
   FileWriteInteger(HandleHistory,0,LONG_VALUE);
   FileWriteInteger(HandleHistory,0,LONG_VALUE);
   FileWriteArray(HandleHistory,i_unused,0,13);
   return(true);
  }

Como resultado de la ejecución se crea un archivo con el historial, pero no se crea el gráfico autónomo.

Aquí está la información sobre el gráfico

Poralguna razón, los datos son de 2003.

Como resultado, obtengo un error al lanzar el gráfico HistoryBase: 196 errores en 'NZDCHF45'.

Entiendo que he escrito algo mal. No sé cómo escribirlo correctamente, tengo muy poca información. Quién sabe... por favor, aconséjeme.


No recuerdo que MQ abra oficialmente la estructura de los archivos .hst (si lo hacen, comprueba las especificaciones oficiales)

tal vez esto es un extracto de un proyecto muy, muy viejo (C, gcc) :


/* .hst file header
*/
struct HstHeader {
    uint32_t    version;        // +0 4 LE  : database version
    char        copyright[64];  // +4 64    : copyright data
    char        symbol[12];     // +68 12   : symbol (EURUSD..)
    uint32_t    period;         // +80 4 LE : timeframe (sec. in period)
    uint32_t    digits;         // +84 4 LE : decimals after .
    datetime    timesign;       // +88 4 LE : creation time sign.
    datetime    last_sync;      // +92 4 LE : last sync. timestamp
    uint8_t     unused[52];     // +96 52   : reserved for feauture use
                                // total 148 bytes, packed, aligned by 1
};

/* .hst bar array (file payload)
*/
// when HstHeader.version==400
struct HstRates400 {
    datetime    ctm;            // +0 4 LE  : start (creation) time
    double      open;           // +4 8 LE  : open price
    double      low;            // +12 8 LE : lowest price
    double      high;           // +20 8 LE : highst price
    double      close;          // +28 8 LE : close price
    double      volume;         // +36 8 LE : volume (nr of ticks)
                                // total 44 bytes,packed, aligned by 1
} __attribute__((packed));

// when HstHeader.version==401

struct HstRates401 {
    datetime    ctm;            // +0 8 LE  : bar start time (with ms?)
    double      open;           // +8 8 LE  : open price
    double      low;            // +16 8 LE : lowest price
    double      high;           // +24 8 LE : highst price
    double      close;          // +32 8 LE : close price
    uint64_t    volume;         // +40 8 LE : volume (nr of ticks)
    uint32_t    spread;         // +48 4 LE : spread
    long        real_volume;    // +52 8 LE : real volume
                                // total 60 bytes,packed,aligned by 1
} __attribute__((packed));


ahora, después de muchos años, no estoy seguro de que las altas/bajas deban estar en ese orden, pero comprueba que tus estructuras tienen al menos el mismo tamaño (cabecera y registro)
 

Hola a todos, seguimos perfeccionando lo que ya tenemos

Tenemos una cuadrícula irregular de órdenes y una línea horizontal que puede estar en cualquier lugar

Tenemos que ponerlo en práctica:

si el precio está por debajo de la línea cerrar todas las órdenes

Las dificultades son las siguientes

1) si las órdenes son de tipo no uniforme y ya al poner la línea está todo hecho, y no cuando ponemos el marcado y ponemos la línea (en este caso deberíamos poner también la bandera on/off)

2) Implementación de una inscripción en la parte superior derecha de la línea por tipo (si la orden se cierra a este precio, el resultado será el mismo para el saldo, es decir, tenemos que cambiar la visualización cada tick y también al mover la línea; es básicamente similar a un trailing stop o sl si la orden se coloca manualmente, sólo que flotante y con la posibilidad de disparos erróneos inicialmente)

El robot está ahí, aparte de la etiqueta numérica todo está ya dibujado, la cuestión está en la correcta asignación de valores y el tratamiento de la información de toda la parrilla.

Archivos adjuntos:
USDCHFH1.png  26 kb
 
trader781:


1) si los pedidos son de tipo irregular

Es la primera vez que oigo hablar de ellos.
 
Hola. No entiendo por qué iTime a veces muestra la hora equivocada. Al abrir una nueva velaPERIOD_H1 debería mostrar la hora en el registro Print(iTime(NULL,PERIOD_M1,30)). En las pruebas muestra todo correctamente, pero en la realidad la hora es a veces diferente incluso por varias horas. ¿Por qué es así?
 
Nauris Zukas:
Hola. No entiendo por qué iTime a veces da la hora equivocada. En la apertura de una nueva velaPERIOD_H1 debe mostrar la hora en el registro Print(iTime(NULL,PERIOD_M1,30)). En las pruebas muestra todo correctamente, pero en la realidad la hora es a veces diferente incluso por varias horas. ¿Por qué es así?

UtilizaCopyTime, yo también noté este problema al construir objetos gráficos yCopyTime solucionó el problema

datetime TM[];
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
 
Vitaly Muzichenko:

UtilizaCopyTime, yo también noté este problema al construir objetos gráficos yCopyTime solucionó el problema

datetime TM[];
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
Gracias.
 
Evgeny Belyaev:
Es la primera vez que oigo hablar de ellos.
Sólo necesito una toma flotante que esté ligada a un objeto.
 
¿Cómo puedo hacer que la escala de mi indicador muestre 5 decimales?

Aquí, el gráfico tiene 5 dígitos y el indicador tiene 4.
 
igrok333:
¿Cómo puedo hacer que la escala de mi indicador muestre 5 decimales?

Aquí, el gráfico tiene 5 dígitos y el indicador tiene 4.
IndicatorSetInteger(INDICATOR_DIGITS,Digits());