mv-i-Chuvashov

Author: ������ ��������� �. MaxV42
Indicators Used
Fractals
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
mv-i-Chuvashov
//+------------------------------------------------------------------+
//|                                               mv-i-Chuvashov.mq4 |
//|                                       Ìàêñèì Âàñèëåíêî Â. MaxV42 |
//|                                       http://                    |
//| Èíäèêàòîð ðàáîòàåò ïî ñòðàòåãèè "Âèëêà ×óâàøîâà".                |
//| Âåðñèÿ 1.0:                                                      |
//+------------------------------------------------------------------+
#property copyright "Ìàêñèì Âàñèëåíêî Â. MaxV42"
#property link      "http://"
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1 1
#property indicator_width2 1
//+------------------------------------------------------------------+
extern string Ind_Coment1= "--- Âíåøíèå ïàðàìåòðû èíäèêàòîðà ---";
extern bool  ShowFractals     =  true;         // Âêë/âûêë çíà÷êîâ ôðàêòàëîâ
extern bool  OnAlert          =  true;         // Âêë/âûêë ñèãíàëà
extern bool  OnPrint          = false;         // Âêë/âûêë âûâîä ñèãíàëà â æóðíàëå ýêñïåðòà
extern int   nVilka.Upper     =     1;         // Êîëè÷åñòâî âûâîäèìûõ âîñõîäÿùèõ "âèëîê"
extern int   nVilka.Lower     =     1;         // Êîëè÷åñòâî âûâîäèìûõ íèñõîäÿùèõ "âèëîê"
extern color Color.LineUpper  =   Red;         // Öâåò âîñõîäÿùèõ "âèëîê"
extern color Color.LineLower  =  Blue;         // Öâåò íèñõîäÿùèõ "âèëîê"
extern int   Width.LineUpper  =     2;         // Øèðèíà âîñõîäÿùèõ "âèëîê"
extern int   Width.LineLower  =     2;         // Øèðèíà íèñõîäÿùèõ "âèëîê"
//+------------------------------------------------------------------+
// ãëîáàëüíûå ïåðåìåííûå
int          nLine.Upper      =     0,         // Êîëè÷åñòâî òðåíäîâûõ ëèíèé, íàïðàâëåííûõ ââåðõ
             nLine.Lower      =     0,         // Êîëè÷åñòâî òðåíäîâûõ ëèíèé, íàïðàâëåííûõ âíèç
             nBars            =     0;         //
datetime     mLineUpper.DateTime[][2];         // ìàññèâ ñ ïàðàìåòðàìè âîñõîäÿùèõ "âèëîê"
         //  mLineUpper.DateTime[i][0]         // Âðåìÿ ïåðâîé êîîðäèíàòû
         //  mLineUpper.DateTime[i][1]         // Âðåìÿ âòîðîé êîîðäèíàòû
double       mLineUpper.Price[][2];            // ìàññèâ ñ ïàðàìåòðàìè âîñõîäÿùèõ "âèëîê"
         //  mLineUpper.Price[i][0]            // Öåíà ïåðâîé êîîðäèíàòû
         //  mLineUpper.Price[i][1]            // Öåíà âòîðîé êîîðäèíàòû
datetime     mLineLower.DateTime[][2];         // ìàññèâ ñ ïàðàìåòðàìè íèñõîäÿùèõ "âèëîê"
         //  mLineLower.DateTime[i][0]         // Âðåìÿ ïåðâîé êîîðäèíàòû
         //  mLineLower.DateTime[i][1]         // Âðåìÿ âòîðîé êîîðäèíàòû
double       mLineLower.Price[][2];            // ìàññèâ ñ ïàðàìåòðàìè íèñõîäÿùèõ "âèëîê"
         //  mLineLower.Price[i][0]            // Öåíà ïåðâîé êîîðäèíàòû
         //  mLineLower.Price[i][1]            // Öåíà âòîðîé êîîðäèíàòû
//----- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
void init()  {        // Custom indicator initialization function
int    Qnt=ObjectsTotal();
  // ----- Indicators Properties
  SetIndexStyle(0,DRAW_ARROW);
  SetIndexArrow(0,217);
  SetIndexBuffer(0,ExtMapBuffer1);
  SetIndexEmptyValue(0,0.0);
  SetIndexStyle(1,DRAW_ARROW);
  SetIndexArrow(1,218);
  SetIndexBuffer(1,ExtMapBuffer2);
  SetIndexEmptyValue(1,0.0);
  // ----- Name for DataWindow and indicator subwindow label
  IndicatorShortName("Fractals");
  SetIndexLabel(0,"FractalsUp");
  SetIndexLabel(1,"FractalsDown");
  // ----- óñòàíàâëèâàåì êîëè÷åñòâî ýëåìåíòîâ â ìàññèâàõ òðåíäîâûõ ëèíèé
  ArrayResize(mLineUpper.DateTime,nVilka.Upper*2); ArrayResize(mLineUpper.Price,nVilka.Upper*2);
  ArrayResize(mLineLower.DateTime,nVilka.Lower*2); ArrayResize(mLineLower.Price,nVilka.Lower*2);
  return;
}

