Experte10_v1_1

Price Data Components
Series array that contains the lowest prices of each barSeries array that contains the highest prices of each barSeries array that contains close prices for each barSeries array that contains open prices of each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
Experte10_v1_1

extern double Lot = 0.1;
 
extern int StopLoss = 50;
extern int TakeProfit = 150;

extern bool UseTrailing = false;
extern int TrailingStopLoss = 50;
extern int TrailingStep = 25;

extern int MagicNumber = 888;

bool initialized = false;
int MAX_TRAILING_STEP = 15;

int init() {
   double stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   if (StopLoss < stopLevel) {
      Alert("StopLoss óñòàíîâëåí ìåíüøå, ÷åì ðàçðåøåí âàøèì ÄÖ. Ìèíèìàëüíîå çíà÷åíèå: ", stopLevel);
      return(-1);
   }
   if (TakeProfit < stopLevel && !UseTrailing) {
      Alert("TakeProfit óñòàíîâëåí ìåíüøå, ÷åì ðàçðåøåí âàøèì ÄÖ. Ìèíèìàëüíîå çíà÷åíèå: ", stopLevel);
      return(-1);
   }
   double minLot = MarketInfo(Symbol(), MODE_MINLOT);
   if (Lot < minLot) {
      Alert("Lot óñòàíîâëåí ìåíüøå, ÷åì ðàçðåøåí âàøèì ÄÖ. Ìèíèìàëüíîå çíà÷åíèå: ", minLot);
      return(-1);
   }
   double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   if (Lot > maxLot) {
      Alert("Lot óñòàíîâëåí áîëüøå, ÷åì ðàçðåøåí âàøèì ÄÖ. Ìàêñèìàëüíîå çíà÷åíèå: ", maxLot);
      return(-1);
   }
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   for (double i = minLot; i <= maxLot; i+=lotStep) {
      if (i == Lot) {
         break;
      }
      if (i + lotStep > maxLot) {
         Alert("Lot óñòàíîâëåí íåïðàâèëüíûé, øàã ëîòà äëÿ âàøåãî ÄÖ: ", lotStep);
         return(-1);
      }
   }
   if (UseTrailing) {
      if (TrailingStopLoss < stopLevel) {
         Alert("TrailingStopLoss óñòàíîâëåí ìåíüøå, ÷åì ðàçðåøåí âàøèì ÄÖ. Ìèíèìàëüíîå çíà÷åíèå: ", stopLevel);
         return(-1);
      }
      if (TrailingStep < MAX_TRAILING_STEP) {
         Alert("TrailingStep óñòàíîâëåí ìàëåíüêèé, âðÿä ëè ýòî ïîíðàâèòüñÿ âàøåìó ÄÖ. Åñëè íå õîòèòå øòðàôíûõ ñàíêöèé îò ÄÖ ñòàâüòå íå ìåíüøå, ÷åì ", MAX_TRAILING_STEP);
         return(-1);
      }
   }
   initialized = true;
   return(0);
}

int deinit() {
   initialized = false;
   return(0);
}

