Orders Execution
0
Views
0
Downloads
0
Favorites
_donchian2
// ---------------------------------------------------------------------------
// Êëàññè÷åñêèé ñîâåòíèê íà ïðîáîÿõ êàíàëîâ Äîí÷èàíà.
//
// Âõîä ïî ïðîáèòèþ êàíàëà çà 20 äíåé, âûõîä ïî ïðîáèòèþ êàíàëà
// çà 10 äíåé â ïðîòèâîïîëîæíóþ ñòîðîíó.
//
// Ñîâåòíèê ìîæíî òåñòèðîâàòü òîëüêî â ðåæèìå "ïî âñåì òèêàì".
//
// Âåðñèÿ äëÿ forum.mql4.com.
// ---------------------------------------------------------------------------
#property copyright "Azzx, 2010-2012"
#property link "mailto:agapito@rambler.ru"
#include <stderror.mqh>
#include <stdlib.mqh>
// Èíäèêàòîð êàíàëà Äîí÷èàíà.
#define DON_NAME "azzx_donchian_1_0"
#define DON_UPPER 0
#define DON_LOWER 1
#define DON_MIDDLE 2
// Ìàãè÷åñêèé íîìåð ñèñòåìû.
#define MAGIC 100
// Âåëè÷èíà ïðîñêàëüçûâàíèÿ.
#define SLIPPAGE 30
// ---------------------------------------------------------------------------
// Ïàðàìåòðû ñîâåòíèêà.
// ---------------------------------------------------------------------------
extern string _1 =
"<br><b>--- Ïåðèîä êàíàëà Äîí÷èàíà äëÿ âõîäîâ ---</b><br>";
extern int ENTER_CHANNEL = 20;
extern string _2 =
"<br><b>--- Ïåðèîä êàíàëà Äîí÷èàíà äëÿ âûõîäîâ ---</b><br>";
extern int EXIT_CHANNEL = 10;
extern string _3 =
"<br><b>--- Íà÷àëüíàÿ äàòà (âêëþ÷èòåëüíî) ---</b><br>";
extern datetime BEGIN_DATE = D'2006.01.01';
extern string _4 =
"<br><b>--- Êîíå÷íàÿ äàòà (íå âêëþ÷àÿ) ---</b><br>";
extern datetime END_DATE = D'2011.01.01';
// ---------------------------------------------------------------------------
// Ãëîáàëüíûå ïåðåìåííûå.
// ---------------------------------------------------------------------------
// Ñ÷¸ò÷èê îøèáîê.
int error_count = 0;
// Îòñëåæèâàíèå íà÷àëà áàðà.
datetime last_bar = 0;
// Ðåæèì îòñëåæèâàíèÿ ïðîáîåâ.
bool active = false;
// Ãðàíèöû êàíàëà.
double channel_top, channel_bottom;
// ---------------------------------------------------------------------------
// Ãëàâíûé öèêë.
// ---------------------------------------------------------------------------
int start() {
// Ïðèíèìàåì ðåøåíèÿ è ïåðåñ÷èòûâàåì êàíàë
// òîëüêî ïî ñôîðìèðîâàííûì áàðàì.
if(last_bar != Time[0]) {
last_bar = Time[0];
// Çíà÷åíèÿ èíäèêàòîðîâ.
channel_top = iCustom(NULL, 0, DON_NAME, ENTER_CHANNEL, DON_UPPER, 1);
channel_bottom = iCustom(NULL, 0, DON_NAME, ENTER_CHANNEL, DON_LOWER, 1);
}
// Ïåðåìåùåíèå ñòîïîâ.
move_order();
// Îòñëåæèâàíèå ïðîáîåâ.
if(is_allowed_date() == true) {
set_activity_mode();
watch_breakout();
} else {
active = false;
}
// Âûâîäèì ñ÷¸ò÷èê îøèáîê.
Comment("errors: ", error_count);
return(0);
}
// ---------------------------------------------------------------------------
// Âñïîìîãàòåëüíûå ôóíêöèè.
// ---------------------------------------------------------------------------
// Îïðåäåëåíèå òèêåòà îòêðûòîãî îðäåðà.
// Âîçâðàùàåò -1, åñëè îðäåðà íåò.
int get_ticket() {
int i;
for(i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == MAGIC) {
return(OrderTicket());
}
}
return(-1);
}
// Óðîâåíü ñòîïà äëÿ äëèííîé ïîçèöèè.
double long_stoploss() {
return(NormalizeDouble(
iCustom(NULL, 0, DON_NAME, EXIT_CHANNEL, DON_LOWER, 1), Digits));
}
// Óðîâåíü ñòîïà äëÿ êîðîòêîé ïîçèöè.
double short_stoploss() {
return(NormalizeDouble((Ask - Bid) +
iCustom(NULL, 0, DON_NAME, EXIT_CHANNEL, DON_UPPER, 1), Digits));
}
// Ñîïðîâîæäåíèå îðäåðà.
void move_order() {
int error, ticket = get_ticket();
double stoploss;
if(ticket != -1) {
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
if(OrderType() == OP_BUY) {
stoploss = long_stoploss();
} else {
stoploss = short_stoploss();
}
if(stoploss != NormalizeDouble(OrderStopLoss(), Digits)) {
if(OrderModify(ticket, 0, stoploss, 0, 0) == false) {
error = GetLastError();
if(error != ERR_INVALID_STOPS) {
register_error(error, "Îøèáêà ìîäèôèêàöèè îðäåðà");
error_count++;
}
}
}
}
}
// Îòñëåæèâàåì ïðîáîè.
void watch_breakout() {
if(active != true) return;
int ticket = 0;
if(Bid >= channel_top) {
ticket = OrderSend(Symbol(), OP_BUY, 1,
Ask, SLIPPAGE, long_stoploss(), 0, "LONG", MAGIC);
}
if(Bid <= channel_bottom) {
ticket = OrderSend(Symbol(), OP_SELL, 1,
Bid, SLIPPAGE, short_stoploss(), 0, "SHORT", MAGIC);
}
if(ticket == -1) {
register_error(GetLastError(), "Îøèáêà îòêðûòèÿ îðäåðà");
error_count++;
}
}
// Óñëîâèÿ âêëþ÷åíèÿ ðåæèìà îòñëåæèâàíèÿ ïðîáîåâ.
void set_activity_mode() {
active = false;
// Åñëè íåò îòêðûòûõ îðäåðîâ, à öåíà íà ïðåäûäóùåì
// áàðå áûëà âíóòðè êàíàëà. Ýòîò âàðèàíò îõâàòûâàåò
// âñå ñëó÷àè, âêëþ÷àÿ äëèííûå áàðû è ðåçêèå äâèæåíèÿ
// ïðîòèâ îòêðûòîãî îðäåðà.
if(get_ticket() == -1) {
active = (Close[1] < channel_top) && (Close[1] > channel_bottom);
}
}
// Ïðîâåðêà íàõîæäåíèÿ â çàäàííîì äèàïàçîíå äàò.
bool is_allowed_date() {
return((last_bar >= BEGIN_DATE) && (last_bar < END_DATE));
}
// Ðåãèñòðàöèÿ îøèáîê - íà ñàìîì äåëå ïðîñòî çàìåíà îäíîé
// ìîåé áèáëèîòå÷íîé ôóíêöèè.
void register_error(int code, string text) {
Print("*** ERROR: ", code, ", ", text);
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---