class CScheduler
Класс графической панели-расписания для управления автоматической торговлей.
Сообщите нам, если считаете, что материал размещён без разрешения.
Обращение по товару «autotrading scheduler.mqh» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
Библиотека MQL4, предоставляющая графическую панель для планирования включения и отключения автоматической торговли на графике. Панель содержит поля ввода времени для каждого дня недели, переключатель состояния, группу радио-кнопок выбора типа времени (локальное или серверное) и флажок попытки закрытия всех позиций перед отключением.
Пользователь задаёт разрешённые интервалы времени через редактируемые поля для каждого дня. Внутренний таймер периодически проверяет текущее время по выбранному типу и при необходимости включает или отключает автоматическую торговлю. При срабатывании условия отключения и соответствующем флажке библиотека пытается закрыть все открытые позиции.
Настройки панели сохраняются в текстовый файл на диске и загружаются при инициализации. Имя файла формируется на основе идентификатора графика. Панель поддерживает свёртывание и развёртывание, а также удаление дублирующих экземпляров на графике.
Классов: 1 · методов: 10 · конструкторов: 1 · деструкторов: 0 · отдельных функций: 1
class CScheduler
Класс графической панели-расписания для управления автоматической торговлей.
int GetAncestor(int, int)
Вспомогательная функция-обёртка для вызова Windows API GetAncestor.
CScheduler(void)
Конструктор класса, инициализирующий имя файла настроек и внутренние переменные.
bool Create(const long chart, const string name, const int subwin, const int x1, const int y1)
Создаёт графическую панель с элементами управления на указанном графике.
void Destroy()
Уничтожает панель и освобождает связанные ресурсы.
bool SaveSettingsOnDisk()
Сохраняет текущие настройки панели в текстовый файл на диске.
bool LoadSettingsFromDisk()
Загружает настройки панели из текстового файла на диске.
bool DeleteSettingsFile()
Удаляет файл настроек с диска.
bool OnEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
Обрабатывает события элементов панели (нажатия, изменение значений и т. д.).
bool RefreshValues()
Обновляет отображаемые значения состояния панели.
void RefreshPanelControls()
Обновляет элементы управления панели в соответствии с текущими настройками.
void CheckTimer()
Проверяет текущее время и при необходимости переключает автоматическую торговлю.
void HideShowMaximize(bool max)
Скрывает, показывает или развёртывает панель, запоминая её позицию.
#include "Defines.mqh"
#include <WinUser32.mqh>
#import "user32.dll"
int GetAncestor(int, int);
#import
class CScheduler : public CAppDialog
{
private:
CButton m_BtnSwitch, m_BtnSetToAll;
CLabel m_LblStatus, m_LblTurnedOn, m_LblURL, m_LblAllow, m_LblExample, m_LblMonday, m_LblTuesday, m_LblWednesday, m_LblThursday, m_LblFriday, m_LblSaturday, m_LblSunday;
CCheckBox m_ChkClosePos;
CEdit m_EdtMonday, m_EdtTuesday, m_EdtWednesday, m_EdtThursday, m_EdtFriday, m_EdtSaturday, m_EdtSunday;
CRadioGroup m_RgpTimeType;
string m_FileName;
bool IsANeedToContinueClosingTrades;
double m_DPIScale;
bool NoPanelMaximization; // Crutch variable to prevent panel maximization when Maximize() is called at the indicator's initialization.
int Mon_Hours[], Mon_Minutes[], Tue_Hours[], Tue_Minutes[], Wed_Hours[], Wed_Minutes[], Thu_Hours[], Thu_Minutes[], Fri_Hours[], Fri_Minutes[], Sat_Hours[], Sat_Minutes[], Sun_Hours[], Sun_Minutes[];
public:
CScheduler(void);
virtual bool Create(const long chart, const string name, const int subwin, const int x1, const int y1);
virtual void Destroy();
virtual bool SaveSettingsOnDisk();
virtual bool LoadSettingsFromDisk();
virtual bool DeleteSettingsFile();
virtual bool OnEvent(const int id, const long& lparam, const double& dparam, const string& sparam);
virtual bool RefreshValues();
virtual void RefreshPanelControls();
void CheckTimer();
virtual void HideShowMaximize(bool max);
int remember_top, remember_left;
private:
virtual bool CreateObjects();
virtual bool InitObjects();
virtual void MoveAndResize();
virtual bool ButtonCreate (CButton& Btn, const int X1, const int Y1, const int X2, const int Y2, const string Name, const string Text);
virtual bool CheckBoxCreate (CCheckBox& Chk, const int X1, const int Y1, const int X2, const int Y2, const string Name, const string Text);
virtual bool EditCreate (CEdit& Edt, const int X1, const int Y1, const int X2, const int Y2, const string Name, const string Text);
virtual bool LabelCreate (CLabel& Lbl, const int X1, const int Y1, const int X2, const int Y2, const string Name, const string Text);
virtual bool RadioGroupCreate (CRadioGroup& Rgp, const int X1, const int Y1, const int X2, const int Y2, const string Name, const string &Text[]);
virtual void Maximize();
virtual void Minimize();
virtual void SeekAndDestroyDuplicatePanels();
virtual void Check_Status();
void EditDay(int &_hours[], int &_minutes[], CEdit &edt, string &sets_value);
virtual void Close_All_Trades();
virtual int Eliminate_Current_Trade(const int ticket);
bool CompareTime(int &_hours[], int &_minutes[], const int hour, const int minute);
void Toggle_AutoTrading();
void OnChangeChkClosePos();
void OnChangeRgpTimeType();
void OnEndEditEdtMonday();
void OnEndEditEdtTuesday();
void OnEndEditEdtWednesday();
void OnEndEditEdtThursday();
void OnEndEditEdtFriday();
void OnEndEditEdtSaturday();
void OnEndEditEdtSunday();
void OnClickBtnSwitch();
void OnClickBtnSetToAll();
void RefreshConditions(const bool SettingsCheckBoxValue, const double SettingsEditValue, CCheckBox& CheckBox, CEdit& Edit, const int decimal_places);
};
EVENT_MAP_BEGIN(CScheduler)
ON_EVENT(ON_CHANGE, m_ChkClosePos, OnChangeChkClosePos)
ON_EVENT(ON_CHANGE, m_RgpTimeType, OnChangeRgpTimeType)
ON_EVENT(ON_END_EDIT, m_EdtMonday, OnEndEditEdtMonday)
ON_EVENT(ON_END_EDIT, m_EdtTuesday, OnEndEditEdtTuesday)
ON_EVENT(ON_END_EDIT, m_EdtWednesday, OnEndEditEdtWednesday)
ON_EVENT(ON_END_EDIT, m_EdtThursday, OnEndEditEdtThursday)
ON_EVENT(ON_END_EDIT, m_EdtFriday, OnEndEditEdtFriday)
ON_EVENT(ON_END_EDIT, m_EdtSaturday, OnEndEditEdtSaturday)
ON_EVENT(ON_END_EDIT, m_EdtSunday, OnEndEditEdtSunday)
ON_EVENT(ON_CLICK, m_BtnSwitch, OnClickBtnSwitch)
ON_EVENT(ON_CLICK, m_BtnSetToAll, OnClickBtnSetToAll)
EVENT_MAP_END(CAppDialog)
CScheduler::CScheduler()
{
m_FileName = "S_" + IntegerToString(ChartID()) + ".txt";
IsANeedToContinueClosingTrades = false;
NoPanelMaximization = false;
remember_left = -1;
remember_top = -1;
}
bool CScheduler::ButtonCreate(CButton &Btn, int X1, int Y1, int X2, int Y2, string Name, string Text)
{
if (!Btn.Create(m_chart_id, m_name + Name, m_subwin, X1, Y1, X2, Y2)) return(false);
if (!Add(Btn)) return(false);
if (!Btn.Text(Text)) return(false);
return(true);
}
bool CScheduler::CheckBoxCreate(CCheckBox &Chk, int X1, int Y1, int X2, int Y2, string Name, string Text)
{
if (!Chk.Create(m_chart_id, m_name + Name, m_subwin, X1, Y1, X2, Y2)) return(false);
if (!Add(Chk)) return(false);
if (!Chk.Text(Text)) return(false);
return(true);
}
bool CScheduler::EditCreate(CEdit &Edt, int X1, int Y1, int X2, int Y2, string Name, string Text)
{
if (!Edt.Create(m_chart_id, m_name + Name, m_subwin, X1, Y1, X2, Y2)) return(false);
if (!Add(Edt)) return(false);
if (!Edt.Text(Text)) return(false);
return(true);
}
bool CScheduler::LabelCreate(CLabel &Lbl, int X1, int Y1, int X2, int Y2, string Name, string Text)
{
if (!Lbl.Create(m_chart_id, m_name + Name, m_subwin, X1, Y1, X2, Y2)) return(false);
if (!Add(Lbl)) return(false);
if (!Lbl.Text(Text)) return(false);
return(true);
}
bool CScheduler::RadioGroupCreate(CRadioGroup &Rgp, int X1, int Y1, int X2, int Y2, string Name, const string &Text[])
{
if (!Rgp.Create(m_chart_id, m_name + Name, m_subwin, X1, Y1, X2, Y2)) return(false);
if (!Add(Rgp)) return(false);
int size = ArraySize(Text);
for (int i = 0; i < size; i++)
{
if (!Rgp.AddItem(Text[i], i)) return(false);
}
return(true);
}
bool CScheduler::Create(const long chart, const string name, const int subwin, const int x1, const int y1)
{
double screen_dpi = (double)TerminalInfoInteger(TERMINAL_SCREEN_DPI);
m_DPIScale = screen_dpi / 96.0;
int x2 = x1 + (int)MathRound(405 * m_DPIScale);
int y2 = y1 + (int)MathRound(355 * m_DPIScale);
if (!CAppDialog::Create(chart, name, subwin, x1, y1, x2, y2)) return(false);
if (!CreateObjects()) return(false);
return(true);
}
void CScheduler::Destroy()
{
m_chart.Detach();
CDialog::Destroy();
}
bool CScheduler::CreateObjects()
{
int row_start = (int)MathRound(10 * m_DPIScale);
int element_height = (int)MathRound(20 * m_DPIScale);
int v_spacing = (int)MathRound(4 * m_DPIScale);
int h_spacing = (int)MathRound(10 * m_DPIScale);
int normal_label_width = (int)MathRound(108 * m_DPIScale);
int normal_edit_width = (int)MathRound(85 * m_DPIScale);
int narrow_label_width = (int)MathRound(85 * m_DPIScale);
int narrowest_edit_width = (int)MathRound(55 * m_DPIScale);
int narrowest_label_width = (int)MathRound(30 * m_DPIScale);
int timer_radio_width = (int)MathRound(100 * m_DPIScale);
int first_column_start = (int)MathRound(5 * m_DPIScale);
int second_column_start = first_column_start + narrowest_label_width;
int third_column_start = second_column_start + (int)MathRound(250 * m_DPIScale);
int panel_end = third_column_start + narrow_label_width;
int y = row_start;
if (!LabelCreate(m_LblTurnedOn, first_column_start, y, first_column_start + narrow_label_width, y + element_height, "m_LblTurnedOn", "Scheduler is OFF.")) return(false);
if (!ButtonCreate(m_BtnSwitch, first_column_start + normal_label_width, y, first_column_start + normal_label_width + normal_edit_width, y + element_height, "m_BtnSwitch", "Switch")) return(false);
string m_RgpTimeType_Text[2] = {"Local time", "Server time"};
if (!RadioGroupCreate(m_RgpTimeType, third_column_start - 2 * h_spacing, y, third_column_start - 2 * h_spacing + timer_radio_width, y + element_height * 2, "m_RgpTimeType", m_RgpTimeType_Text)) return(false);
y += element_height + 4 * v_spacing;
if (!LabelCreate(m_LblStatus, first_column_start, y, first_column_start + normal_label_width, y + element_height, "m_LblStatus", "Status: ")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblAllow, first_column_start, y, first_column_start + panel_end, y + element_height, "m_LblAllow", "Allow trading only during these times:")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblExample, first_column_start, y, first_column_start + panel_end, y + element_height, "m_LblExample", "Example: 12-13, 14:00-16:45, 19:55 - 21")) return(false);
if (!m_LblExample.Color(clrDimGray)) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblMonday, first_column_start, y, first_column_start + narrowest_edit_width, y + element_height, "m_LblMonday", "Mon")) return(false);
if (!EditCreate(m_EdtMonday, second_column_start, y, third_column_start, y + element_height, "m_EdtMonday", "")) return(false);
if (!ButtonCreate(m_BtnSetToAll, third_column_start + h_spacing, y, third_column_start + normal_label_width, y + element_height, "m_BtnSetToAll", "Set to all empty")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblTuesday, first_column_start, y, first_column_start + narrowest_edit_width, y + element_height, "m_LblTuesday", "Tue")) return(false);
if (!EditCreate(m_EdtTuesday, second_column_start, y, third_column_start, y + element_height, "m_EdtTuesday", "")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblWednesday, first_column_start, y, first_column_start + narrowest_edit_width, y + element_height, "m_LblWednesday", "Wed")) return(false);
if (!EditCreate(m_EdtWednesday, second_column_start, y, third_column_start, y + element_height, "m_EdtWednesday", "")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblThursday, first_column_start, y, first_column_start + narrowest_edit_width, y + element_height, "m_LblThursday", "Thu")) return(false);
if (!EditCreate(m_EdtThursday, second_column_start, y, third_column_start, y + element_height, "m_EdtThursday", "")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblFriday, first_column_start, y, first_column_start + narrowest_edit_width, y + element_height, "m_LblFriday", "Fri")) return(false);
if (!EditCreate(m_EdtFriday, second_column_start, y, third_column_start, y + element_height, "m_EdtFriday", "")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblSaturday, first_column_start, y, first_column_start + narrowest_edit_width, y + element_height, "m_LblSaturday", "Sat")) return(false);
if (!EditCreate(m_EdtSaturday, second_column_start, y, third_column_start, y + element_height, "m_EdtSaturday", "")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblSunday, first_column_start, y, first_column_start + narrowest_edit_width, y + element_height, "m_LblSunday", "Sun")) return(false);
if (!EditCreate(m_EdtSunday, second_column_start, y, third_column_start, y + element_height, "m_EdtSunday", "")) return(false);
y += element_height + v_spacing;
if (!CheckBoxCreate(m_ChkClosePos, first_column_start, y, panel_end, y + element_height, "m_ChkClosePos", "Attempt to close all trades before disabling AutoTrading.")) return(false);
y += element_height + v_spacing;
if (!LabelCreate(m_LblURL, first_column_start, y, first_column_start + normal_label_width, y + element_height, "m_LblURL", "www.earnforex.com")) return(false);
if (!m_LblURL.FontSize(8)) return(false);
if (!m_LblURL.Color(clrGreen)) return(false);
SeekAndDestroyDuplicatePanels();
return(true);
}
void CScheduler::Minimize()
{
CAppDialog::Minimize();
if (remember_left != -1) Move(remember_left, remember_top);
}
void CScheduler::Maximize()
{
if (!NoPanelMaximization) CAppDialog::Maximize();
else if (m_minimized) CAppDialog::Minimize();
if (remember_left != -1) Move(remember_left, remember_top);
}
bool CScheduler::RefreshValues()
{
Check_Status();
RefreshPanelControls();
return(true);
}
void CScheduler::RefreshPanelControls()
{
m_RgpTimeType.Value(sets.TimeType);
if (m_EdtMonday.Text() != sets.Monday)
{
m_EdtMonday.Text(sets.Monday);
EditDay(Mon_Hours, Mon_Minutes, m_EdtMonday, sets.Monday);
}
if (m_EdtTuesday.Text() != sets.Tuesday)
{
m_EdtTuesday.Text(sets.Tuesday);
EditDay(Tue_Hours, Tue_Minutes, m_EdtTuesday, sets.Tuesday);
}
if (m_EdtWednesday.Text() != sets.Wednesday)
{
m_EdtWednesday.Text(sets.Wednesday);
EditDay(Wed_Hours, Wed_Minutes, m_EdtWednesday, sets.Wednesday);
}
if (m_EdtThursday.Text() != sets.Thursday)
{
m_EdtThursday.Text(sets.Thursday);
EditDay(Thu_Hours, Thu_Minutes, m_EdtThursday, sets.Thursday);
}
if (m_EdtFriday.Text() != sets.Friday)
{
m_EdtFriday.Text(sets.Friday);
EditDay(Fri_Hours, Fri_Minutes, m_EdtFriday, sets.Friday);
}
if (m_EdtSaturday.Text() != sets.Saturday)
{
m_EdtSaturday.Text(sets.Saturday);
EditDay(Sat_Hours, Sat_Minutes, m_EdtSaturday, sets.Saturday);
}
if (m_EdtSunday.Text() != sets.Sunday)
{
m_EdtSunday.Text(sets.Sunday);
EditDay(Sun_Hours, Sun_Minutes, m_EdtSunday, sets.Sunday);
}
m_ChkClosePos.Checked(sets.ClosePos);
if (sets.TurnedOn) m_LblTurnedOn.Text("Scheduler is ON.");
else m_LblTurnedOn.Text("Scheduler is OFF.");
}
void CScheduler::SeekAndDestroyDuplicatePanels()
{
int ot = ObjectsTotal(ChartID());
for (int i = ot - 1; i >= 0; i--)
{
string object_name = ObjectName(ChartID(), i);
if (ObjectGetInteger(ChartID(), object_name, OBJPROP_TYPE) != OBJ_EDIT) continue;
if (StringSubstr(object_name, StringLen(object_name) - 1Показано первые 50% кода (символов: 23358)
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.