Author: Azzx, 2010-2012
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
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 supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---