Полезняшки - PL день/неделя

27 февраля 2022, 09:47
Maxim Kuznetsov
0
32

Скрипт для вывода дневного/недельного профита в файл .csv

//+------------------------------------------------------------------+
//|                                                    DayProfit.mq5 |
//|                                                Maxim A.Kuznetsov |
//|                                          https://www.luxtrade.tk |
//+------------------------------------------------------------------+
#property copyright "Maxim A.Kuznetsov"
#property link      "https://www.luxtrade.tk"
#property version   "1.00"

#property script_show_inputs
input string FILE_NAME="stat.csv";  // Filename:
input bool WEEKLY_STAT=false;       // Weekly?

#include <MT4Orders.mqh>

class DayStat {
public:
   DayStat();
public:
   datetime daytime; // время открытия дня/недели
   double profit;    // суммарный профит
};
DayStat::DayStat() {
   daytime=0;
   profit=0;
}
DayStat *STAT[];  // статитика по дням

DayStat *FindDayStat(datetime time)
{
   for(int i=ArraySize(STAT)-1;i>=0;i--) {
      if (time>=STAT[i].daytime && time<STAT[i].daytime+(WEEKLY_STAT?7*24*60*60:24*60*60)) {
         return STAT[i];
      }
   }   
   int id=ArraySize(STAT);
   ArrayResize(STAT,id+1);
   STAT[id]=new DayStat;
   MqlDateTime dt; TimeToStruct(time,dt);
   dt.hour=dt.min=dt.sec=0;
   STAT[id].daytime=StructToTime(dt);
   if (WEEKLY_STAT) STAT[id].daytime-=dt.day_of_week*24*60*60;
   return STAT[id];
}
int SortDayStat(int &index[])
{
   int total=ArraySize(STAT);
   ArrayResize(index,total);
   for(int i=0;i<total;i++) {
      index[i]=i;   
   }
   for(int i=1;i<total;i++) {
      for(int j=0;j<i;j++) {
         if (STAT[index[i]]==NULL || STAT[index[j]]==NULL) continue;
         if (STAT[index[i]].daytime<STAT[index[j]].daytime) {
            int tmp=index[i];
            index[i]=index[j];
            index[j]=tmp;
         }
      }
   }
   return total;
}
void OnStart()
{
   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--) {
      if (!OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)) {
         Alert("OrderSelect() failed");
         continue;
      }
      int type=OrderType();
      if (type!=OP_BUY && type!=OP_SELL) continue;
      DayStat *stat=FindDayStat(OrderCloseTime());
      stat.profit+=OrderProfit()+OrderSwap()+OrderCommission();
   }
   int index[];
   int total=SortDayStat(index);
   int handle=FileOpen(FILE_NAME,FILE_WRITE|FILE_SHARE_READ|FILE_TXT|FILE_ANSI,',',CP_UTF8);
   if (handle==INVALID_HANDLE) {
      Alert("FileOpen() failed");
      return;
   }
   for(int i=0;i<total;i++) {
      FileWriteString(handle,StringFormat("%s ; %s\n",IntegerToString(STAT[i].daytime),DoubleToString(STAT[i].profit,2)) );      
   }
   FileClose(handle);
   for(int i=ArraySize(STAT)-1;i>=0;i--) {
      delete STAT[i];
   }
}

результат можно загружать в электронные таблицы или отдельно анализировать/строить графики

файл инструкций gnuplot вышеприведённого графика:

set ylabel "Profit"

set xlabel "Date"

set xdata time

set timefmt "%s"

set format x "%m/%d/%Y"

set datafile separator ';'

plot 'stat.csv' using 1:2 with linespoint

pause -1

 Бинарник ex5 и его исходник прилагаю. plt не прикладывается 


Файлы:
DayProfit.ex5  61 kb
DayProfit.mq5  6 kb
Поделитесь с друзьями: