Acabo de experimentar o "arquivo de citações" . atualizando cada gráfico separadamente, o histórico de quase todos os gráficos começou a funcionar corretamente, exceto por alguns pares exóticos, eu os apaguei e atualizei algumas vezes - nenhum dado novo para o gráfico. em geral, podemos dizer que a questão está resolvida
Caros programadores....I tenho um problema... Eucriei um EA.... e ele abre negócios normalmente (no testador) .... mas fecha só compra negócios.... ele só fecha negócios de venda depois de completar o teste... aqui está um pedaço de código.... você pode me ajudar...
Decidiu salvar os dados do buffer através de um arquivo. Não há problema para criar um arquivo e escrever nele, mas é difícil de ler a partir dele.
Aqui está um programa experimental. Por favor, ajude. O problema é que ou há uma escrita extra no arquivo, ou ele não pode ser lido a partir do arquivo. Só quero ler uma lista de um arquivo em, por exemplo, matrizes... Se eu sou preguiçoso demais para escrever, por favor, faça um link para material similar, mas encontrei apenas um tutorial... MAS É MELHOR UMA VARIANTE PRONTA NO SITE)))):
OBRIGADO DE QUALQUER FORMA!!!))
//+------------------------------------------------------------------+//| Proba file.mq4 |//| Copyright 2014, MetaQuotes Software Corp. |//| https://www.mql4.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"https://www.mql4.com"#property version"1.00"#property strict#property indicator_chart_window#property indicator_buffers3#property indicator_color1 Blue
#property indicator_color2 Lime
#property indicator_color3 Red
externint ind=0; //--- выберем случайно номер строкиexternstring СдвигДаты = "30.12.2014 00:00";
externbool ВыключательСдвигаДаты = false;
externbool ЗаписьФайла = true;
//--- глобальные переменныеint Tm,hr,shift,shiftbar,size,InpFileName;
double H_buff[];
double L_buff[];
double C_buff[];
ulong pos[];
double LastHigh,LastLow;
double OPEN,HIGH,LOW,CLOSE;
datetime pr,pr_1;
string T1,T2,T3,T4,file_buffer;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- привязка массива к индикаторному буферу с номером индексаSetIndexBuffer(0,H_buff);
SetIndexBuffer(1,L_buff);
SetIndexBuffer(2,C_buff);
//--- установка значений индикатора, которые не будут видимы на графике
SetIndexEmptyValue(0,EMPTY);
SetIndexEmptyValue(1,EMPTY);
SetIndexEmptyValue(2,EMPTY);
//---- устанавить новый тип, стиль, ширину и цвет для указанной линии индикатора
SetIndexStyle(0,DRAW_LINE,0,1);
SetIndexStyle(1,DRAW_LINE,0,1);
SetIndexStyle(2,DRAW_LINE,1,1);
//---- устанавить формат точности (количество знаков после десятичной точки
IndicatorDigits(Digits);
//---- Устанавливает порядковый номер бара от начала данных, с которого должна начинаться отрисовка указанной линии
SetIndexDrawBegin(0,2);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| 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[])
{
//---- Функия расчета ключевых точек if (ВыключательСдвигаДаты==true)
shiftbar = iBarShift(Symbol(),PERIOD_D1, StrToTime(СдвигДаты), false);
else
shiftbar = 1;
hr=iBarShift(Symbol(),PERIOD_H1,iTime(Symbol(),PERIOD_D1,shiftbar)); // бервый бар дня для прорисовки уровнейif(hr>=8) shift= hr-4;
HIGH= iHigh(Symbol(),PERIOD_H1,shift);
LOW= iLow(Symbol(),PERIOD_H1,shift);
CLOSE= iClose(Symbol(),PERIOD_H1,shift);
//---- Функция проверки баров утренней сессииint limit=iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,shiftbar)); // бервый бар дня для прорисовки уровнейint end=iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,shiftbar-1));
if(Period()==PERIOD_H1 && hr>=8 && (TimeDayOfWeek(Time[0])<6 && TimeDayOfWeek(Time[0])>0))
{
for(int i=limit; i>=end; i--)
{
if (High[i+1]>LastHigh) LastHigh=High[i+1];
if (Low[i+1]<LastLow) LastLow=Low[i+1];
pr = TimeDay(Time[i]);
pr_1 = TimeDay(Time[i+1]);
if (pr!=pr_1)
{
H_buff[i+1] = EMPTY;
L_buff[i+1] = EMPTY;
C_buff[i+1] = EMPTY;
}
//---- Функция прорисовки уровней ZigZag на графике
H_buff[i]=HIGH;
L_buff[i]=LOW;
C_buff[i]=CLOSE;
}
}
//////////////////////////////////////////////// ЭТО БЫЛО ВСТУПЛЕНИЕ ДЛЯ РАБОЧЕГО ПОНИМАНИЯ \\\\\\\\\\\\\\\\\\ //----- Функция открытия и чтения значений из файла ResetLastError();
//--- откроем файлif(ЗаписьФайла==true)
InpFileName=FileOpen(Symbol()+" Z Point.txt",FILE_READ|FILE_TXT);
if(InpFileName!=INVALID_HANDLE)
{
GetStringPositions(InpFileName,pos); //--- получим позицию начала для каждой строки в файле
size=ArraySize(pos); //--- определим сколько всего строк в файле if(!size) //--- если в файле нет строк, то завершаем работуFileClose(InpFileName);
if(FileSeek(InpFileName,pos[ind],SEEK_SET)==true) //--- сдвинем позицию на начало этой строки
{
Print("Текст строки с номером ",ind," ",FileReadString(InpFileName)," size ",size); //--- прочитаем и распечатаем строку с номером ind
file_buffer=FileReadString(InpFileName); // чтение строки из файла
T1=StringSubstr(file_buffer,0,2+Digits); // Извлекаем первые 7 символов
T2=StringSubstr(file_buffer,7,2+Digits); // Извлекаем вторые 7 символов
T3=StringSubstr(file_buffer,14,2+Digits); // Извлекаем третьи 7 символов
T4=StringSubstr(file_buffer,21); // Извлекаем остаток символов
}
FileClose(InpFileName);
}
if(ЗаписьФайла==true) {
Comment("ЗАПИСЬ В ФАЙЛ: IND ",ind," SIZE ",size," T1: ",StrToDouble(T1)," ||| T2: ",StrToDouble(T2)," ||| T3: ",StrToDouble(T3)," ||| shift ",StrToInteger(T4));
if(StrToDouble(T1)!=HIGH && StrToDouble(T2)!=LOW && StrToDouble(T3)!=CLOSE && StrToInteger(T4)!=shift)
WRITEfile(); } elseComment("ЗАПИСЬ ВЫКЛЮЧЕНА !");
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+//| Функция определяет позиции начала для каждой из строк в файле и |//| помещает их в массив arr |//+------------------------------------------------------------------+void GetStringPositions(constint handle,ulong &arr[])
{
int i,def_size=127; //--- размер массива по умолчаниюArrayResize(arr,def_size); //--- выделим память для массиваif(!FileIsEnding(handle)) //--- если не конец файла, то есть хотя бы одна строка
{
arr[i]=FileTell(handle);
i++; //--- счетчик строк
}
elsereturn; // файл пуст, выходим//--- определим сдвиг в байтах в зависимости от кодировкиif(FileGetInteger(handle,FILE_IS_TEXT))
while(!FileIsEnding(handle)) //--- в цикле перебираем строки до конца файла
{
FileReadString(handle); //--- читаем строкуif(!FileIsEnding(handle)) //--- проверка на конец файла
{
arr[i]=FileTell(handle)+1; //--- запомним позицию следующей строки
i++;
if(i==def_size) //--- увеличим размер массива, если он переполнен
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
elsebreak; // конец файла, выходим
}
ArrayResize(arr,i); //--- установим истинный размер массива
}
//+------------------------------------------------------------------+void WRITEfile() // запись в файл и его создание если его нет
{
//--- сбросим код ошибкиResetLastError();
//--- правильный способ работы в "файловой песочнице"
InpFileName=FileOpen(Symbol()+" Z Point.txt",FILE_READ|FILE_WRITE|FILE_TXT); // Имя файлаif(InpFileName!=INVALID_HANDLE)
{
FileSeek(InpFileName,0,SEEK_END);
FileWrite(InpFileName,DoubleToStr(HIGH,Digits),DoubleToStr(LOW,Digits),DoubleToStr(CLOSE,Digits),IntegerToString(shift,0));
FileFlush(InpFileName);
}
FileClose(InpFileName);
return;
}
//+------------------------------------------------------------------+
A leitura é ordenada graças aos exemplos do tutorial, mas a gravação em um arquivo requer um código mais complexo. Em resumo, eu já estou enganado... Não consigo descobrir como mover o registro em sincronia com a leitura do arquivo.
Corrigi o ajuste de níveis para as barras do dia e para o histórico (dados iniciais armazenados em buffer).
A QUESTÃO É A MESMA. POR FAVOR, ME DÊ UMA DICA, SE HOUVER MUITA ESCRITA, SOBRE COMO ESCREVER DADOS BUFFER EM UM ARQUIVO.
CÓDIGO MODIFICADO DO PROGRAMA
//+------------------------------------------------------------------+//| Proba file.mq4 |//| Copyright 2014, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property strict#property indicator_chart_window#property indicator_buffers3#property indicator_color1 Blue
#property indicator_color2 Lime
#property indicator_color3 Red
externint ind=0; //--- выберем случайно номер строкиexternstring СдвигДаты = "06.01.2015 00:00";
externbool ВыключательСдвигаДаты = false;
externbool ЗаписьФайла = true;
//--- глобальные переменныеint Tm,hr,shift,shiftbar,size,sizew,InpFileName,limit,end;
double H_buff[];
double L_buff[];
double C_buff[];
ulong pos[],arrw[];
double LastHigh,LastLow;
double OPEN,HIGH,LOW,CLOSE;
datetime pr,pr_1;
string T1,T2,T3,T4,file_buffer;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- привязка массива к индикаторному буферу с номером индексаSetIndexBuffer(0,H_buff);
SetIndexBuffer(1,L_buff);
SetIndexBuffer(2,C_buff);
//--- установка значений индикатора, которые не будут видимы на графике
SetIndexEmptyValue(0,EMPTY);
SetIndexEmptyValue(1,EMPTY);
SetIndexEmptyValue(2,EMPTY);
//---- устанавить новый тип, стиль, ширину и цвет для указанной линии индикатора
SetIndexStyle(0,DRAW_LINE,0,1);
SetIndexStyle(1,DRAW_LINE,0,1);
SetIndexStyle(2,DRAW_LINE,1,1);
//---- устанавить формат точности (количество знаков после десятичной точки
IndicatorDigits(Digits);
//---- Устанавливает порядковый номер бара от начала данных, с которого должна начинаться отрисовка указанной линии
SetIndexDrawBegin(0,2);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| 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[])
{
//---- Функия расчета ключевых точек if (ВыключательСдвигаДаты==true)
shiftbar = iBarShift(Symbol(),PERIOD_D1, StrToTime(СдвигДаты), false);
else
shiftbar = 0;
hr=iBarShift(Symbol(),PERIOD_H1,iTime(Symbol(),PERIOD_D1,shiftbar)); // бервый бар дня для прорисовки уровнейif(hr>=9) shift= hr-8;
HIGH= iHigh(Symbol(),PERIOD_H1,shift);
LOW= iLow(Symbol(),PERIOD_H1,shift);
CLOSE= iClose(Symbol(),PERIOD_H1,shift);
//---- Функция проверки баров утренней сессииif(ВыключательСдвигаДаты==true)
{
limit=shift;
end=iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,shiftbar))-23;
}
else
{
limit=shift;
end=iBarShift(Symbol(),0,iTime(Symbol(),PERIOD_D1,shiftbar))-hr;
}
if(Period()==PERIOD_H1 && hr>=8 && (TimeDayOfWeek(Time[0])<6 && TimeDayOfWeek(Time[0])>0))
{
for(int u=limit; u>=end; u--)
{
if (High[u+1]>LastHigh) LastHigh=High[u+1];
if (Low[u+1]<LastLow) LastLow=Low[u+1];
pr = TimeDay(Time[u]);
pr_1 = TimeDay(Time[u+1]);
if (pr!=pr_1)
{
H_buff[u+1] = EMPTY;
L_buff[u+1] = EMPTY;
C_buff[u+1] = EMPTY;
}
//---- Функция прорисовки уровней на графике
H_buff[u]=HIGH;
L_buff[u]=LOW;
C_buff[u]=CLOSE;
}
}
///////////////////////////////////////////////////////////////////////// //----- Функция открытия и чтения значений из файла ResetLastError();
//--- откроем файлif(ЗаписьФайла==true)
InpFileName=FileOpen(Symbol()+" Z Point.txt",FILE_READ|FILE_TXT);
if(InpFileName!=INVALID_HANDLE)
{
GetStringPositions(InpFileName,pos); //--- получим позицию начала для каждой строки в файле
size=ArraySize(pos); //--- определим сколько всего строк в файле if(!size) //--- если в файле нет строк, то завершаем работуFileClose(InpFileName);
if(FileSeek(InpFileName,pos[ind],SEEK_SET)==true) //--- сдвинем позицию на начало этой строки
{
Print("Текст строки с номером ",ind," ",FileReadString(InpFileName)," size ",size); //--- прочитаем и распечатаем строку с номером ind
file_buffer=FileReadString(InpFileName); // чтение строки из файла
T1=StringSubstr(file_buffer,0,2+Digits); // Извлекаем первые 7 символов
T2=StringSubstr(file_buffer,7,2+Digits); // Извлекаем вторые 7 символов
T3=StringSubstr(file_buffer,14,2+Digits); // Извлекаем третьи 7 символов
T4=StringSubstr(file_buffer,21); // Извлекаем остаток символов
}
FileClose(InpFileName);
}
if(ЗаписьФайла==true) {
Comment("ЗАПИСЬ В ФАЙЛ: IND ",ind," SIZE ",size," T1: ",StrToDouble(T1)," ||| T2: ",StrToDouble(T2)," ||| T3: ",StrToDouble(T3)," ||| shift ",StrToInteger(T4));
if(StrToDouble(T1)!=HIGH && StrToDouble(T2)!=LOW && StrToDouble(T3)!=CLOSE && StrToInteger(T4)!=shift)
WRITEfile(); } elseComment("ЗАПИСЬ ВЫКЛЮЧЕНА !");
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+//| Функция определяет позиции начала для каждой из строк в файле и |//| помещает их в массив arr |//+------------------------------------------------------------------+void GetStringPositions(constint handle,ulong &arr[])
{
int j,def_size=127; //--- размер массива по умолчаниюArrayResize(arr,def_size); //--- выделим память для массиваif(!FileIsEnding(handle)) //--- если не конец файла, то есть хотя бы одна строка
{
arr[j]=FileTell(handle);
j+=1; //--- счетчик строк
}
elsereturn; // файл пуст, выходим//--- определим сдвиг в байтах в зависимости от кодировки//if(FileGetInteger(handle,FILE_IS_TEXT))while(!FileIsEnding(handle)) //--- в цикле перебираем строки до конца файла
{
FileReadString(handle); //--- читаем строкуif(!FileIsEnding(handle)) //--- проверка на конец файла
{
arr[j]=FileTell(handle)+1; //--- запомним позицию следующей строки
j+=1;
if(j==def_size) //--- увеличим размер массива, если он переполнен
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
elsebreak; // конец файла, выходим
}
ArrayResize(arr,j); //--- установим истинный размер массива
}
//+------------------------------------------------------------------+void WRITEfile() // запись в файл и его создание если его нет
{
InpFileName=FileOpen(Symbol()+" Z Point.txt",FILE_WRITE|FILE_TXT);
if(InpFileName!=INVALID_HANDLE)
{
FileWrite(InpFileName,"Начало файловой записи.Проба");
while(!FileIsEnding(InpFileName)) //--- в цикле перебираем строки до конца файлаFileReadString(InpFileName); //--- читаем строкуFileSeek(InpFileName,0,SEEK_END); // конец файла, пишемFileWrite(InpFileName,DoubleToStr(HIGH,Digits),DoubleToStr(LOW,Digits),DoubleToStr(CLOSE,Digits),IntegerToString(shift,0));
FileFlush(InpFileName);
}
FileClose(InpFileName);
}
//+------------------------------------------------------------------+
Há um grande arquivo com datas neste formulário "20141231". Para converter a string para o formato dedata e hora, você precisa de pontos"YYYY.MM.DD" entre o ano, mês e número.
Acabo de experimentar o "arquivo de citações" . atualizando cada gráfico separadamente, o histórico de quase todos os gráficos começou a funcionar corretamente, exceto por alguns pares exóticos, eu os apaguei e atualizei algumas vezes - nenhum dado novo para o gráfico. em geral, podemos dizer que a questão está resolvida
obrigado pela eficiência))))
Caros programadores....I tenho um problema... Eucriei um EA.... e ele abre negócios normalmente (no testador) .... mas fecha só compra negócios.... ele só fecha negócios de venda depois de completar o teste... aqui está um pedaço de código.... você pode me ajudar...
//---------------------------------------------------------------------------------------------------------
void CloseSell()
{
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol())
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Green);
}
}
}
}
//+------------------------------------------------------------------+
void CloseBuy()
{
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol())
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Green);
}
}
}
}
//+------------------------------------------------------------------+
void OpenSellOrder()
{
mlots = GetLots();
if (AutoSL) sl = CalcSL(OP_SELL);
else sl = ND(Bid - StopLoss*Point);
tp = ND(Bid - TakeProfit*Point);
ticket = OrderSendReliable(Symbol(), OP_SELL, mlots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if(ticket > 0)
OrderModifyReliable(OrderTicket(), OrderOpenPrice(), sl, tp, 0);
}
//+------------------------------------------------------------------+
int OpenBuyOrder()
{
mlots = GetLots();
if (AutoSL) sl = CalcSL(OP_BUY);
else sl = ND(Bid - StopLoss*Point);
tp = ND(Ask + TakeProfit*Point);
ticket = OrderSendReliable(Symbol(), OP_BUY, mlots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if(ticket > 0)
OrderModifyReliable(OrderTicket(), OrderOpenPrice(), sl, tp, 0);
}
//+------------------------------------------------------------------+
void ModifyLoss()
{
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) == true)
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
if (OrderType() == OP_BUY)
{
sl = ND(OrderOpenPrice() + LossPoints*Point);
if (OrderStopLoss() < sl && (Ask - OrderOpenPrice())/Point >= LossLimit)
{
if (sl != ND(OrderStopLoss()))
OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);
}
}
else
if (OrderType() == OP_SELL)
{
sl = ND(OrderOpenPrice() - LossPoints*Point);
if (OrderStopLoss() > sl && (OrderOpenPrice()-Bid)/Point >= LossLimit)
{
if (sl != ND(OrderStopLoss()))
OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);
}
}
}
}
}
//+------------------------------------------------------------------+
double CalcSL(int otype)
{
double sloss = 10000000;
if (otype == OP_BUY)
{
double min;
for (int i=1; i<=SLBars; i++)
{
min = iLow(NULL, 0, i);
if (min < sloss)
sloss = min;
}
sloss = ND(sloss - SLPips*Point);
if ((Ask-sloss)/Point < MinSL)
sloss = ND(Ask - MinSL*Point);
if ((Ask - sloss)/Point > MaxSL)
sloss = ND(Ask - MaxSL*Point);
else
sloss = ND(sloss - SLPips*Point);
return(sloss);
}
else
if (otype == OP_SELL)
{
double max;
sloss = 0;
for (i=1; i<=SLBars; i++)
{
max = iHigh(NULL, 0, i);
if (max > sloss)
sloss = max;
}
if ((sloss - Bid)/Point < MinSL)
sloss = ND(Bid + MinSL*Point);
if ((sloss - Bid)/Point > MaxSL)
sloss = ND(Bid + MaxSL*Point);
else
sloss = ND(sloss + SLPips*Point);
return(sloss);
}
return(0);
}
//+------------------------------------------------------------------+
double GetLots()
{
if (!UseMM) return(FixLot);
double clots;
clots = AccountBalance() / 10000.0 * LotsFor10000;
clots = MathMax(clots, MarketInfo(Symbol(), MODE_MINLOT));
clots = MathMin(clots, MarketInfo(Symbol(), MODE_MAXLOT));
clots = NormalizeDouble(clots, 2);
return (clots);
}
//+------------------------------------------------------------------+
int CountBuy()
{
int count = 0;
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
count++;
}
}
return (count);
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
count++;
}
}
return (count);
}
//+------------------------------------------------------------------+
int CountTrades()
{
return(CountBuy() + CountSell());
}
//+------------------------------------------------------------------+
double ND(double value)
{
return (NormalizeDouble(value, Digits));
Pré-selecionar ordem OrderSelect (Ticket_first_order, SELECT_BY_TICKET);
if(OrderOpenPrice()+10*Point==Ask)
OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green);
Acho que é um ramo de trabalho...oops, desculpe.
Boa noite a todos!!! Feliz Ano Novo!
Decidiu salvar os dados do buffer através de um arquivo. Não há problema para criar um arquivo e escrever nele, mas é difícil de ler a partir dele.
Aqui está um programa experimental. Por favor, ajude. O problema é que ou há uma escrita extra no arquivo, ou ele não pode ser lido a partir do arquivo. Só quero ler uma lista de um arquivo em, por exemplo, matrizes... Se eu sou preguiçoso demais para escrever, por favor, faça um link para material similar, mas encontrei apenas um tutorial... MAS É MELHOR UMA VARIANTE PRONTA NO SITE)))):
OBRIGADO DE QUALQUER FORMA!!!))
Infelizmente, não é tão fácil com a GRAVAÇÃO no arquivo!((
E parecia ... pelo contrário.
A leitura é ordenada graças aos exemplos do tutorial, mas a gravação em um arquivo requer um código mais complexo. Em resumo, eu já estou enganado... Não consigo descobrir como mover o registro em sincronia com a leitura do arquivo.
Corrigi o ajuste de níveis para as barras do dia e para o histórico (dados iniciais armazenados em buffer).
A QUESTÃO É A MESMA. POR FAVOR, ME DÊ UMA DICA, SE HOUVER MUITA ESCRITA, SOBRE COMO ESCREVER DADOS BUFFER EM UM ARQUIVO.
CÓDIGO MODIFICADO DO PROGRAMA
ENCONTRADO ONDE PROCURAR RESPOSTAS ÀS MINHAS PERGUNTAS... SOBRE OPERAÇÕES DE ARQUIVO))))):
SCRIPTS PARA A SAÍDA DE INFORMAÇÕES DE UM ARQUIVO PARA UM GRÁFICO.
HISTÓRICO DE CÓDIGOS MT4 LIVRES, HÁ OPÇÕES DE TRANSFERÊNCIA DE DADOS PARA UM ARQUIVO, BEM COMO A OPERAÇÃO INVERSA.
OBRIGADO A TODOS, A TODOS CIAO)))):
Há um grande arquivo com datas neste formulário "20141231". Para converter a string para o formato dedata e hora, você precisa de pontos"YYYY.MM.DD" entre o ano, mês e número.
Como isso pode ser feito?
Olá a todos, quero que a EA encontre a maior alta ou a menor baixa em 100 barras, aconselha onde ler?
Você pode ler a ajuda, está tudo aí, com exemplos.