Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 1129

 
Vladimir:
Há uma possibilidade, se a EA (ou roteiro) estiver à sua disposição do ponto de vista de tomar e corrigir o código fonte. Você precisa colocar uma condição em torno de todos os alertas verificando se o botão é pressionado. Se o botão não for pressionado, não chame os alertas.

ObrigadoVladimir - Acho que vou usar seu método ou colocar toda a EA nesta condição.

Graças a Vitalie Postolache- Vou estudar sua recomendação. Eu ainda não estudei o mql5.

 
miss.natasha:

Preciso escrever os dados em um arquivo hst, para que eu possa usar os dados para construir um gráfico autônomo.

Eu tenho lutado pelo segundo dia, mas 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 da execução, é criado um arquivo com histórico, mas não é criado um gráfico autônomo.

Aqui estão as informações sobre o gráfico

Por alguma razão, os dados são de 2003!

Como resultado, recebo um erro quando lanço o gráfico HistóricoBase: 196 erros em 'NZDCHF45'.

Eu entendo que escrevi algo errado. Não sei como escrevê-lo corretamente, tenho muito pouca informação. Quem sabe - por favor, avise.


Não me lembro de MQ abrir oficialmente a estrutura de arquivos .hst (se o fizerem, verifique as especificações oficiais)

talvez este seja um trecho de um projeto muito, muito antigo (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));


agora, depois de muitos anos, não tenho certeza se alto/baixo deveria estar nessa ordem, mas verifique se suas estruturas têm pelo menos o mesmo tamanho (cabeçalho e registro)
 

Olá a todos, apenas continuando a refinar o que já temos

Temos uma grade irregular de ordens e uma linha horizontal que pode estar em qualquer lugar

Precisamos implementar isto:

se o preço estiver abaixo da linha fechar todos os pedidos

As dificuldades são as seguintes

1) se as ordens são de tipo não-uniforme e já na definição da linha tudo está feito, e não quando colocamos a marcação e definimos a linha (neste caso devemos também colocar a bandeira on/off)

2) Implementação de uma inscrição na parte superior direita da linha por tipo (se o pedido for fechado a este preço, o resultado será o mesmo para o saldo, ou seja, temos que mudar o mostrador a cada tic e também ao mover a linha; geralmente é semelhante a uma parada ou sling se o pedido for feito manualmente, apenas flutuando e com a possibilidade de gatilhos errôneos inicialmente)

O robô está lá, exceto pela etiqueta numérica tudo já está desenhado, a questão está na correta atribuição de valores e processamento de informações de toda a grade.

Arquivos anexados:
USDCHFH1.png  26 kb
 
trader781:


1) se as ordens são de tipo irregular

Esta é a primeira vez que ouço falar deles.
 
Olá. Não entendo porque o iTime às vezes mostra a hora errada. Ao abrir uma nova vela PERÍODO_H1 deve mostrar o tempo no log Print(iTime(NULL,PERÍODO_M1,30)). Ele exibe tudo corretamente nos testes, mas na realidade o tempo às vezes é diferente até mesmo por várias horas. Por que é assim?
 
Nauris Zukas:
Olá. Não entendo porque o iTime às vezes dá tempo errado. Na abertura de uma nova vela PERÍODO_H1 deve mostrar o tempo no log Print(iTime(NULL,PERÍODO_M1,30)). Ele exibe tudo corretamente nos testes, mas na realidade o tempo às vezes é diferente até mesmo por várias horas. Por que é assim?

Use oCopyTime, também notei este problema ao construir objetos gráficos e oCopyTime resolveu o problema

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

Use oCopyTime, também notei este problema ao construir objetos gráficos e oCopyTime resolveu o problema

datetime TM[];
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
Obrigado!
 
Evgeny Belyaev:
Esta é a primeira vez que ouço falar deles.
Só preciso de um take flutuante que esteja amarrado a um objeto.
 
Como faço para que a escala do meu indicador tenha 5 casas decimais?

Aqui, o gráfico tem 5 dígitos e o indicador tem 4.
 
igrok333:
Como faço para que a escala do meu indicador mostre 5 casas decimais?

Aqui, o gráfico tem 5 dígitos e o indicador tem 4.
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
Razão: