s7_up_bot_1.00

Author: sova75
Price Data Components
Series array that contains the lowest prices of each barSeries array that contains the highest 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 strategyIt Closes Orders by itself
0 Views
0 Downloads
0 Favorites
s7_up_bot_1.00
//+------------------------------------------------------------------+
//|                                                     UP_bot_1.mq4 |
//|                                         Copyright © 2014, sova75 |
//+------------------------------------------------------------------+
#property copyright   "sova75"
#property link        "html://www.mql4.com"
#property version     "1.00"
#property description "òîðãîâëÿ îò óðîâíåé - âõîä íà âòîðîì áàðå"
//--- îáúÿâëåíèå êîíñòàíò
#define BUY 0                    // ñîçäàäèì ïðåäîïðåäåëåííþ ïåðåìåííóþ ñî çíà÷åíèåì 0
#define SEL 1                    // ñîçäàäèì ïðåäîïðåäåëåííþ ïåðåìåííóþ ñî çíà÷åíèåì 1
//--- input parameters
extern string  separator1        ="------ start trade settings ------";
extern int     TakeProfit        =30;        // óðîâåíü TakeProfit
extern int     StopLoss          =0;         // óðîâåíü StopLoss (if 0 then auto)
extern double  HLdivergence      =0.1;       // ìèíèì. îòêëîíåíèå äâóõ ñîñåäíèõ áàðîâ äëÿ âõîäà 
extern double  SpanPrice         =6;         // îòñòóï îò ñòàðòîâîãî óðîâíÿ äëÿ îòêðûòèÿ îðäåðà
extern double  Lots              =0.01;      // ðàçìåð ñòàâêè
extern int     MaxTrades         =1;         // ìàêñ. êîë-âî îäíîâðåìåííî îòêðûòûõ îðäåðîâ
extern int     Slippage          =5;         // ïðîñêàëüçûâàíèå
extern int     MagicNumber       =140804;    // íîìåð ñîâåòíèêà
extern string  separator2        ="------ output settings ------";
extern bool    TrailingStop      =false;     // òðàë ñòîïîâ îòêðûòûõ îðäåðîâ
extern int     TrailStopLoss     =20;        // óðîâåíü òðàëà StopLoss
extern bool    ZeroTrailingStop  =false;     // òðàë ñòîïîâ äî óðîâíÿ ÁÓ
extern double  StepTrailing      =0.5;       // øàã òðàëà ñòîïîâ
extern bool    OutputAtLower     =false;     // âûõîä ïðè ñíèæåíèè íèæå ïðåäûäóùåãî áàðà
extern bool    OutputAtRevers    =false;     // âûõîä ïðè ïåðåâîðîòå òðåíäà
extern double  SpanToRevers      =3;         // îòñòóï îò ðåâåðñèâíîãî óðîâíÿ äëÿ çàêðûòèÿ îðäåðà
//--- ãëîáàëüíûå ïåðåìåííûå
int expertBars;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit() {
//--- ïðîâåðÿåì ðàçðÿäíîñòü
   if(Digits==3 || Digits==5) {
      TakeProfit    *=10;
      StopLoss      *=10;
      Slippage      *=10;
      SpanPrice     *=10;
      HLdivergence  *=10;
      TrailStopLoss *=10;
      StepTrailing  *=10;}
//--- ïåðåâîäèì çíà÷åíèå ïåðåìåííîé HLdivergence â öåíîâóþ ôîðìó
//   if(Digits==2 || Digits==3) {HLdivergence/=1000; SpanPrice/=1000;}
//   else {HLdivergence/=100000; SpanPrice/=100000;}
//--- ïðîâåðÿåì ðàçðåøåííûå óðîâíè TakeProfit, StopLoss
   if (TakeProfit<MarketInfo(_Symbol,MODE_STOPLEVEL) && TakeProfit!=0) {
      Comment("TakeProfit value too small, must be >= "+DoubleToStr(MarketInfo(_Symbol,MODE_STOPLEVEL),0));}
   if (StopLoss<MarketInfo(_Symbol,MODE_STOPLEVEL) && StopLoss!=0) {
      Comment("StopLoss value too small, must be >= "+DoubleToStr(MarketInfo(_Symbol,MODE_STOPLEVEL),0));}
//---
   return;}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
   return;}
