Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest 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
Indicators Used
MACD HistogramStochastic oscillatorForce indexMovement directional indexLarry William percent range indicatorMoving average indicator
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
elder_v1
//+------------------------------------------------------------------+
//|                       Ñèñòåìà òðåõ ýêðàíîâ Ýëäåðà                |
//|                      Copyright © 2011, GMX[23RUS]                |
//|                        locke_13@rambler.ru                       |
//+------------------------------------------------------------------+

extern double TakeProfit = 0;
extern double LotSize = 0.1;
extern double TrailStop = 30;
extern int StopLoss=55;
extern int MAper=7;
datetime newBar;
int magic=13;
int counterB=0;
int counterS=0;
int count=20;
int MacdPer=PERIOD_H1;
int StPer=PERIOD_M30;
int ThurdP=PERIOD_M5;
int dep;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
{
      ObjectCreate("my", OBJ_LABEL, 0, 0, 0);
      ObjectSet("my", OBJPROP_CORNER, 1);      
      ObjectSet("my", OBJPROP_XDISTANCE, 10 ); 
      ObjectSet("my", OBJPROP_YDISTANCE, 15);
      newBar=iTime(NULL, StPer, 0);
      dep=AccountBalance();
}

int start()
{
   if(Bars<100)
   {
      Print("bars less than 100");
      return(0);  
   }
   datetime bar=iTime(NULL, StPer, 0);
   if (bar==0) Alert("bar=0");
   if (bar!=newBar)            // íîâûé áàð?
   {
      OrdModif();
      Thurd();
      TrailingStop(TrailStop);
      newBar=bar;
      Lot();
   }
   return(0);
}


