
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Добрый день и всех с прошедшими праздниками!! Не получается записывать данные значений профит,маржа, со всего терминала в мт4 в файл CSV. Пишет час потом сам выключается. Подскажите какой нить скриптик который мог бы писать данные в файл, какие данные записывать может уже получиться прикрутить самостоятельно. Задача такая. Нужно записывать в файл для дальнейшего анализа, такие данные как прибыль чтобы в динамике анализировать.Заранее спасибо.
Если что-то не получается, код в студию и там видно будет где что не так.
по задумке эта штука должна писать спред круглосуточно и профит и баланс но реально пишет только около часа и все
//| writeFile.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
bool isOpenSpread = false;
bool isOpenBalance = false;
bool isOpenProfit = false;
bool checkSpread = false;
bool checkBalance = false;
bool checkProfit = false;
string InpFileNameSpread; // Имя файла
input string InpDirectoryNameSpread="Data"; // Имя каталога спред
string InpFileNameBalance; // Имя файла
string InpFileNameProfit; // Имя файла
input string InpDirectoryNameBalance="Data"; // Имя каталога баланс
input string InpDirectoryNameProfit="Data"; // Имя каталога profit
int file_handle_spread;
int file_handle_balance;
int file_handle_profit;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
InpFileNameBalance = "Balance"+_Symbol+".csv";
InpFileNameSpread = "Spread"+_Symbol+".csv";
InpFileNameProfit = "Profit"+_Symbol+".csv";
ButtonCreate(0,"spread",0,25,25,100,20,CORNER_LEFT_UPPER,"CheckSpread","Arial",10,clrWhite,clrGreen,clrNONE,false,false,false,true,0);
ButtonCreate(0,"balance",0,125,25,100,20,CORNER_LEFT_UPPER,"CheckBalance","Arial",10,clrBlack,clrGold,clrNONE,false,false,false,true,0);
ButtonCreate(0,"profit",0,225,25,100,20,CORNER_LEFT_UPPER,"CheckProfit","Arial",10,clrWhite,clrRed,clrNONE,false,false,false,true,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
ObjectDelete(0,"spread");
ObjectDelete(0,"balance");
ObjectDelete(0,"profit");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- сначала запишем количество сигналов
if(checkSpread && isOpenSpread) FileWrite(file_handle_spread, TimeToString(TimeCurrent(), TIME_DATE), TimeToString(TimeCurrent(), TIME_SECONDS), MarketInfo(_Symbol, MODE_SPREAD));
if(checkBalance && isOpenBalance) FileWrite(file_handle_balance, TimeToString(TimeCurrent(), TIME_DATE), TimeToString(TimeCurrent(), TIME_SECONDS), AccountEquity());
if(checkProfit && isOpenProfit) FileWrite(file_handle_profit, TimeToString(TimeCurrent(), TIME_DATE), TimeToString(TimeCurrent(), TIME_SECONDS), GetProfitOpenPosInCurrency());
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- проверим событие на нажатие кнопки мышки
if(id==CHARTEVENT_OBJECT_CLICK)
{
string clickedChartObject=sparam;
//--- если нажатие на объекте с именем buttonID
if(clickedChartObject=="spread")
{
//--- состояние кнопки - нажата кнопка или нет
bool selected=ObjectGetInteger(0,"spread",OBJPROP_STATE);
int customEventID;
//--- если кнопка нажата
if(selected)
{
file_handle_spread=FileOpen(InpDirectoryNameSpread+"//"+InpFileNameSpread,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle_spread!=INVALID_HANDLE)
{
isOpenSpread = true;
PrintFormat("Запись...",InpFileNameSpread, isOpenSpread);
}
else{
isOpenSpread = false;
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileNameSpread,GetLastError());
}
customEventID=CHARTEVENT_CUSTOM+1;
Alert("Записываем спред");
checkSpread = true;
}
else // кнопка не нажата
{
customEventID=CHARTEVENT_CUSTOM+999;
Alert("Перестали записывать спреад");
FileClose(file_handle_spread);
checkSpread = false;
}
//--- отправим пользовательское событие "своему"графику
EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,"spread");
//--- отправим сообщение всем открытым графикам
//--- отладочное сообщение
Print("Отправлено событие с ID = ",customEventID);
}
if(clickedChartObject=="balance")
{
//--- состояние кнопки - нажата кнопка или нет
bool selected=ObjectGetInteger(0,"balance",OBJPROP_STATE);
int customEventID;
//--- если кнопка нажата
if(selected)
{
file_handle_balance=FileOpen(InpDirectoryNameBalance+"//"+InpFileNameBalance,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle_balance!=INVALID_HANDLE)
{
isOpenBalance = true;
PrintFormat("Запись...",InpFileNameBalance, isOpenBalance);
}
else{
isOpenBalance = false;
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileNameBalance,GetLastError());
}
customEventID=CHARTEVENT_CUSTOM+1;
Alert("Записываем баланс");
checkBalance = true;
}
else // кнопка не нажата
{
customEventID=CHARTEVENT_CUSTOM+999;
Alert("Перестали записывать баланс");
FileClose(file_handle_balance);
checkBalance = false;
}
//--- отправим пользовательское событие "своему"графику
EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,"balance");
//--- отправим сообщение всем открытым графикам
//--- отладочное сообщение
Print("Отправлено событие с ID = ",customEventID);
}
if(clickedChartObject=="profit")
{
//--- состояние кнопки - нажата кнопка или нет
bool selected=ObjectGetInteger(0,"profit",OBJPROP_STATE);
int customEventID;
//--- если кнопка нажата
if(selected)
{
file_handle_profit=FileOpen(InpDirectoryNameProfit+"//"+InpFileNameProfit,FILE_READ|FILE_WRITE|FILE_CSV);
if(file_handle_profit!=INVALID_HANDLE)
{
isOpenProfit = true;
PrintFormat("Запись...",InpFileNameProfit, isOpenProfit);
}
else{
isOpenProfit = false;
PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileNameProfit,GetLastError());
}
customEventID=CHARTEVENT_CUSTOM+1;
Alert("Записываем баланс");
checkProfit = true;
}
else // кнопка не нажата
{
customEventID=CHARTEVENT_CUSTOM+999;
Alert("Перестали записывать баланс");
FileClose(file_handle_profit);
checkProfit = false;
}
//--- отправим пользовательское событие "своему"графику
EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,"profit");
//--- отправим сообщение всем открытым графикам
//--- отладочное сообщение
Print("Отправлено событие с ID = ",customEventID);
}
}
}
//+------------------------------------------------------------------+
//| Создает кнопку |
//+------------------------------------------------------------------+
bool ButtonCreate(const long chart_ID=0, // ID графика
const string name="Button", // имя кнопки
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const int width=50, // ширина кнопки
const int height=18, // высота кнопки
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const string text="Button", // текст
const string font="Arial", // шрифт
const int font_size=10, // размер шрифта
const color clr=clrBlack, // цвет текста
const color back_clr=C'236,233,216', // цвет фона
const color border_clr=clrNONE, // цвет границы
const bool state=false, // нажата/отжата
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим кнопку
if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
{
Print(__FUNCTION__,
": не удалось создать кнопку! Код ошибки = ",GetLastError());
return(false);
}
//--- установим координаты кнопки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим цвет текста
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим цвет фона
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- установим цвет границы
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- переведем кнопку в заданное состояние
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- включим (true) или отключим (false) режим перемещения кнопки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| Get current profit |
//+------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
double p = 0;
int i, k=OrdersTotal();
for (i = 0; i < k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == _Symbol) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
p += OrderProfit() + OrderCommission() + OrderSwap();
}
}
}
}
return(p);
}
Надо после открытия файла перевести указатель в конец файла. Иначе записываться новые строки будут поверх имеющихся.
ну получается лучше файл не открывать,а только копировать проводить анализ,а оригинал пусть дальше пишеться новыми данными
Вариантов масса. Использовать флаги совместного чтения и совместной записи, принудительного сбрасывания данных на диск, периодического закрытия и последующего открытия файла. Но всегда после открытия файла для записи следующей порции данных надо переводить указатель в конец файла.
Не понял. Как файл не открывать? А как в него записывать?
Вариантов масса. Использовать флаги совместного чтения и совместной записи, принудительного сбрасывания данных на диск, периодического закрытия и последующего открытия файла. Но всегда после открытия файла для записи следующей порции данных надо переводить указатель в конец файла.
Доброго времени суток, Алексей. Проблема не в том, что записанные уже данные затираются новыми, а в том, что при успешной записи некоторого кол-ва данных запись прекращается. Без ошибок. Без закрытия файла. Есть возможно какие то мысли как это поправить или хотя-бы почему это происходит. Есть ли лимиты на обьем записываемой информации? Заранее спасибо!
Я сейчас колдовал с CopyTicks(), в примере документации предложено скопировать 100 миллионов тиков. А у меня
Попробуй периодически сбрасывать на диск. Только перед каждым сбросом наверное обязательно перемещать указатель в конец файла.