//+------------------------------------------------------------------+//| 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;
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+//| 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);
}
//+------------------------------------------------------------------+
我刚刚对 "报价档案 "进行了实验。通过单独更新每个图表,几乎所有图表的历史记录都开始正常工作,除了几个异国货币对,我删除并更新了几次--图表没有新数据。总的来说,我们可以说问题已经解决了
谢谢你的效率))))
亲爱的程序员....,我有一个问题...我创建了一个EA....,它正常打开交易(在测试器中)....,但只关闭买入交易....,在完成测试后只关闭卖出交易...这里有一段代码....,你能帮助我吗?
//---------------------------------------------------------------------------------------------------------
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));
预选订单 OrderSelect(Ticket_first_order,SELECT_BY_TICKET)。
如果(OrderOpenPrice()+10*Point==Ask)
OrderSend(Symbol(),OP_BUY,Lot,Ask,10,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,Green) 。
我想这是一个工作分支......哎呀,对不起。
大家晚安!!!。新年快乐!
决定通过文件保存缓冲区数据。创建一个文件并向其写入没有问题,但要从其读出却很难。
这里有一个试用程序。请帮助。问题是,要么有额外的写入文件,要么无法从文件中读取。我只是想从文件中读取一个列表,例如,数组...如果我懒得写,请链接到类似的材料,但我只找到教程...但最好在网站上有一个现成的变体)))。
无论如何都要提前感谢!))。
唉,文件里 有录音就不那么容易了!((()
而这似乎......恰恰相反。
由于有教程中的例子,阅读已经解决了,但记录到文件中需要更复杂的代码。简而言之,我已经被骗了...我不知道如何将记录与 "从文件中读取 "同步移动。
我纠正了日线和历史(初始缓冲数据)的水平设置。
问题是一样的。请给我一个提示,如果写得太多,如何把缓冲区的数据写到文件中。
修改后的程序代码
找到了我的问题的答案......关于文件操作)))。
用于将信息 从文件输出 到图表的脚本。
免费mt4代码的历史,有传输数据到文件的选项,也有反向操作。
谢谢大家,谢谢大家 ciao))))。
有一个大文件,其中的日期是以这种形式 "20141231"。要将字符串转换为日期时间 格式,你需要在年、月和数字之间加上 "YYYY.MM.DD "点。
如何才能做到这一点呢?
大家好,我想让EA找到100条中的最高点或最低点,请问在哪里读?
你可以阅读帮助,这一切都在那里,有例子。