int MACDsamp()  // ïåðâûé ýêðàí - ÷àñîâîé MACD
{
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int total;

   MacdCurrent=iMACD(NULL,MacdPer,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   MacdPrevious=iMACD(NULL,MacdPer,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
   SignalCurrent=iMACD(NULL,MacdPer,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   SignalPrevious=iMACD(NULL,MacdPer,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2);
   
      // no opened orders identified
      if(AccountFreeMargin()<(1000*LotSize))
      {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
      }
      // åñëè ìàêä ðàñòåò - èùåì ñèãíàë íà ïîêóïêó
      if(MacdPrevious<MacdCurrent)  
      {
            return(1);
      }
      // åñëè ïàäàåò - íà ïðîäàæó
      if( MacdPrevious>MacdCurrent) 
      {
            return(-1);   
      }
      return(0);
}

int Stoch()         // âòîðîé ýêðàí - ñòîõàñòèêà, èíäåêñ ñèëû è ADX - åñëè õîòÿ áû äâîå äàþò ñèãíàë - ñîâåðøàåì ñäåëêó
{
   int ball=0;
   double StCurrent, StPrev;
   StCurrent=iStochastic(NULL, StPer, 6, 2, 1, MODE_EMA, 0, MODE_MAIN, 0);
   StPrev=iStochastic(NULL, StPer, 6, 2, 1, MODE_EMA, 0, MODE_MAIN, 1);
   if (StCurrent>70 && StPrev<70)
   {
      ball++;
   }
   else if (StCurrent>30 && StPrev<30)
   {
      ball--;
   }
 
   double forceCurr, forcePrev, forcePrevPrev;
   forceCurr=iForce(NULL, StPer, 3, MODE_EMA, PRICE_WEIGHTED, 0);
   forcePrev=iForce(NULL, StPer, 3, MODE_EMA, PRICE_WEIGHTED, 1);
   forcePrevPrev=iForce(NULL, StPer, 3, MODE_EMA, PRICE_WEIGHTED, 2);
   if (forceCurr<0 && forceCurr>forcePrev && forcePrevPrev>forcePrev) ball++;
   if (forceCurr>0 && forceCurr<forcePrev && forcePrevPrev<forcePrev) ball--;
   
   double adxMcurr, adxMprev, adxPDI, adxMDI;
   adxMcurr=iADX(NULL, StPer, 13, PRICE_CLOSE, MODE_MAIN, 0);
   adxMprev=iADX(NULL, StPer, 13, PRICE_CLOSE, MODE_MAIN, 1);
   adxPDI=iADX(NULL, StPer, 13, PRICE_CLOSE, MODE_PLUSDI, 0);
   adxMDI=iADX(NULL, StPer, 13, PRICE_CLOSE, MODE_MINUSDI, 0);
   if (adxMcurr>adxMprev)
   {
      if (adxPDI>adxMDI) ball++;
      if (adxPDI<adxMDI) ball--;
   }
   /*
   double willCurr, willPrev;
   willCurr=iWPR(NULL, StPer, 14, 0);
   willCurr=iWPR(NULL, StPer, 14, 1);
   if (willCurr<-30 && willPrev>-30) ball++;
   if (willCurr>-70 && willPrev<-70) ball++;
   */
   
   if (ball>=2) return(1);
   if (ball<=-2) return(-1);
   return(0);
}

int Thurd()                                  // ñîáñòâåííî, òðåòèé ýêðàí - âûñòàâëÿåì îòëîæåííèêè
{                                            // âûøå ïðåäûäóùåãî ìàêñèìóìà èëè íèæå ïðåäûäóùåãî ìèíèìóìà
   int err, total;
   double LastH, LastL, SLB, SLS, prof;
   total=OrdersTotal();
   if(total<1)                               // òîëüêî îäèí îðäåð ìîæåò áûòü îòêðûò îäíîâðåìåííî 
   {
      LastH=iHigh(NULL, ThurdP, 1)+1*Point;        // ìàêñèìóì ïðåäûùóùåãî áàðà, ëèáî
      if (LastH-Ask<10*Point) LastH=Ask+10*Point;  // åñëè îí áëèæå ìèíèìàëüíîé äèñòàíöèè - íà ìèíèìàëüíóþ äèñòàíöèþ 
      LastH=NormalizeDouble(LastH, Digits);
   
      LastL=iLow(NULL, ThurdP, 1)-1*Point;         // ìèíèìóì ïðåäûäóùåãî áàðà, ëèáî
      if (Bid-LastL<10*Point) LastL=Bid-10*Point;  // åñëè îí áëèæå ìèíèìàëüíîé äèñòàíöèè - íà ìèíèìàëüíóþ äèñòàíöèþ
      LastL=NormalizeDouble(LastL,Digits);
   
      SLB=iLow(NULL, ThurdP, iLowest(NULL, ThurdP, MODE_LOW, 30, 1));// ñòîïëîññ äëÿ áàÿ âûñòàâëÿåì íà óðîâíå ìèíèìóìà çà ïîñëåäíèå 30 áàðîâ
      if (SLB>Ask-StopLoss*Point) SLB=Ask-StopLoss*Point;            // íî íå ìåíüøå ðàññòîÿíèÿ StopLoss
   
      SLS=iHigh(NULL, ThurdP, iHighest(NULL, ThurdP, MODE_HIGH, 30, 1)); // äëÿ ñåëëà - àíàëîãè÷íî
      if (SLS<Bid+StopLoss*Point) SLS=Bid+StopLoss*Point;
   
      ObjectSetText("my","MACD="+MACDsamp()+" Stoch="+Stoch(),8,"Arial",Snow);
      if (MACDsamp()+Stoch()==2)
      {
         if (TakeProfit==0) prof=0; else prof=LastH+TakeProfit*Point;
         err=OrderSend(Symbol(), OP_BUYSTOP, LotSize, LastH, 0, SLB, prof, NULL, magic, 0, CLR_NONE);  // âûñòàâëÿåì îòëîæåííèê
         if (err==-1)
         {
            Alert("Îøèáêà îòêðûòèÿ BuyStop ",TxtERROR(0),"  price ", LastH," öåíà  ", Ask," LotSize ", LotSize, "SL=", SLB);
            return(0);
         }
         return(1);
      }
      else if (MACDsamp()+Stoch()==-2)
      {
         if (TakeProfit==0) prof=0; else prof=LastL-TakeProfit*Point;
         err=OrderSend(Symbol(), OP_SELLSTOP, LotSize, LastL, 0, SLS, prof, NULL, magic, 0, CLR_NONE);  // è íà ïðîäàæó
         if (err==-1)
         {
            Alert("Îøèáêà îòêðûòèÿ SellStop ",TxtERROR(0),"  price ",LastL," öåíà ", Bid," prof ", prof, "SL=", SLB);
            return(0);
         }
         return(-1);
      }
   }
   return(0);
}

void OrdModif()              // ôóíêöèÿ ðåäàêòèðîâàíèÿ îòëîæåííûõ îðäåðîâ
{
   int tip,Ticket;
   bool error;
   double StLo,OSL,OOP;
   double LastH, LastL, SLB, SLS;
   LastH=iHigh(NULL, ThurdP, 1)+1*Point;               // áàé ñòîï áóäåì óñòàíàâëèâàòü íà 1 ïîèíò âûøå ìàêñèìóìà ïðåäûäóùåãî áàðà
   if (LastH-Ask<10*Point) LastH=Ask+10*Point;         // åñëè ìàêñèìóì âûøå ìèíèìàëüíîé äèñòàíöèè - âûñòàâëÿåì íà ìèíèìàëüíóþ äèñòàíöèþ
   
   LastL=iLow(NULL, ThurdP, 1)-1*Point;                // ñåëë ñòîï áóäåì óñòàíàâëèâàòü íà 1 ïîèíò íèæå ìèíèìóìà ïðåäûäóùåãî áàðà
   if (Bid-LastL<10*Point) LastL=Bid-10*Point;         // ëèáî, ñîîòâåòñòâåííî íà ìèíèìàëüíóþ äèñòàíöèþ
   
   SLB=iLow(NULL, ThurdP, iLowest(NULL, ThurdP, MODE_LOW, 30, 1));   // ñòîï ëîññ äëÿ áàÿ âûñòàâëÿåì íà óðîâíå ìèíèìóìà çà ïðåäûäóùèå 30 áàðîâ
   if (SLB>Ask-StopLoss*Point) SLB=Ask-(StopLoss*Point);             // ëèáî, ñîîòâåòñòâåííî íà ìèíèìàëüíóþ äèñòàíöèþ
   
   SLS=iHigh(NULL, ThurdP, iHighest(NULL, ThurdP, MODE_HIGH, 30, 1));   // ñòîï ëîññ äëÿ ñåëëà âûñòàâëÿåì íà óðîâíå ìàêñèìóìà çà ïðåäûäóùèå 30 áàðîâ
   if (SLS<Bid+StopLoss*Point) SLS=Bid+StopLoss*Point;                  // ëèáî, ñîîòâåòñòâåííî íà ìèèíèìàëüíóþ äèñòàíöèþ
   
   for (int i=0; i<OrdersTotal(); i++) 
   {  if (OrderSelect(i, SELECT_BY_POS)==true)
      {  tip = OrderType();
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
         {
            OSL   = OrderStopLoss();
            OOP   = OrderOpenPrice();
            //if (LastH<OOP) LastH=OOP;
            //if (LastL>OOP) LastL=OOP;
            Ticket = OrderTicket();
            if (tip==OP_BUYSTOP && LastH<OOP)             
            {
               if (counterB<count)
               {
               
                  counterB++;
                  error=OrderModify(Ticket,NormalizeDouble(LastH, Digits),SLB,OrderTakeProfit(),0,White);    // åñëè îðäåð íå îòêðûëñÿ ïîäâèãàåì åãî âíèç íà 1 ïîèíò âûøå ìàêñèìóìà ïðåäûäóùåãî áàðà
                  if (error==-1)
                  {
                     Alert("Îøèáêà èçìåíåíèÿ Buy ",TxtERROR(0),"  price ",NormalizeDouble(LastH, Digits),"   ",Symbol()," LotSize ", LotSize);
                     return(0);
                  }
               
               }
               else 
               { 
                  OrderDelete(Ticket);           // åñëè îðäåð íå îòêðûëñÿ â òå÷åíèå count áàðîâ, óäàëÿåì åãî
                  counterB=0;
               }
            } 
            if (tip==OP_SELLSTOP && LastL>OOP && MACDsamp()+Stoch()<=-1)        
            {
               if (counterS<count)
               {
                  counterS++;
                  error=OrderModify(Ticket,NormalizeDouble(LastL, Digits),SLS,OrderTakeProfit(),0,White);      // åñëè îðäåð íå îòêðûëñÿ ïîäâèãàåì åãî ââåðõ íà 1 ïîèíò âûøå ìèíèìóìà ïðåäûäóùåãî áàðà
                  if (error==-1)
                  {
                     Alert("Îøèáêà èçìåíåíèÿ Buy ",TxtERROR(0),"  price ",NormalizeDouble(LastL, Digits),"   ",Symbol()," LotSize ", LotSize);
                     return(0);
                  }
               }
               else 
               {
                  OrderDelete(Ticket);        // åñëè îðäåð íå îòêðûëñÿ â òå÷åíèå ñount áàðîâ, óäàëÿåì åãî
                  counterS=0;
               }
            } 
         }
      }
   }
}

void TrailingStop(int tral)          // ôóíêöèÿ çàêðûòèÿ îðäåðîâ çàêðûâàåò ëèáî òðàëîì, 
{                                    //  ëèáî ïðè ðàçâîðîòå MA
   int tip,Ticket;
   bool error;
   double StLo,OSL,OOP, MAcurr, MAprev; 
   
   MAcurr=iMA(NULL, PERIOD_M5, MAper, 0, MODE_EMA, PRICE_CLOSE, 0);
   MAprev=iMA(NULL, PERIOD_M5, MAper, 0, MODE_EMA, PRICE_CLOSE, 1);
   
   //ObjectSetText("my","MAcurr+"+MAcurr+" MAprev="+MAprev,12,"Arial",Snow);
   
   for (int i=0; i<OrdersTotal(); i++) 
   {  if (OrderSelect(i, SELECT_BY_POS)==true)
      {  tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
         {
            OSL   = OrderStopLoss();
            OOP   = OrderOpenPrice();
            Ticket = OrderTicket();
            if (tip==OP_BUY)             
            {
               if (Bid>OOP && MAcurr<MAprev)                                                                      // åñëè öåíà â ïðîôèòå íî ïàäàåò
               {
                  error=OrderClose(Ticket, LotSize, NormalizeDouble(Bid, 4), 0, CLR_NONE);                        // çàêðûâàåì îðäåð
                  if (!error) Print(Symbol(),"   Error order ",Ticket," TrailingStop ",GetLastError());
               } else if (OSL<OOP-StopLoss*Point && !1)                                                           // óñëîâèå äëÿ ïîäòÿãèâàíèÿ ñòîïëîññà ñðàáîòàâøåìó îðäåðó - îòêëþ÷åíî (÷òîáû âêëþ÷èòü óäàëèòü "&& !1") 
               {
                  error=OrderModify(Ticket,OOP,OOP-StopLoss*Point,OrderTakeProfit(),0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  //Sleep(500);
                  if (!error) Print(Symbol(),"   Error order ",Ticket," TrailingStop ",GetLastError());
               }
               if ((OSL<OOP && OOP>Bid-tral*Point) /*|| OSL>OOP*/) continue;                                      // òðåéëèíã ñòîï
               StLo = NormalizeDouble(Bid - tral*Point,Digits); 
               Alert("OSL=", OSL, " OOP=", OOP, " StLo=", StLo);
               if (StLo > OSL && StLo >= OOP /*&& StLo<Bid-10*Point*/)
               {  error=OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  //Sleep(500);
                  if (!error) Print(Symbol(),"   Error order ",Ticket," TrailingStop ",GetLastError());
               }
            }                                         
            if (tip==OP_SELL)        
            {
               if (Ask<OOP && MAcurr>MAprev)                                                                      // åñëè öåíà â ïðîôèòå íî ðàñòåò
               {
                  error=OrderClose(Ticket, LotSize, NormalizeDouble(Ask, 4), 0, CLR_NONE); 
                  if (!error) Print(Symbol(),"   Error order ",Ticket," Ask=", Ask, " bid=", Bid);
               } else if (OSL>OOP+StopLoss*Point && !1)
               {
                  error=OrderModify(Ticket,OOP,OOP+StopLoss*Point,OrderTakeProfit(),0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  //Sleep(500);
                  if (!error) Print(Symbol(),"   Error order ",Ticket," TrailingStop ",GetLastError());
               }
               if ((OSL>OOP && OSL!=0 && OOP<Ask+tral*Point) /*|| OSL<OOP*/) continue;
               StLo = NormalizeDouble(Ask + tral*Point,Digits);
               if ((StLo < OSL||OSL==0) && StLo <= OOP && StLo>Ask+10*Point)
               {  error=OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White);
                  Comment("TrailingStop ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES));
                  //Sleep(500);
                  if (!error) Print(Symbol(),"   Error order ",Ticket," TrailingStop ",GetLastError());
               }
            } 
         }
      }
   }
}

void Lot()
{
   if (AccountBalance()/dep>=2) 
   { 
      LotSize=LotSize+LotSize/2;
      dep=AccountBalance();
   }
}

string TxtERROR(int e)
{
   if (e==0) e = GetLastError();
   switch ( e )
   {                  
      case 0:   return;
      case 1:   return;
      case 2:   return("Îáùàÿ îøèáêà  ");
      case 3:   return("íåïðàâèëüíûå ïàðàìåòðû   ");
      case 6:   return("Íåò ñâÿçè ñ òîðãîâûì ñåðâåðîì   ");
      case 130: return("Íåïðàâèëüíûå ñòîïû   ");
      case 131: return("Íåïðàâèëüíûé îáúåì ");
      case 132: return("Ðûíîê çàêðûò ");
      case 133: return("Òîðãîâëÿ çàïðåùåíà ");
      case 134: return("Íåäîñòàòî÷íî äåíåã   ");
      case 136: return("Íåò öåí ");
      case 146: return("Ïîäñèñòåìà òîðãîâëè çàíÿòà ");
      case 129: return("Íåïðàâèëüíàÿ öåíà ");
      case 131: return("Íåïðàâèëüíûé îáúåì ");
      case 4051:return("Íåäîïóñòèìîå çíà÷åíèå ïàðàìåòðà ôóíêöèè ");
      case 4059:return("Ôóíêöèÿ íå ðàçðåøåíà â òåñòîâîì ðåæèìå");
      case 4063:return("Îæèäàåòñÿ ïàðàìåòð òèïà integer ");
      case 4105:return("Íè îäèí îðäåð íå âûáðàí ");
      case 4107:return("Íåïðàâèëüíûé ïàðàìåòð öåíû äëÿ òîðãîâîé ôóíêöèè ");
      case 4108:return("Íåâåðíûé íîìåð òèêåòà ");
      case 4109:return("Òîðãîâëÿ íå ðàçðåøåíà. Íåîáõîäèìî âêëþ÷èòü îïöèþ `Ðàçðåøèòü ñîâåòíèêó òîðãîâàòü` â ñâîéñòâàõ ýêñïåðòà.");
      case 4200:return("Îáúåêò óæå ñóùåñòâóåò ");
      default:  return(StringConcatenate("Error  ",e,"   "));
   }
}

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