int start() {
   if (!initialized) {
      // íå ïðîèçîøëà èíèöèàëèçàöèÿ, çíà÷èò óñòàíîâëåííûå âõîäíûå çíà÷åíèÿ ìîãóò íàïîðòà÷èòü, à çíà÷èò âûõîäèì...
      return(0);
   }
   if (DayOfWeek() == 0 || DayOfWeek() == 6) {
      // â âûõîäíûå íå ðàáîòàåì
      return(0);
   }
   if (!IsTradeAllowed()) {
      // ïðîïóñòèì òèê åñëè òåðìèíàë çàíÿò
      return(0);
   }
   
   int ticket;
   int q = 0;
 
   double L = iLow(NULL, NULL, 1);
   double H = iHigh(NULL, NULL, 1);
   double C = iClose(NULL, NULL, 0);
   double O = iOpen(NULL, NULL, 0);
   double spred = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   double sl = StopLoss * Point;
   double tp = TakeProfit * Point;
   
   if (UseTrailing) {
      TrailingPositions(TrailingStopLoss, TrailingStep, MagicNumber);
   }
   
   // Ïðîâåðêà íà ïðîáîé High èëè Low Day (çàùèòà îò ÃÝÏ)
   if  (O >= H || O <= L) {
      Comment("\nÇàùèòà îò ÃÝÏ (ñêà÷åê öåíû íîâîãî äíÿ)\nÍå âîçìîæíî âûñòàâèòü OP_BUYSTOP è OP_SELLSTOP\nÖåíà Open ïðîáèëà High èëè Low ïðåäûäóùåãî äíÿ");
      return (0);
   }
   
   // ïðîâåðÿåì îðäåðà íà îòêðûòèå
   for (q = 0; q < OrdersTotal(); q++) {
      if (OrderSelect(q, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         // ïðîâåðÿåì ïîçèöèè åñëè åñòü îòêðûòûå îðäåðà è ñðàâíèâàåì ïîêàçàòåëè ñ èíäèêàòîðîì
         if (OrderType() == OP_BUYSTOP) {
            return(0);
         } else if (OrderType() == OP_SELLSTOP) {
            return(0);
         }
      }
   }
   
   double stopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL) * Point;
 
   // óñëîâèå íà ORDER BUY
   if (H - C >= stopLevel && C - L >= stopLevel && O < H) {
      double tpReal = 0;
      if (!UseTrailing) {
         tpReal = H + tp + spred * 2;
      }
      ticket = OrderSend(Symbol(), OP_BUYSTOP, Lot, H + spred * 2, 0, H - sl + spred * 2, tpReal, NULL, MagicNumber, iTime(Symbol(), Period(), 0) + Period() * 60);
      ChechAndPrintError(ticket);
   } else {
      Comment("\nÍå âîçìîæíî âûñòàâèòü OP_BUYSTOP\nÖåíà íå ñîîòâåòñòâóåò óñëîâèþ âõîäà â ðûíîê");
   }     
  
   // óñëîâèå íà ORDER SELL
   if (H - C >= stopLevel && C - L >= stopLevel && O > L) {
      tpReal = 0;
      if (!UseTrailing) {
         tpReal = L - spred - tp;
      }
      ticket = OrderSend(Symbol(), OP_SELLSTOP, Lot, L - spred, 0, L - spred + sl, tpReal, NULL, MagicNumber, iTime(Symbol(), Period(), 0) + Period() * 60);
      ChechAndPrintError(ticket);
   } else {
      Comment("\nÍå âîçìîæíî âûñòàâèòü OP_SELLSTOP\nÖåíà íå ñîîòâåòñòâóåò óñëîâèþ âõîäà â ðûíîê");
   }
   
}

void TrailingPositions(int trailingStopLoss, int trailingStep, int magicNumber) {
   double bid = 0;
   double ask = 0;
   for (int i = 0; i < OrdersTotal(); i++) {
      if (!(OrderSelect(i, SELECT_BY_POS)) || OrderSymbol() != Symbol() || OrderMagicNumber() != magicNumber) {
         continue;
      }
      
      bid = MarketInfo(OrderSymbol(), MODE_BID);
      ask = MarketInfo(OrderSymbol(), MODE_ASK);
      
      if (OrderType() == OP_BUY) {
         if (bid - OrderOpenPrice() > trailingStopLoss * Point) {
            if (OrderStopLoss() < bid - (trailingStopLoss + trailingStopLoss - 1) * Point || OrderStopLoss() == 0) {
               OrderModify(OrderTicket(), OrderOpenPrice(), bid - trailingStopLoss * Point, OrderTakeProfit(), OrderExpiration());
            }
         }
      } else if (OrderType() == OP_SELL) {
         if (OrderOpenPrice() - ask > trailingStopLoss * Point) {
            if (OrderStopLoss() > ask + (trailingStopLoss + trailingStep - 1) * Point || OrderStopLoss() == 0) {
               OrderModify(OrderTicket(), OrderOpenPrice(), ask + trailingStopLoss * Point, OrderTakeProfit(), OrderExpiration());
            }
         }
      }
   }
}

void ChechAndPrintError(int result) {
   if (result < 0) {
      int err = GetLastError();
      Print("Expert+10 >> error(", err, ")");
   }
}

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 ---