//+------------------------------------------------------------------+
//| expert ontick function                                           |
//+------------------------------------------------------------------+
void OnTick() {
//--- åñëè îðäåðîâ íåò, ïðîâåðÿåì óñëîâèÿ äëÿ âõîäà
   if(CountOrders()<MaxTrades)
      if(NextTrade())
         if(StartTrade(BUY)) OpenOrders(BUY);
   if(CountOrders()<MaxTrades)
      if(NextTrade())
         if(StartTrade(SEL)) OpenOrders(SEL);
//--- åñëè îðäåðà åñòü - ïðîâåðÿåì óñëîâèÿ âûõîäà
   if(CountOrders()!=0) {
//--- òðàëèì ñòîïû ðûíî÷íûõ îðäåðîâ
      if(TrailingStop) Trailing();
//--- òðàëèì ñòîïû ðûíî÷íûõ îðäåðîâ äî óðîâíÿ ÁÓ
      if(ZeroTrailingStop) ZeroTrailing();
//--- âûõîäèì ïðè ñíèæåíèè íèæå ïðåäûäóùåãî áàðà
      if(OutputAtLower) OutputAL();
//--- âûõîäèì ïðè ñíèæåíèè iHigh áàðà
      if(OutputAtRevers) OutputAR();}
   return;}
//+------------------------------------------------------------------+
//| îïðåäåëÿåì êîëè÷åñòâî îòêðûòûõ îðäåðîâ ïî ìàãèêó                 |
//+------------------------------------------------------------------+
int CountOrders() {int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber) {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;}}
   return(count);}
//+------------------------------------------------------------------+
//| ïðîâåðÿåì áàð ïîñëåäíåãî îòêðûòîãî îðäåðà                        |
//+------------------------------------------------------------------+
bool NextTrade() {int count=0;
   if(OrdersTotal()==0) return true;
   for(int i=OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
         if(OrderMagicNumber()==MagicNumber) {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
               if(OrderOpenTime()<Time[0])
                  return true;}}}}
   return false;}
//+------------------------------------------------------------------+
//| ïðîâåðÿåì óñëîâèÿ äëÿ âõîäà                                      |
//+------------------------------------------------------------------+
bool StartTrade(int typ) {
//--- ïðîâåðÿåì âîçìîæíîñòü ïîêóïêè
   if(typ==BUY) {
      if(MathAbs(Low[0]-Low[1])<Point*HLdivergence)
         if(Bid-Low[0]>Point*SpanPrice && Bid-Low[0]<Point*SpanPrice*1.5) return true;}
//--- ïðîâåðÿåì âîçìîæíîñòü ïðîäàæè
   if(typ==SEL) {
      if(MathAbs(High[0]-High[1])<Point*HLdivergence)
         if(High[0]-Bid>Point*SpanPrice && High[0]-Bid<Point*SpanPrice*1.5) return true;}
   return false;}
