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 1022

 

Ou deixe-me fazer uma pergunta mais simples:

Na função OnCalculate() um laço é inserido, então ele só passa por uma iteração, a próxima somente quando o gráfico é atualizado....

 
ara66676:

Ou deixe-me fazer uma pergunta mais simples:

Na função OnCalculate() um laço é inserido, então ele só passa por uma iteração, a próxima somente quando o gráfico é atualizado....

Parece que você precisa de um médium ou de um CÓDIGO DE ESTUDO.
 
bistreevseh:
Muito obrigado! Funciona estranhamente eu tenho direitos de administração, especificamente para a pasta do terminal que dei todas as destruições ao proprietário, ajudou, mas depois parou de funcionar. Depois tentou ler o arquivo de log usando o FileReadStrArrayW (se não me engano com o nome) ler as linhas vazias, o script fica pendurado em modo ansi. Somente FileReadCharArr foi capaz de ler os códigos ansi. Talvez você tenha algum exemplo de como analisar o arquivo de registro com sua biblioteca? Eu ficaria muito grato!

Sim, há um problema na leitura do registro agora. Costumava ser mais fácil.

O problema é que o arquivo em si é codificado com ANSI, mas as cordas agora são UNICODE.

Aqui está esse script funciona:

#property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log";
  Print(sPath);
  
  if (!FileCheckW(sPath))
   {
    Print("Файл отсутствует!");
    return;
   }
    
  int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
  if (hFile == NULL)
   {
    Print("Файл не открыт!");
    return;
   }

  string asArray[];
  ArrayResize(asArray, NumLines);
  Print("hFile = ", hFile);
  for (int i = 0; i < NumLines; i++) asArray[i] = string(i) + "                                                                                                                                                                                                                                                          ";
  FileReadStrArrayMW(hFile, asArray, ArraySize(asArray), 0, NumLines);
  FileCloseHandle(hFile);
  for (int i = 0; i < NumLines; i++) Alert(asArray[i]);
 }

Mas só funcionará se o arquivo de registro for salvo em UNICODE primeiro!

Isto é, a biblioteca funciona corretamente. Precisamos pensar em uma maneira simples de converter da codificação ANSI do arquivo para a matriz de strings UNICODE, ou devo adicionar à biblioteca uma função que converta a codificação de strings ao ler o arquivo.

=====================

Opção 1: Você não tem que lidar com matrizes. Leia o arquivo inteiro como ANSI, converta-o em UNICODE e, em seguida, analise-o usando MQL.

Variante 2. Leia-o como ANSI, escreva-o no diretório atual do terminal e leia-o usando as funções MQL para arquivos CSV.

Opção 3. Criar um link simbólico para o arquivo de log na caixa de areia usando a função da mesma biblioteca e lê-lo usando as funções MQL para trabalhar com arquivos CSV:

#property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  sName += ".log";
  
  string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
  string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
  Print(sPathLogs);
  Print(sPathFiles);
  
  if (!FileCheckW(sPathLogs))
   {
    Print("Файл отсутствует!");
    return;
   }
  
  if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
    Print("Символьная ссылка не создана!");
    return;
   }
  
  int hFile = FileOpen(sName, FILE_READ|FILE_CSV|FILE_ANSI, '\t');
  if (hFile == INVALID_HANDLE)
   {
    Print("Файл не открыт!");
    return;
   }
  
  while (!FileIsEnding(hFile)) Alert(FileReadString(hFile));
  FileClose(hFile);
 }

Na minha opinião, esta é a opção mais agradável e mais fácil.

 

Estou tentando escrever um indicador de canal. Calculei os valores para desenho na carta e os coloquei em conjuntos duplos tob[] e tos[], mas quando tento conectá-los ao buffer para desenho na carta - nas linhas 25 e 26:

SetIndexBuffer(0, tob);
SetIndexBuffer(1, tos);

Estas matrizes, ao invés dos valores requeridos, como por exemplo:

0/1.424/1.3679
1/1.42/1.3639

são preenchidos com o número 2147483647, como este:
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

Como isto pode ser curado?

Arquivos anexados:
channel1.mq4  7 kb
 
Há alguma tecla de atalho para alternar rapidamente entre períodos?
Ao pressionar D , H1 muda para M15 , e ao pressionar U , muda para H1.
 

Ajude-me a encontrar um modelo para o MT4 para separar noite e dia.

Digamos que a tabela das 00:00 às 8:00 está em uma cor e das 8:00 às 00:00 está em uma cor diferente.

 

Saudações a todos.

Confrontados com este problema:

Um fragmento de código de robô:

int per=Periodo();
if(per = 60)
{

Imprimir("Se o período não for H1, esta linha não deve estar no log");

Comentário (...);

... // aqui está o corpo do robô

...

...

}

implica que nem o corpo do robô, nem a linha Print(...), nem o Comentário(...) na tela serão executados se um período diferente de H1 estiver habilitado no gráfico.

Entretanto, tudo é executado em qualquer período. Por que ?

Como escrever corretamente, que se o período na tabela não corresponder ao especificado - devolver o controle ao terminal. (A propósito, eu tentei RETURN (0) - não ajuda - ainda imprime tudo...)

 
Dikons:

Saudações a todos.

Confrontados com este problema:

Código do robô snippet:

int per=Periodo();
if(per = 60)
{

Imprimir("Se o período não for H1 - esta linha não deve constar do diário de bordo");

Comentário (...);

... // então o corpo do robô

...

...

}

implica que nem o corpo do robô, nem a string Print(...), nem o Comentário(...) na tela serão executados se um período diferente de H1 estiver habilitado no gráfico.

Entretanto, tudo é executado em qualquer período. Por quê?

Como registrar corretamente isso se o prazo não corresponder ao definido - devolver o controle ao terminal. (A propósito, eu tentei RETURN (0) - não funciona - ainda imprime tudo...)

Você está fazendo uma tarefa, você precisa de comparação se(per == 60)
 
Trader76:
Você está fazendo uma tarefa, enquanto você precisa de comparação se(per == 60)

Obrigado, camarada... Tenho meu cérebro todo cozido... Tive uma pausa significativa na programação - esqueci muito do pouco que sei...

---

Mais uma pergunta... Fragmento de busca por max/mini primeiras 8 horas em um dia por terminal:

int h=TimeHour(TimeCurrent()); // descubra a hora terminal atual (0...23)
if (h<8) return(0); // if no H1 of first 8 candles of day = leave...

double Maxi=Highest[iHighest(NULL,PERÍODO_H1,MODE_HIGH,8,h-7)]; // determinar o máximo das primeiras 8 velas do dia.

double Mini=Low[iLowest(NULL,PERÍODO_H1,MODE_LOW,8,h-7)];


As duas últimas linhas não funcionam corretamente se o período do gráfico for definido para algo diferente de H1. Por quê? Porque ao robô foi explicitamente atribuído um período para os cálculos.

Se você colocar H4 no gráfico, por exemplo, o robô irá reequilibrá-lo usando velas H4 (o mesmo acontece com outros períodos de tempo).

 
Dikons:

Obrigado, camarada... Tenho meu cérebro todo cozido... Tive uma pausa significativa na programação - esqueci muito do pouco que sei...

---

Mais uma pergunta... Fragmento de busca por max/mini primeiras 8 horas em um dia por terminal:

int h=TimeHour(TimeCurrent()); // descubra a hora terminal atual (0...23)
if (h<8) return(0); // if no H1 of first 8 candles of day = leave...

double Maxi=Highest[iHighest(NULL,PERÍODO_H1,MODE_HIGH,8,h-7)]; // definir o máximo das primeiras 8 velas do dia.

double Mini=Low[iLowest(NULL,PERÍODO_H1,MODE_LOW,8,h-7)];


As duas últimas linhas não funcionam corretamente se o período do gráfico for definido para algo diferente de H1. Por quê? Porque ao robô foi explicitamente atribuído um período para os cálculos.

Se você colocar H4 no gráfico, por exemplo, o robô irá reequilibrá-lo usando velas H4 (o mesmo acontece com outros períodos de tempo).

Aqui você obtém o número de barras max/min: iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)

E então você insere, por exemplo, a barra número 2 e obtém:Alto[2] e em outro intervalo de tempo você receberá um valor diferente de H1. Leia sobre a High.

iHigh(NULL,PERÍODO_H1, iHighest(NULL,PERÍODO_H1,MODE_HIGH,8,h-7))