Acabo de experimentar con el "archivo de cotizaciones" . al actualizar cada gráfico por separado, el historial de casi todos los gráficos comenzó a funcionar correctamente, excepto para algunos pares exóticos, los borré y actualicé un par de veces - no hay nuevos datos para el gráfico. en general, podemos decir que el problema está resuelto
Estimados programadores....Tengo un problema... Hecreado un EA.... que abre las operaciones normalmente (en el probador) .... pero sólo cierra las operaciones de compra.... sólo cierra las operaciones de venta después de completar la prueba... aquí hay un trozo de código.... pueden ayudarme...
Creo que es una rama de trabajo... oops, lo siento.
¡¡¡Buenas noches a todos!!! ¡Feliz Año Nuevo!
Decidí guardar los datos del buffer a través de un archivo. No hay problema para crear un archivo y escribir en él, pero es difícil leer desde él.
Aquí hay un programa de prueba. Por favor, ayuda. El problema es que, o bien hay una escritura extra en el archivo, o bien no se puede leer del archivo. Sólo quiero leer una lista de un archivo en, por ejemplo, arrays... Si soy demasiado perezoso para escribir por favor enlace a material similar, pero he encontrado sólo tutorial... PERO MEJOR UNA VARIANTE LISTA EN EL SITIO))):
GRACIAS DE ANTEMANO DE TODOS MODOS!!!)
//+------------------------------------------------------------------+//| 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;
}
//+------------------------------------------------------------------+
La lectura está resuelta gracias a los ejemplos del tutorial, pero la GRABACIÓN en un archivo requiere un código más complejo. En resumen, ya estoy engañado... No puedo averiguar cómo mover el registro en sincronía con la lectura del archivo.
He corregido la configuración de los niveles para las barras del día y para el historial (datos iniciales almacenados en el buffer).
LA PREGUNTA ES LA MISMA. POR FAVOR, DAME UNA PISTA, SI HAY DEMASIADA ESCRITURA, SOBRE CÓMO ESCRIBIR LOS DATOS DEL BUFFER A UN ARCHIVO.
CÓDIGO MODIFICADO DEL 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);
}
//+------------------------------------------------------------------+
Hay un archivo grande con fechas de esta forma "20141231". Para convertir la cadena en formatode fecha, se necesitan puntos"AAAA.MM.DD" entre el año, el mes y el número.
Acabo de experimentar con el "archivo de cotizaciones" . al actualizar cada gráfico por separado, el historial de casi todos los gráficos comenzó a funcionar correctamente, excepto para algunos pares exóticos, los borré y actualicé un par de veces - no hay nuevos datos para el gráfico. en general, podemos decir que el problema está resuelto
gracias por la eficiencia))))
Estimados programadores....Tengo un problema... Hecreado un EA.... que abre las operaciones normalmente (en el probador) .... pero sólo cierra las operaciones de compra.... sólo cierra las operaciones de venta después de completar la prueba... aquí hay un trozo de código.... pueden ayudarme...
//---------------------------------------------------------------------------------------------------------
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));
Orden de preselección 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);
Creo que es una rama de trabajo... oops, lo siento.
¡¡¡Buenas noches a todos!!! ¡Feliz Año Nuevo!
Decidí guardar los datos del buffer a través de un archivo. No hay problema para crear un archivo y escribir en él, pero es difícil leer desde él.
Aquí hay un programa de prueba. Por favor, ayuda. El problema es que, o bien hay una escritura extra en el archivo, o bien no se puede leer del archivo. Sólo quiero leer una lista de un archivo en, por ejemplo, arrays... Si soy demasiado perezoso para escribir por favor enlace a material similar, pero he encontrado sólo tutorial... PERO MEJOR UNA VARIANTE LISTA EN EL SITIO))):
GRACIAS DE ANTEMANO DE TODOS MODOS!!!)
Por desgracia, no es tan fácil con la grabación en el archivo!!(((
Y parecía... todo lo contrario.
La lectura está resuelta gracias a los ejemplos del tutorial, pero la GRABACIÓN en un archivo requiere un código más complejo. En resumen, ya estoy engañado... No puedo averiguar cómo mover el registro en sincronía con la lectura del archivo.
He corregido la configuración de los niveles para las barras del día y para el historial (datos iniciales almacenados en el buffer).
LA PREGUNTA ES LA MISMA. POR FAVOR, DAME UNA PISTA, SI HAY DEMASIADA ESCRITURA, SOBRE CÓMO ESCRIBIR LOS DATOS DEL BUFFER A UN ARCHIVO.
CÓDIGO MODIFICADO DEL PROGRAMA
ENCONTRADO DÓNDE BUSCAR RESPUESTAS A MIS PREGUNTAS... SOBRE LAS OPERACIONES CON ARCHIVOS)):
SCRIPTS PARA LA SALIDA DE INFORMACIÓN DE UN ARCHIVO A UN GRÁFICO.
HISTORIA DE LOS CÓDIGOS MT4 GRATIS HAY OPCIONES PARA TRANSFERIR DATOS A UN ARCHIVO, ASÍ COMO LA OPERACIÓN INVERSA.
GRACIAS A TODOS, TODOS CIAO)))):
Hay un archivo grande con fechas de esta forma "20141231". Para convertir la cadena en formatode fecha, se necesitan puntos"AAAA.MM.DD" entre el año, el mes y el número.
¿Cómo se puede hacer esto?
Hola a todos, quiero que el EA encuentre el máximo o el mínimo más alto en 100 barras, ¿me aconsejan dónde leer?
Puedes leer la ayuda, está todo ahí, con ejemplos.