MessageBox
Hàm này tạo và hiển thị một hộp thoại thông báo và quản lý nó. Hộp thoại thông báo chứa nội dung thông báo và tiêu đề, bất kỳ sự kết hợp nào của các ký hiệu và nút lệnh được định nghĩa sẵn.
int MessageBox(
string text, // nội dung thông báo
string caption=NULL, // tiêu đề hộp thoại
int flags=0 // xác định tập hợp các nút trong hộp thoại
);
2
3
4
5
Tham số
text
[truyền vào] Văn bản chứa thông báo cần xuất ra.
caption
=NULL
[truyền vào] Văn bản tùy chọn để hiển thị trong tiêu đề hộp thoại. Nếu tham số này trống, tên của Expert Advisor sẽ được hiển thị trong tiêu đề hộp thoại.
flags
=0
[truyền vào] Các flags
tùy chọn xác định giao diện và hành vi của hộp thoại thông báo. Flags có thể là sự kết hợp của một nhóm flags đặc biệt.
Giá trị trả về
Nếu hàm được thực hiện thành công, giá trị trả về là một trong những mã trả về của MessageBox()
.
Ghi chú
Hàm này không thể được sử dụng trong các chỉ báo tùy chỉnh vì việc gọi MessageBox()
sẽ tạm dừng luồng thực thi trong suốt thời gian chờ phản hồi từ người dùng. Vì tất cả các chỉ báo cho mỗi ký hiệu được thực thi trong một luồng duy nhất, sự tạm dừng này làm cho việc hoạt động của tất cả các biểu đồ trên mọi khung thời gian cho ký hiệu này trở nên không thể.
Hàm MessageBox()
không hoạt động trong Strategy Tester.
Ví dụ:
//+------------------------------------------------------------------+
//| EA hiển thị cửa sổ MessageBox với yêu cầu tiếp tục công việc |
//| khi đạt được số lượng giao dịch thua lỗ liên tiếp đã chỉ định |
//| Chờ số lượng thanh giá đã chỉ định và hiển thị MessageBox |
//| với yêu cầu tiếp tục công việc. |
//| Để kiểm tra, cần mở và đóng thủ công một số vị thế |
//| với lỗ, vì EA không kiểm soát |
//| các "vị thế" của chính nó bằng số ma thuật để đơn giản hóa. |
//+------------------------------------------------------------------+
//--- tham số đầu vào
input uint InpMaxLossDeals = 3; // Số giao dịch thua lỗ tối đa
input uint InpInactivityNumBars = 5; // Số thanh giá không hoạt động của cố vấn
//--- biến toàn cục
bool ExtFirstStart=true; // Cờ khởi động lần đầu
bool ExtFlag=true; // Cờ cho phép EA hoạt động
uint ExtNumLoss; // Số giao dịch thua lỗ liên tiếp
datetime ExtTimeLastLoss; // Thời gian giao dịch cuối cùng đóng vị thế thua lỗ
//+------------------------------------------------------------------+
//| Hàm khởi tạo Expert |
//+------------------------------------------------------------------+
int OnInit()
{
//--- lấy số giao dịch thua lỗ liên tiếp và thời gian giao dịch cuối cùng đóng vị thế
ExtNumLoss=GetNumLosingTradesInRow(ExtTimeLastLoss);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Hàm hủy khởi tạo Expert |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Hàm xử lý tick của Expert |
//+------------------------------------------------------------------+
void OnTick()
{
//--- xác định số thanh giá đã trôi qua kể từ vị thế thua lỗ cuối cùng đóng lại
int bars_remaining=iBarShift(Symbol(),PERIOD_CURRENT,ExtTimeLastLoss);
//--- nếu đây là lần khởi động đầu tiên
if(ExtFirstStart)
{
//--- Nếu số thanh giá đã chỉ định đã trôi qua sau chuỗi vị thế thua lỗ, đặt cờ hoạt động của EA
if(bars_remaining>(int)InpInactivityNumBars)
ExtFlag=true;
ExtFirstStart=false;
}
//--- nếu cờ hoạt động của EA bị tắt
if(!ExtFlag)
{
Comment(StringFormat("Cố vấn đã dừng trong %d thanh giá. Số vị thế thua lỗ: %u, Thời gian thua lỗ cuối: %s",
(InpInactivityNumBars-bars_remaining),ExtNumLoss,TimeToString(ExtTimeLastLoss,TIME_DATE|TIME_MINUTES|TIME_SECONDS)));
//--- nếu số thanh giá đã chỉ định đã trôi qua sau chuỗi vị thế thua lỗ
if(bars_remaining>(int)InpInactivityNumBars)
{
//--- hiển thị cửa sổ MessageBox với văn bản và tiêu đề đã chỉ định
//--- cửa sổ yêu cầu có hai nút Yes/No và biểu tượng dấu hỏi.
//--- nút Yes được chọn mặc định.
string mb_text="Số thanh giá không hoạt động của EA đã trôi qua.\n Tiếp tục công việc của nó?";
string mb_caption="Vui lòng lưu ý";
int mb_id=MessageBox(mb_text,mb_caption,MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON1);
//--- nếu mã trả về từ MessageBox là nút Yes được nhấn, đặt cờ hoạt động của EA
if(mb_id==IDYES)
{
ExtFlag=true;
return;
}
}
//--- cờ hoạt động của EA bị tắt, thoát khỏi OnTick()
return;
}
//--- cờ hoạt động của EA được đặt - EA hoạt động như mã bên dưới cung cấp
Comment(StringFormat("Cố vấn đang hoạt động. Số vị thế thua lỗ: %u, Thời gian thua lỗ cuối: %s, Thanh giá đã trôi qua: %d",
ExtNumLoss,TimeToString(ExtTimeLastLoss,TIME_DATE|TIME_MINUTES|TIME_SECONDS),bars_remaining));
}
//+------------------------------------------------------------------+
//| Hàm xử lý giao dịch |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
const MqlTradeRequest& request,
const MqlTradeResult& result)
{
//--- nếu loại giao dịch là thêm giao dịch vào lịch sử
if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
{
//--- lấy vé giao dịch và chọn giao dịch từ danh sách bằng vé
ulong deal_ticket=trans.deal;
if(HistoryDealSelect(deal_ticket))
{
//--- nếu đây là giao dịch thoát thị trường, lấy số giao dịch thua lỗ liên tiếp và thời gian giao dịch cuối cùng
ENUM_DEAL_ENTRY entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);
if(entry==DEAL_ENTRY_OUT || entry==DEAL_ENTRY_INOUT || entry==DEAL_ENTRY_OUT_BY)
ExtNumLoss=GetNumLosingTradesInRow(ExtTimeLastLoss);
}
}
//--- nếu số giao dịch thua lỗ liên tiếp lớn hơn giá trị đã chỉ định và cờ hoạt động của EA được bật
if(ExtNumLoss>=InpMaxLossDeals && ExtFlag)
{
//--- hiển thị cửa sổ MessageBox với văn bản và tiêu đề đã chỉ định
//--- cửa sổ yêu cầu có hai nút Yes/No và biểu tượng dấu chấm than.
//--- nút No được chọn mặc định.
string mb_text="Số giao dịch thua lỗ đã đạt tối đa đã chỉ định. Cố vấn đã dừng.\n Tiếp tục công việc của nó?";
string mb_caption="Chú ý!";
int mb_id=MessageBox(mb_text,mb_caption,MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2);
//--- nếu mã trả về từ MessageBox là nút No được nhấn, tắt cờ hoạt động của EA
if(mb_id==IDNO)
ExtFlag=false;
}
}
//+------------------------------------------------------------------+
//| Trả về số giao dịch thua lỗ liên tiếp |
//| và thời gian giao dịch cuối cùng đóng vị thế thua lỗ |
//+------------------------------------------------------------------+
uint GetNumLosingTradesInRow(datetime& time_last_deal)
{
//--- chọn toàn bộ lịch sử
if(!HistorySelect(0,TimeCurrent()))
return(0);
//--- lấy vé giao dịch tiếp theo bằng danh sách các giao dịch lịch sử trong vòng lặp
uint res=0;
uint total=HistoryDealsTotal();
for(int i=(int)total-1; i>=0; i--)
{
ulong deal_ticket=HistoryDealGetTicket(i);
if(deal_ticket>0)
{
//--- nếu giao dịch không phải để thoát vị thế, chuyển sang giao dịch tiếp theo
ENUM_DEAL_ENTRY entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);
if(entry!=DEAL_ENTRY_OUT && entry!=DEAL_ENTRY_OUT_BY && entry!=DEAL_ENTRY_INOUT)
continue;
//--- nếu kết quả đóng vị thế có lợi nhuận, ngắt vòng lặp
if(!IsClosePositionWithLoss(deal_ticket))
break;
//--- tăng bộ đếm giao dịch thua lỗ liên tiếp
res++;
//--- ghi thời gian giao dịch tối đa vào biến (tìm giao dịch cuối cùng)
datetime deal_time=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME);
if(deal_time>time_last_deal)
time_last_deal=deal_time;
}
}
//--- trả về số lượng thua lỗ liên tiếp
return(res);
}
//+------------------------------------------------------------------+
//| Trả về cờ đóng vị thế với lỗ |
//+------------------------------------------------------------------+
bool IsClosePositionWithLoss(const ulong deal_ticket)
{
//--- lấy giá trị của các thuộc tính ảnh hưởng đến lợi nhuận từ giao dịch
double profit=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
double comission=HistoryDealGetDouble(deal_ticket,DEAL_COMMISSION);
double swap=HistoryDealGetDouble(deal_ticket,DEAL_SWAP);
double fee=HistoryDealGetDouble(deal_ticket,DEAL_FEE);
//--- trả về cờ chỉ ra rằng tổng giá trị của các thuộc tính nhận được là âm
return(profit+comission+swap+fee<0);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169