//+------------------------------------------------------------------+
//| îòêðûâàåì îðäåðà ïî òåêóùåé öåíå                                 |
//+------------------------------------------------------------------+
bool OpenOrders(int typ) {
   double price=0,SL=0,TP=0,spread=0;           // îáíóëèì ïåðåìåííûå äëÿ öåíû 
   int p=0,ticket=-1;                           // è ñ÷åò÷èê ïîïûòîê îòêðûòèÿ îðäåðîâ
   if(typ==BUY) {                               // åñëè ìû õîòèì îòêðûòü îðäåð íà ïîêóïêó
      price=NormalizeDouble(Ask,Digits);        // çàïðîñèì öåíó äëÿ åãî îòêðûòèÿ è ñðàçó æå åå íîðìàëèçóåì ïîä 4 èëè 5 çíàêîâ àâòîìàòè÷åñêè
      if (StopLoss>0) SL=NormalizeDouble(Bid-Point*StopLoss,Digits); 
      else SL=NormalizeDouble(Low[0]-Point*HLdivergence,Digits);
      TP=NormalizeDouble(Ask+Point*TakeProfit,Digits);}
   if(typ==SEL) {                               // åñëè ìû õîòèì îòêðûòü îðäåð íà ïîêóïêó
      price=NormalizeDouble(Bid,Digits);        // çàïðîñèì öåíó äëÿ åãî îòêðûòèÿ è ñðàçó æå åå íîðìàëèçóåì ïîä 4 èëè 5 çíàêîâ àâòîìàòè÷åñêè
      spread=MarketInfo(_Symbol,MODE_SPREAD);
      if (StopLoss>0) SL=NormalizeDouble(Ask+Point*StopLoss,Digits);
      else SL=NormalizeDouble(High[0]+Point*HLdivergence+Point*spread,Digits);
      TP=NormalizeDouble(Bid-Point*TakeProfit,Digits);}
   if(IsTradeAllowed())                         // ïðîâåðèì, ñâîáîäåí ëè ïîòîê êîòèðîâîê è ìîæåì ëè ìû îòêðûòü îðäåð     
      while(p<5) {                              // çàïóñòèì öèêë ïîïûòîê îòêðûòèÿ îðäåðà íà 5 ïîïûòîê
         ticket=OrderSend(Symbol(),typ,Lots,price,Slippage,SL,TP,WindowExpertName()+"  "+(string)MagicNumber,MagicNumber,0,clrBlack); 
         if(ticket>=0)                          // åñëè íàø îðäåð îäîáðèëè, çàïîìíèì åãî òèêåò â ïåðåìåííóþ ticket
            return true;                        // âûéäåì èç ôóíêöèè ñ óñïåõîì
         else {                                 // åñëè ñåðâåð íå ïðèíÿë íàø îðäåð
            p++;                                // óâåëè÷èì ñ÷åò÷èê íà 1
            Print("OrderSend çàâåðøèëàñü ñ îøèáêîé #",GetLastError()); // âûâåäåì â æóðíàë èìÿ ôóíêöèè è íîìåð îøèáêè 
            Sleep(500); RefreshRates();}}       // ïîäîæäåì ïîëñåêóíäû è îáíîâèì äàííûå
   return false;}                               // â ñëó÷àå åñëè çà 5 ïîïûòîê îðäåð íå îòêðûëñÿ, âûéäåì èç ôóíêöèè ñ íåóäà÷åé
//+------------------------------------------------------------------+
//| òðàëèì ñòîïû ðûíî÷íûõ îðäåðîâ                                    |
//+------------------------------------------------------------------+
void Trailing() {
   for(int i=0; i<OrdersTotal(); i++) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
         if(OrderType()<=OP_SELL && OrderMagicNumber()==MagicNumber) {
            if(OrderType()==OP_BUY) {
               if(OrderStopLoss()<Bid-Point*TrailStopLoss) {
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailStopLoss,OrderTakeProfit(),0,clrBlue))
                     Print("Îøèáêà ìîäèôèêàöèè Trailing. Êîä îøèáêè=",GetLastError());}}
            else {
               if(OrderStopLoss()>Ask+Point*TrailStopLoss) {
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailStopLoss,OrderTakeProfit(),0,clrRed))
                     Print("Îøèáêà ìîäèôèêàöèè Trailing. Êîä îøèáêè=",GetLastError());}}}
      else Print("OrderSelect() âåðíóë îøèáêó - ",GetLastError());}}
   return;}
//+------------------------------------------------------------------+
//| ïåðåâîäèì â îðäåðà ÁÓ ïî äîñòèæåíèè                              |
//+------------------------------------------------------------------+
void ZeroTrailing() {double SL;
   for(int i=0; i<OrdersTotal(); i++) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
         if(OrderType()<=OP_SELL && OrderMagicNumber()==MagicNumber) {
            if(OrderType()==OP_BUY) {
               if(OrderStopLoss()<OrderOpenPrice()) {
                  if (StopLoss>0) SL=NormalizeDouble(Bid-Point*StopLoss,Digits);
                  else SL=NormalizeDouble(Bid-Point*(SpanPrice+HLdivergence),Digits);
                  if(OrderStopLoss()<SL && SL-OrderStopLoss()>Point*StepTrailing) {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,clrBlue))
                        Print("Îøèáêà ìîäèôèêàöèè ZeroTrailing. Êîä îøèáêè=",GetLastError());}}}
            else {
               if(OrderStopLoss()>OrderOpenPrice()) {
                  if (StopLoss>0) SL=NormalizeDouble(Ask+Point*StopLoss,Digits);
                  else SL=NormalizeDouble(Ask+Point*(SpanPrice+HLdivergence),Digits);
                  if(OrderStopLoss()>SL && OrderStopLoss()-SL>Point*StepTrailing) {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,clrRed))
                        Print("Îøèáêà ìîäèôèêàöèè ZeroTrailing. Êîä îøèáêè=",GetLastError());}}}}
      else Print("OrderSelect() âåðíóë îøèáêó - ",GetLastError());}}
   return;}
//+------------------------------------------------------------------+
//| âûõîäèì ïðè ñíèæåíèè íèæå ïðåäûäóùåãî áàðà                       |
//+------------------------------------------------------------------+
void OutputAL() {
   for(int i=0; i<OrdersTotal(); i++) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
         if(OrderType()<=OP_SELL && OrderMagicNumber()==MagicNumber) {
            if(OrderType()==OP_BUY) {
               if(Bid<iLow(NULL,0,1)) {
                  if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrBlue))
                     Print("Îøèáêà ìîäèôèêàöèè OutputAtLower. Êîä îøèáêè=",GetLastError());}}
            else {
               if(Bid>iHigh(NULL,0,1)) {
                  if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrRed))
                     Print("Îøèáêà ìîäèôèêàöèè OutputAtLower. Êîä îøèáêè=",GetLastError());}}}
      else Print("OrderSelect() âåðíóë îøèáêó - ",GetLastError());}}
   return;}
//+------------------------------------------------------------------+
//| âûõîäèì ïðè ïåðåâîðîòå òðåíäà                                    |
//+------------------------------------------------------------------+
void OutputAR() {
   for(int i=0; i<OrdersTotal(); i++) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
         if(OrderType()<=OP_SELL && OrderMagicNumber() == MagicNumber) {
            if(OrderType()==OP_BUY) {
               if(MathAbs(High[0]-High[1])<Point*HLdivergence) {
                  if(High[0]-Bid>Point*SpanToRevers && High[0]-Bid<Point*SpanToRevers*1.5) {
                     if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrBlue))
                        Print("Îøèáêà ìîäèôèêàöèè OutputAtRevers. Êîä îøèáêè=",GetLastError());}}}
            else {
               if(MathAbs(Low[0]-Low[1])<Point*HLdivergence) {
                  if(Bid-Low[0]>Point*SpanToRevers && Bid-Low[0]<Point*SpanToRevers*1.5) {
                     if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrRed))
                        Print("Îøèáêà ìîäèôèêàöèè OutputAtRevers. Êîä îøèáêè=",GetLastError());}}}}
      else Print("OrderSelect() âåðíóë îøèáêó - ",GetLastError());}}
   return;}
//+------------------------------------------------------------------+

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