//+------------------------------------------------------------------+
void deinit()   {     // Custom indicator deinitialization function
int    Qnt=ObjectsTotal();
  // ----- Óäàëÿåì òðåíäîâûå ëèíèè
  for (int i=0; i<Qnt; i++)   {  // Öèêë ïî îáúåêòàì
    if(StringFind(ObjectName(i),"Line.Upper",0)>=0) {
      ObjectDelete(ObjectName(i));     // íàïðàâëåííûå ââåðõ
      i--; continue;
    }
    if(StringFind(ObjectName(i),"Line.Lower",0)>=0) {
      ObjectDelete(ObjectName(i));     // íàïðàâëåííûå âíèç
      i--; continue;
    }
    if(i>=ObjectsTotal()) break;
  }
 return;
}

//+------------------------------------------------------------------+
void start() {        // Custom indicator iteration function
int    counted_bars=IndicatorCounted();
int    limit;
int    Spred=MarketInfo(Symbol(),MODE_SPREAD);
  // íîâûé áàð íå ïîÿâèëñÿ
  if(!isNewBar()) return;
  // ----- Ïîñëåäíèé ïîñ÷èòàííûé áàð áóäåò ïåðåñ÷èòàí
  if (counted_bars>0) counted_bars--;
  limit=Bars-counted_bars;
  // ----- Îñíîâíîé öèêë
  for (int i=limit; i>2; i--)   {
    if(ShowFractals)  {                    // îòîáðàæàåì âðûêòàëû íà ãðàôèêå
      ExtMapBuffer1[i]=iFractals(NULL,0,MODE_UPPER,i)+Spred*Point;
      ExtMapBuffer2[i]=iFractals(NULL,0,MODE_LOWER,i)-Spred*Point;
    }
    //---- Áëîê Upper-ôðàêòàëîâ (íèñõîäÿùèå "âèëêè")
    if (iFractals(NULL,0,MODE_UPPER,i)!=0)  {
      if(LowerVilka(i)) {
        if(OnAlert) Alert(Symbol(),Period()," Íèñõîäÿùàÿ âèëêà! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
        if(OnPrint) Print(Symbol(),Period()," Íèñõîäÿùàÿ âèëêà! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
      }
    }
    //---- Áëîê Lower-ôðàêòàëîâ (âîñõîäÿùèå "âèëêè")
    if (iFractals(NULL,0,MODE_LOWER,i)!=0)  {
      if(UpperVilka(i)) {
        if(OnAlert) Alert(Symbol(),Period()," Âîñõîäÿùàÿ âèëêà! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
        if(OnPrint) Print(Symbol(),Period()," Âîñõîäÿùàÿ âèëêà! ",TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
      }
    }
  }
  return;
}

//+------------------------------------------------------------------+
bool UpperVilka(int nBar)  {     // Ôóíêöèÿ îïðåäåëÿåò è ðèñóåò âîñõîäÿùèå "âèëêè"
int         j=0;
double      Fractal.Lower=0;
double      mFractals.Price[3];
datetime    mFractals.DateTime[3];
   // ----- çàïîëíÿåì ìàññèâû èíôîðìàöèåé î ïîñëåäíèõ òðåõ ôðàêòàëàõ
   ArrayInitialize(mFractals.Price,0); ArrayInitialize(mFractals.DateTime,0);
   for (int i=nBar; i<Bars; i++)   {  // Öèêë ïî áàðàì
      Fractal.Lower=iFractals(NULL,0,MODE_LOWER,i);
      if(Fractal.Lower!=0) {
         mFractals.Price[j]=Fractal.Lower-MarketInfo(Symbol(),MODE_SPREAD)*Point;
         mFractals.DateTime[j]=Time[i];
         j++;
      }
      if(j>2) break;
   }
   // ----- ðèñóåì âîñõîäÿùóþ "âèëêó"
   if(mFractals.Price[2]<mFractals.Price[1] && mFractals.Price[1]<mFractals.Price[0])  {
      string Name1="Line.Upper"+DoubleToStr(nLine.Upper,0); nLine.Upper++;
      string Name2="Line.Upper"+DoubleToStr(nLine.Upper,0); nLine.Upper++;

      ObjectCreate(Name1,OBJ_TREND,0,mFractals.DateTime[2],mFractals.Price[2],mFractals.DateTime[1],mFractals.Price[1]);
      ObjectCreate(Name2,OBJ_TREND,0,mFractals.DateTime[1],mFractals.Price[1],mFractals.DateTime[0],mFractals.Price[0]);
      if (ObjectGetValueByShift(Name1,nBar)<ObjectGetValueByShift(Name2,nBar))  {
        ObjectDelete(Name1); ObjectDelete(Name2); nLine.Upper--; nLine.Upper--; return(false);
      }
      ObjectSet(Name1,OBJPROP_COLOR,Color.LineUpper);   ObjectSet(Name2,OBJPROP_COLOR,Color.LineUpper);
      ObjectSet(Name1,OBJPROP_WIDTH,Width.LineUpper);   ObjectSet(Name2,OBJPROP_WIDTH,Width.LineUpper);
      ObjectSet(Name1,OBJPROP_RAY,True);                ObjectSet(Name2,OBJPROP_RAY,True);
      CheckNumVilka(10);
      return(true);
   }
   return(false);
}

//+------------------------------------------------------------------+
bool LowerVilka(int nBar)  {     // Ôóíêöèÿ îïðåäåëÿåò è ðèñóåò íèñõîäÿùèå "âèëêè"
int         j=0;
double      Fractal.Upper=0;
double      mFractals.Price[3];
datetime    mFractals.DateTime[3];
   // ----- çàïîëíÿåì ìàññèâû èíôîðìàöèåé î ïîñëåäíèõ òðåõ ôðàêòàëàõ
   ArrayInitialize(mFractals.Price,0); ArrayInitialize(mFractals.DateTime,0);
   for (int i=nBar; i<Bars; i++)   {  // Öèêë ïî áàðàì
      Fractal.Upper=iFractals(NULL,0,MODE_UPPER,i);
      if(Fractal.Upper!=0) {
         mFractals.Price[j]=Fractal.Upper+MarketInfo(Symbol(),MODE_SPREAD)*Point;
         mFractals.DateTime[j]=Time[i];
         j++;
      }
      if(j>2) break;
   }
   // ----- ðèñóåì íèñõîäÿùèå "âèëêó"
   if(mFractals.Price[2]>mFractals.Price[1] && mFractals.Price[1]>mFractals.Price[0])  {
      string Name1="Line.Lower"+DoubleToStr(nLine.Lower,0); nLine.Lower++;
      string Name2="Line.Lower"+DoubleToStr(nLine.Lower,0); nLine.Lower++;

      ObjectCreate(Name1,OBJ_TREND,0,mFractals.DateTime[2],mFractals.Price[2],mFractals.DateTime[1],mFractals.Price[1]);
      ObjectCreate(Name2,OBJ_TREND,0,mFractals.DateTime[1],mFractals.Price[1],mFractals.DateTime[0],mFractals.Price[0]);
      if (ObjectGetValueByShift(Name1,nBar)>ObjectGetValueByShift(Name2,nBar))  {
        ObjectDelete(Name1); ObjectDelete(Name2); nLine.Lower--; nLine.Lower--; return(false);
      }
      ObjectSet(Name1,OBJPROP_COLOR,Color.LineLower);   ObjectSet(Name2,OBJPROP_COLOR,Color.LineLower);
      ObjectSet(Name1,OBJPROP_WIDTH,Width.LineLower);   ObjectSet(Name2,OBJPROP_WIDTH,Width.LineLower);
      ObjectSet(Name1,OBJPROP_RAY,True);                ObjectSet(Name2,OBJPROP_RAY,True);
      CheckNumVilka(20);
      return(true);
   }
   return(false);
}

//+------------------------------------------------------------------+
bool isNewBar() {                     // Ôóíêöèÿ âîçâðàùàåò true, åñëè ïîÿâèòüñÿ íîâûé áàð, èíà÷å false
  if(nBars!=Bars) {
    nBars=Bars; return(true);
  }
  return(false);
}

//+------------------------------------------------------------------+
void CheckNumVilka(int Type)  {     // Ôóíêöèÿ ïðîâåðÿåò äîïóñòèìîå êîëè÷åñòâî âèëîê óêàçàííîãî òèïà
int i;
  switch(Type)  {
    case 10:
      //--------------------------------------------------------- 1 --
      if(nLine.Upper<=nVilka.Upper*2)  {
        mLineUpper.DateTime[nLine.Upper-2][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME1);
        mLineUpper.DateTime[nLine.Upper-2][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME2);
        mLineUpper.Price[nLine.Upper-2][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE1);
        mLineUpper.Price[nLine.Upper-2][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE2);
        //+------------------------------------------------------------------+
        mLineUpper.DateTime[nLine.Upper-1][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME1);
        mLineUpper.DateTime[nLine.Upper-1][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME2);
        mLineUpper.Price[nLine.Upper-1][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE1);
        mLineUpper.Price[nLine.Upper-1][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE2);
      }
      //--------------------------------------------------------- 2 --
      if(nLine.Upper >nVilka.Upper*2)  {
        for (i=0; i<nLine.Upper-4; i++)  {
          mLineUpper.DateTime[i][0]=mLineUpper.DateTime[i+2][0]; mLineUpper.DateTime[i][1]=mLineUpper.DateTime[i+2][1];
          mLineUpper.Price[i][0]=mLineUpper.Price[i+2][0]; mLineUpper.Price[i][1]=mLineUpper.Price[i+2][1];
        }
        mLineUpper.DateTime[nLine.Upper-4][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME1);
        mLineUpper.DateTime[nLine.Upper-4][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_TIME2);
        mLineUpper.Price[nLine.Upper-4][0]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE1);
        mLineUpper.Price[nLine.Upper-4][1]=ObjectGet("Line.Upper"+(nLine.Upper-2),OBJPROP_PRICE2);
        //+------------------------------------------------------------------+
        mLineUpper.DateTime[nLine.Upper-3][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME1);
        mLineUpper.DateTime[nLine.Upper-3][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_TIME2);
        mLineUpper.Price[nLine.Upper-3][0]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE1);
        mLineUpper.Price[nLine.Upper-3][1]=ObjectGet("Line.Upper"+(nLine.Upper-1),OBJPROP_PRICE2);
        //+------------------------------------------------------------------+
        ObjectDelete("Line.Upper"+(nLine.Upper-2)); ObjectDelete("Line.Upper"+(nLine.Upper-1));
        nLine.Upper--;nLine.Upper--;
        //+------------------------------------------------------------------+
        for (i=0; i<nLine.Upper; i++)  {
          ObjectMove("Line.Upper"+i,0,mLineUpper.DateTime[i][0],mLineUpper.Price[i][0]);
          ObjectMove("Line.Upper"+i,1,mLineUpper.DateTime[i][1],mLineUpper.Price[i][1]);
        } 
      }
    case 20:
      //--------------------------------------------------------- 1 --
      if(nLine.Lower<=nVilka.Lower*2)  {
        mLineLower.DateTime[nLine.Lower-2][0]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_TIME1);
        mLineLower.DateTime[nLine.Lower-2][1]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_TIME2);
        mLineLower.Price[nLine.Lower-2][0]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_PRICE1);
        mLineLower.Price[nLine.Lower-2][1]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_PRICE2);
        //+------------------------------------------------------------------+
        mLineLower.DateTime[nLine.Lower-1][0]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_TIME1);
        mLineLower.DateTime[nLine.Lower-1][1]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_TIME2);
        mLineLower.Price[nLine.Lower-1][0]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_PRICE1);
        mLineLower.Price[nLine.Lower-1][1]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_PRICE2);
      }
      //--------------------------------------------------------- 2 --
      if(nLine.Lower >nVilka.Lower*2)  {
        for (i=0; i<nLine.Lower-4; i++)  {
          mLineLower.DateTime[i][0]=mLineLower.DateTime[i+2][0]; mLineLower.DateTime[i][1]=mLineLower.DateTime[i+2][1];
          mLineLower.Price[i][0]=mLineLower.Price[i+2][0]; mLineLower.Price[i][1]=mLineLower.Price[i+2][1];
        }
        mLineLower.DateTime[nLine.Lower-4][0]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_TIME1);
        mLineLower.DateTime[nLine.Lower-4][1]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_TIME2);
        mLineLower.Price[nLine.Lower-4][0]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_PRICE1);
        mLineLower.Price[nLine.Lower-4][1]=ObjectGet("Line.Lower"+(nLine.Lower-2),OBJPROP_PRICE2);
        //+------------------------------------------------------------------+
        mLineLower.DateTime[nLine.Lower-3][0]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_TIME1);
        mLineLower.DateTime[nLine.Lower-3][1]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_TIME2);
        mLineLower.Price[nLine.Lower-3][0]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_PRICE1);
        mLineLower.Price[nLine.Lower-3][1]=ObjectGet("Line.Lower"+(nLine.Lower-1),OBJPROP_PRICE2);
        //+------------------------------------------------------------------+
        ObjectDelete("Line.Lower"+(nLine.Lower-2)); ObjectDelete("Line.Lower"+(nLine.Lower-1));
        nLine.Lower--;nLine.Lower--;
        //+------------------------------------------------------------------+
        for (i=0; i<nLine.Lower; i++)  {
          ObjectMove("Line.Lower"+i,0,mLineLower.DateTime[i][0],mLineLower.Price[i][0]);
          ObjectMove("Line.Lower"+i,1,mLineLower.DateTime[i][1],mLineLower.Price[i][1]);
        } 
      }
  }
  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 ---