gryps2/EA-code/TNK/VariableSpreadCSV.mq4

254 lines
18 KiB
MQL4
Raw Permalink Normal View History

2025-05-30 14:58:21 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| VariableSpreadCSV.mq4 |
//| Copyright 2024, TNK/TNK_SYSTEM |
//| https://note.com/tnk_system |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, TNK/TNK_SYSTEM"
#property link "https://note.com/tnk_system"
#property version "1.0" //
#property icon "TNKIcon.ico" // <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>S<EFBFBD>0<EFBFBD><EFBFBD>0
#property strict
#include <stdlib.mqh>
#property description "1. TDSn0 Y<>R<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0o00S_EA<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0Y0<59>0S0h0g0<08>,ng0M0~0Y0"
#property description "2. <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0k0<6B>0<EFBFBD>0<EFBFBD>0Y0<59>0S0h0g00<>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<08>,n<>0L<30>H0~0Y0"
#property description "3. <08>,nW0_0<5F>0<EFBFBD>0<EFBFBD>0o00csv<00>Q<EFBFBD>R<EFBFBD>0L<30>D0~0Y0<08>XSMOo0pips <09>"
#property description "4. <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0g0<z<>PBf<42><66><EFBFBD>0eQ<65>RY0<59>0S0h0g00c<>[Bf<42><66>n00n0<08>,n<>0<EFBFBD>S<EFBFBD><53>g0Y0"
#property description "5. S_<53>0<EFBFBD>0<EFBFBD>0o0EAg0Y0n0g00Experts<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>Qk0M<30>nW0f0O0`0U0D0"
// <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
extern int StartHour = 0; // <EFBFBD><EFBFBD><EFBFBD>YBf;R
extern int StartMinute = 0; // <EFBFBD><EFBFBD><EFBFBD>YR
extern int EndHour = 0; // B}<EFBFBD>NBf;R
extern int EndMinute = 0; // B}<EFBFBD>NR
//+------------------------------------------------------------------+
//| <EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0 |
//+------------------------------------------------------------------+
// <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>,n(u
double myPoint;
double MeasureSpread, SpreadMin = 1000, SpreadMax = 0, SpreadSum = 0, SpreadAve = 0;
double SpreadMin1 = 100, SpreadMax1 = 0, SpreadSum1 = 0, SpreadAve1 = 0;
int TickCount = 0, TickCount1 = 0;
datetime lastBars;
// <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>Q<EFBFBD>R(u
string Timeframe = (Period() == 1? "M1": Period() == 5? "M5": Period() == 15? "M15": Period() == 30? "M30":
Period() == 60? "H1": Period() == 240? "H4": Period() == 1440? "D1": Period() == 10080? "W1": "MN1");
string filename;
int filehandle;
bool StartWriting = false;
// DPI<EFBFBD>c<EFBFBD>{
double DPIAdjust;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//+------------------------------------------------------------------+
// AhT<EFBFBD>0[0
myPoint = Point;
if (Digits % 2 == 1) myPoint *= 10;
//+------------------------------------------------------------------+
// <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0Rg<EFBFBD>Qt
filename = "Spread_" + Symbol() + "_" + Timeframe + "_" + TimeToStr(iTime(NULL, 0, 1),TIME_DATE) + "~.csv";
filehandle = FileOpen(filename, FILE_CSV|FILE_WRITE|FILE_READ, ",");
//+------------------------------------------------------------------+
// CSV<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>fM0<EFBFBD><EFBFBD><EFBFBD>0
if (FileTell(filehandle) == 0)
{
FileWrite(filehandle, "<00>e<EFBFBD>N", "Bf;R", "g'Y", "g\", "s^GW", "<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0");
//FileWrite(filehandle, "Date", "Time","Max", "Minimum", "Average", "Volume");
FileClose(filehandle);
}
//+------------------------------------------------------------------+
// DPI<EFBFBD>c<EFBFBD>{
double USERdpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI);
double DevPCdpi = 144;
DPIAdjust = USERdpi / DevPCdpi;
//+------------------------------------------------------------------+
// <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0Rg
PipsObject();
//+------------------------------------------------------------------+
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if (!IsTesting())
{
ObjectsDeleteAll();
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
void OnTick()
{
if (isTime())
{
TickCount++;
MeasureSpread = (Ask - Bid) / myPoint;
SpreadSum += MeasureSpread;
SpreadMin = SpreadMin == 0 ? SpreadMin = MeasureSpread : SpreadMin;
if (TickCount > 0 && SpreadSum > 0) SpreadAve = SpreadSum / TickCount;
if (SpreadMax < MeasureSpread) SpreadMax = MeasureSpread;
if (SpreadMin > MeasureSpread) SpreadMin = MeasureSpread;
if (lastBars != Time[0])
{
lastBars = Time[0];
//<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>f<EFBFBD><EFBFBD>0
if (StartWriting) // <EFBFBD>N<EFBFBD>V<EFBFBD>v<EFBFBD>NM<EFBFBD>o0<EFBFBD>f<EFBFBD><EFBFBD>0
{
FileWriting();
if (!IsTesting()) {PipsObject();}
SpreadSum = 0;
TickCount = 0;
SpreadMax = 0;
SpreadMin = 0;
}
if (!StartWriting) // R<EFBFBD>Vo0<EFBFBD>fM0<EFBFBD><EFBFBD>0[0Z0k0B}<EFBFBD>N
{
StartWriting = true;
SpreadSum = 0;
TickCount = 0;
SpreadMax = 0;
SpreadMin = 0;
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| <EFBFBD>f<EFBFBD><EFBFBD>0<EFBFBD>Qt |
//+------------------------------------------------------------------+
void FileWriting()
{
for(int i = 0; i < 3000; i++)
{
FileClose(filehandle); // <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0L0<EFBFBD><EFBFBD>M0c0q0j0W0g0<EFBFBD><EFBFBD>Q0j0D0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>02<EFBFBD>P0
filehandle = FileOpen(filename, FILE_READ|FILE_WRITE|FILE_CSV, ',');// <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0(csv)01YWe;b<EFBFBD>0$Po0-1
if (filehandle != INVALID_HANDLE)
{
FileSeek(filehandle, 0, SEEK_END); // <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0+g>\k0<EFBFBD>y<EFBFBD>R
FileWrite(filehandle, TimeToStr(iTime(NULL, 0, 1),TIME_DATE), TimeToStr(iTime(NULL, 0, 1),TIME_MINUTES),
DoubleToStr(SpreadMax, 1), DoubleToStr(SpreadMin, 1), DoubleToStr(SpreadAve, 2), TickCount);
FileClose(filehandle);
break;
}
}
if (filehandle == -1) Print("Error=", GetLastError(), " <00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<6E>f<EFBFBD><66>0<7F>Qtk01YWeW0~0W0_0");
//if (filehandle == -1) Print("Error=", GetLastError(), " Failed to write file");
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| <EFBFBD>f<EFBFBD><EFBFBD>0n0Bf<EFBFBD><EFBFBD>6R<EFBFBD>_ |
//+------------------------------------------------------------------+
bool isTime()
{
bool result = false;
if (StartHour == EndHour) {
if (StartMinute >= EndMinute) { // 23+ hour interval
if (Hour() != StartHour) {
result = true;
}
else {
if (Minute() >= StartMinute || Minute() < EndMinute) {
result = true;
}
}
}
}
else if (StartHour < EndHour) {
if (Hour() == StartHour) {
if (Minute() >= StartMinute) {
result = true;
}
}
else if (Hour() == EndHour) {
if (Minute() < EndMinute) {
result = true;
}
}
else if (Hour() > StartHour && Hour() < EndHour) {
result = true;
}
}
else { // StartHour > EndHour
if (Hour() == StartHour) {
if (Minute() >= StartMinute) {
result = true;
}
}
else if (Hour() == EndHour) {
if (Minute() < EndMinute) {
result = true;
}
}
else if (Hour() > StartHour || Hour() < EndHour) {
result = true;
}
}
return (result);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD><EFBFBD>k0<EFBFBD>,n<EFBFBD>0<EFBFBD>0<EFBFBD>0h<EFBFBD>:y |
//+------------------------------------------------------------------+
void PipsObject()
{
// 1:00<EFBFBD>0<EFBFBD>0<EFBFBD>naW0j0D04XT
string Data1 = "[Spread log (pips)]";
string Data2 = TimeToStr(iTime(NULL, 0, 1),TIME_DATE);
string Data3 = TimeToStr(iTime(NULL, 0, 1),TIME_MINUTES);
string Data4 = DoubleToStr(SpreadMax,1) + " [Max]";
string Data5 = SpreadMin==1000? "--- [Min]" : DoubleToStr(SpreadMin,1) + " [Min]";
string Data6 = DoubleToStr(SpreadAve,2) + " [Average]";
string Data7 = (string)TickCount + " [Volume]";
label("SP1", Data1, 4, 112, 8, clrWhite);
label("SP2", Data2, 4, 94, 8, clrWhite);
label("SP3", Data3, 4, 76, 8, clrWhite);
label("SP4", Data4, 4, 58, 8, clrWhite);
label("SP5", Data5, 4, 40, 8, clrWhite);
label("SP6", Data6, 4, 22, 8, clrWhite);
label("SP7", Data7, 4, 4, 8, clrWhite);
}
//+------------------------------------------------------------------+
void label(string name, string label_text, int pos_x, int pos_y, int s, color clr= clrBlack)
{
pos_x = (int)NormalizeDouble(pos_x * DPIAdjust, 0); // %R<EFBFBD>DPI<EFBFBD>c<EFBFBD>{<EFBFBD>0<EFBFBD>0<EFBFBD>0g0<EFBFBD><EFBFBD>te
pos_y = (int)NormalizeDouble(pos_y * DPIAdjust, 0); // %R<EFBFBD>DPI<EFBFBD>c<EFBFBD>{<EFBFBD>0<EFBFBD>0<EFBFBD>0g0<EFBFBD><EFBFBD>te
ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
ObjectSetString (0, name, OBJPROP_TEXT, label_text);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, s);
ObjectSetString (0, name, OBJPROP_FONT, "Segoe UI");
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, pos_x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, pos_y);
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
ObjectSetInteger(0, name, OBJPROP_BACK, true);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
}
//+------------------------------------------------------------------+