Ow... Boa gente! Ajude, por favor! Estou aprendendo a programar. Sem sua ajuda, é um impasse.
Estou tentando escrever os dados indicadores em um arquivo, para poder usá-los mais tarde para construir um indicador. O indicador é traçado como uma linha baseada na diferença entre o volume de carrapatos positivos e o volume de carrapatos negativos para a barra atual.
Usei a Referência MQL4 para receber informações sobre como fazer o upload de uma matriz de dados para um arquivo. Como resultado, recebi um código cheio de erros. Não consigo entender a essência dos erros e, em geral, não utilizei ou não utilizei corretamente a dica do livro de referência. Alguém pode ajudar?
inputstring InpFileName="111.csv"; // Имя файла inputstring InpDirectoryName="Data"; // Имя каталога datetime Время=0; // Время прошлого бараdouble Bid1;
double Buf_1[];
// double ExtBuffer;long V1; // объем для текущего тика вверхlong V2; // накопленный объем для всех тиков вверх текущего бараlong V3; // объем текущего тика внизlong V4; // накопленный объем для всех тиков вниз для текущего бараlong V5; // отрицательные и положительные iVolume нарастающим итогомvoidOnInit()
{
IndicatorDigits(0);
SetIndexBuffer(0,Buf_1);
//SetIndexBuffer(1,Buf_2);
Bid1=Bid;
V5 = 0;
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
datetime Вр=Time[0]; // Время текущего бараif(Вр>Время) // Если новый бар
{
Время=Вр; // Запомнить// Buf_1[0]=0; // и обнулить последний элемент буфера
}
datetime date_Buf_1; // массив дат индикатора datetime time_Buf_1; // массив времени // --- считаю объем для положительных и отрицательных тиков if(Bid >= Bid1)
{
if(Bid > Bid1) // если тик положительный..
{
V1 = iVolume(NULL, 0, 0); // если повышающий цену тик, то находим его объем
V2 = V1 + V2;
}
else
{
V1 = 0; // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
V2 = V1 + V2;
}
}
else
{
V3 = iVolume(NULL, 0, 0); // если понижающий цену тик
V4 = V3 + V4; // то находим его объем
}
V5 = V2-V4; // определяем разницу (дельту) между объемами положительных и отрицательных тиков
Bid1=Bid;
Buf_1 [0] = V5; // в буфер сгружаем дельту// ExtBuffer = Buf_1 [0];// double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); // запись в файл данных буфера//--- установим для массивов признак таймсерии ArraySetAsSeries(Buf_1,true);
ArraySetAsSeries(date_Buf_1,true);
//--- скопируем таймсерию int copied=CopyTime(NULL,0,0,0,date_Buf_1);
//--- подготовим массив Buf_1 ArrayResize(Buf_1,copied);
//--- скопируем значения линии индикатора for(int i=0;i<copied;i++)
{
Buf_1[i]= V5;
}
//--- откроем файл для записи значений индикатора ResetLastError();
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Файл %s открыт для записи",InpFileName);
PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
//--- сначала запишем значения индикатора FileWrite(file_handle,Buf_1);
//--- запишем время и значения в файл for(int i=0;i<Buf_1;i++)
FileWrite(file_handle,time_Buf_1[i],Buf_1[i]);
//--- закрываем файл FileClose(file_handle);
PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
}
elsePrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}
return(rates_total);
}
YarTrade: Estou tentando escrever os dados indicadores em um arquivo para que possa usá-los mais tarde para construir o indicador. O indicador é construído como uma linha, com base em dados sobre a diferença entre o volume de ticks positivos e o volume de ticks negativos para a barra atual.
Se você acha que alguém olhando para seu código pode encontrar rapidamente um erro, você está enganado. O compilador procura por erros. O texto do programa deve ser formatado - o MetaEditor tem uma ferramenta de estilo para isso. Se você gosta de um estilo diferente - use, por exemplo, o programa AStyle.exe. Depois de estilizar, você verá rapidamente que o programa 1) tem um parêntese de fechamento extra. 2) Variável declarada: datetime date_Buf_1; // matriz de data indicadora - para que esta seja uma matriz, ela deve ser [tamanho] ou [] para uma matriz dinâmica e então o tamanho deve ser definido como ArrayResize que parece. E isso deve ser feito antes de usar uma matriz - veja os posts acima sobre isso. 3) FileOpen(InpDirectoryName+"//"+InpFileName - parece que os bastões devem ser inclinados na outra direção. E é melhor você prescindir de InpDirectoryName+"//" - de qualquer forma você encontrará o arquivo na pasta Arquivos.
on line: int copied=CopyTime(NULL,0,0,0,0,data_Buf_1); o compilador fica furioso, start=end=0 número=0
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...
Não vejo zero, você estragou tudo em algum lugar.
Você tem os mesmos valores em ambas as impressoras?
Porque não há funções de impressão em meu código e estas linhas seguem uma após a outra, portanto, os valores não mudam de forma alguma.
Mas Var dá 0 e Código dá o valor necessário
É assim que eu produzo o valor que está sendo atribuído. Portanto, o código é essencialmente o seguinte:
a=b;
Imprimir (a);
Imprimir (b);
Mas a é igual a zero enquanto b é impresso corretamente
É possível se int a e duplo b>0 e b<1 ao atribuir um valor real a uma variável inteira, a parte fracionária é descartada
Isto é possível se int a e duplo b>0 e b<1 ao atribuir um valor real a uma variável inteira, a parte fracionária é descartada
b é maior do que um muito maior do que um
a é uma matriz de tipo duplo
O problema foi resolvido.
Eu criei a matriz da seguinte maneira:
linha dupla[];
Com esta opção, ao atribuir a linha[0]=x; o elemento nulo ainda parecia estar vazio.
Quando eu escrevi
linha dupla[20];
Tudo está funcionando como deveria. Não entendo por que, no primeiro caso, simplesmente criei uma matriz sem limites; qual é a diferença?
O problema foi resolvido.
Eu criei a matriz da seguinte maneira:
linha dupla[];
Com esta opção, ao atribuir a linha[0]=x; o elemento nulo ainda parecia estar vazio.
Quando eu escrevi
linha dupla[20];
Tudo está funcionando como deveria. Não entendo por que, no primeiro caso, simplesmente criei uma matriz sem limites; qual é a diferença?
Você criou uma matriz dinâmica, enquanto seu tamanho deve ser definido e controlado por você mesmo.
Você criou uma matriz dinâmica, mas você mesmo precisa definir e controlar o tamanho.
Ninguém está respondendo para ajudar? O beco sem saída para mim está exposto aqui:escrita das informações atuais do iVolumeno arquivo?
O código do software é descrito aqui:https://www.mql5.com/ru/forum/160683/page378#comment_6053255
Indicador por dados do arquivo - inseriu esta linha na busca e encontrou
Para recuperar dados de um arquivo, você deve primeiro preenchê-lo.
Ow... Boa gente! Ajude, por favor! Estou aprendendo a programar. Sem sua ajuda, é um impasse.
Estou tentando escrever os dados indicadores em um arquivo, para poder usá-los mais tarde para construir um indicador. O indicador é traçado como uma linha baseada na diferença entre o volume de carrapatos positivos e o volume de carrapatos negativos para a barra atual.
Usei a Referência MQL4 para receber informações sobre como fazer o upload de uma matriz de dados para um arquivo. Como resultado, recebi um código cheio de erros. Não consigo entender a essência dos erros e, em geral, não utilizei ou não utilizei corretamente a dica do livro de referência. Alguém pode ajudar?
Se você acha que alguém olhando para seu código pode encontrar rapidamente um erro, você está enganado. O compilador procura por erros. O texto do programa deve ser formatado - o MetaEditor tem uma ferramenta de estilo para isso. Se você gosta de um estilo diferente - use, por exemplo, o programa AStyle.exe. Depois de estilizar, você verá rapidamente que o programa 1) tem um parêntese de fechamento extra. 2) Variável declarada: datetime date_Buf_1; // matriz de data indicadora - para que esta seja uma matriz, ela deve ser [tamanho] ou [] para uma matriz dinâmica e então o tamanho deve ser definido como ArrayResize que parece. E isso deve ser feito antes de usar uma matriz - veja os posts acima sobre isso. 3) FileOpen(InpDirectoryName+"//"+InpFileName - parece que os bastões devem ser inclinados na outra direção. E é melhor você prescindir de InpDirectoryName+"//" - de qualquer forma você encontrará o arquivo na pasta Arquivos.
on line: int copied=CopyTime(NULL,0,0,0,0,data_Buf_1); o compilador fica furioso, start=end=0 número=0