← К каталогу
Исходный код · ID 4031

autotrading scheduler.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Библиотека MQL4, предоставляющая графическую панель для планирования включения и отключения автоматической торговли на графике. Панель содержит поля ввода времени для каждого дня недели, переключатель состояния, группу радио-кнопок выбора типа времени (локальное или серверное) и флажок попытки закрытия всех позиций перед отключением.

Пользователь задаёт разрешённые интервалы времени через редактируемые поля для каждого дня. Внутренний таймер периодически проверяет текущее время по выбранному типу и при необходимости включает или отключает автоматическую торговлю. При срабатывании условия отключения и соответствующем флажке библиотека пытается закрыть все открытые позиции.

Настройки панели сохраняются в текстовый файл на диске и загружаются при инициализации. Имя файла формируется на основе идентификатора графика. Панель поддерживает свёртывание и развёртывание, а также удаление дублирующих экземпляров на графике.

Состав библиотеки

Классов: 1 · методов: 10 · конструкторов: 1 · деструкторов: 0 · отдельных функций: 1

Классы
Класс class CScheduler

Класс графической панели-расписания для управления автоматической торговлей.

Функции
Функция int GetAncestor(int, int)

Вспомогательная функция-обёртка для вызова Windows API GetAncestor.

Методы и конструкторы
Конструктор · CScheduler CScheduler(void)

Конструктор класса, инициализирующий имя файла настроек и внутренние переменные.

Метод · CScheduler bool Create(const long chart, const string name, const int subwin, const int x1, const int y1)

Создаёт графическую панель с элементами управления на указанном графике.

Метод · CScheduler void Destroy()

Уничтожает панель и освобождает связанные ресурсы.

Метод · CScheduler bool SaveSettingsOnDisk()

Сохраняет текущие настройки панели в текстовый файл на диске.

Метод · CScheduler bool LoadSettingsFromDisk()

Загружает настройки панели из текстового файла на диске.

Метод · CScheduler bool DeleteSettingsFile()

Удаляет файл настроек с диска.

Метод · CScheduler bool OnEvent(const int id, const long& lparam, const double& dparam, const string& sparam)

Обрабатывает события элементов панели (нажатия, изменение значений и т. д.).

Метод · CScheduler bool RefreshValues()

Обновляет отображаемые значения состояния панели.

Метод · CScheduler void RefreshPanelControls()

Обновляет элементы управления панели в соответствии с текущими настройками.

Метод · CScheduler void CheckTimer()

Проверяет текущее время и при необходимости переключает автоматическую торговлю.

Метод · CScheduler 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 и перейдите к оплате.

Стоимость полного кода
2 335,80₽ ≈ $28.55