iK_trend_v01_6

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
iK_trend_v01_6
//+------------------------------------------------------------------+
//|                                                 iK_trend_v01.mq4 |
//|                                                      Ivan Katsko |
//|                                                    ICQ:372739628 |
//+------------------------------------------------------------------+
#property  copyright "Ivan Katsko"
#property  link      "ICQ:372739628"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Red
#property  indicator_color2  DarkViolet
#property  indicator_color3  Blue
#property  indicator_color4  Green
#property  indicator_width1  2
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_width4  2
//---- indicator parameters
extern int PeriodMA=3;
extern int History=100;
extern int VerExtr=4;
extern int Flat=4;
extern int TimeFrame=0;
//extern 
bool Draw=true;

//---- indicator buffers
double     up, upp, min, minmin;
double     BuySell;
double     SL[];
double     TP[];
double     Trend[];
double     Trade[];
double     Delta[];
double     DeltaMA[];


bool New_Bar=false;
static datetime New_Time;
 
//+------------------------------------------------------------------+
int init()
  {
   New_Time=Time[0];
   min=MarketInfo(Symbol(),MODE_SPREAD)*Point;
//---- 
   IndicatorBuffers(6);
//---- 
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexDrawBegin(0,VerExtr);
   IndicatorDigits(Digits+5);
//---- 
   SetIndexBuffer(0,SL);
   SetIndexBuffer(1,TP);
   SetIndexBuffer(2,Trend);
   SetIndexBuffer(3,Trade);
   SetIndexBuffer(4,Delta);
   SetIndexBuffer(5,DeltaMA);
//---- 
   if(TimeFrame==0)TimeFrame=Period();
   IndicatorShortName("iK_trend_6("+PeriodMA+","/*+History+","*/+VerExtr+","+TimeFrame+")");
//---- 
   return(0);
  }
//+------------------------------------------------------------------+
int start()
  {
   //Alert("Íà start min=",min/Point);
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//   limit=History;
//---- Ðàçíèöà äâóõ ÌÀ-øåê
   for(int i=0; i<limit+PeriodMA; i++)
      Delta[i]=iMA(NULL,TimeFrame,PeriodMA,0,MODE_EMA,PRICE_MEDIAN,i)-iMA(NULL,TimeFrame,PeriodMA,0,MODE_EMA,PRICE_MEDIAN,i+1);
//---- Ñðåäíåå çíà÷åíèå ðàçíèöû äâóõ ÌÀ-øåê çà PeriodMA áàð
   int j=0;
   for(i=0; i<limit; i++)
      {
      DeltaMA[i]=0;
      for (j=i; j<i+PeriodMA; j++) DeltaMA[i]+=MathAbs(Delta[j]);
      DeltaMA[i]=DeltaMA[i]/PeriodMA;
      }

//---- Ñòðîèì áóôåð òðåíäà
   Fun_New_Bar();
   if(New_Bar)
     {
     min=MarketInfo(Symbol(),MODE_SPREAD)*Point;
     minmin=0;
     }
   double index=1.1;
   up=1;
   while(up<8)
      {
//      Alert("Íà âõîäå while min=",min/Point," up=",up);
      for(i=History; i>=0; i--)
         {
         if (MathAbs(Delta[i])>0.5*min && Delta[i]>0) 
            {
            Trend[i]=MathRound(Open[1]); 
            BuySell=1;
            }
            else 
            if (MathAbs(Delta[i])>0.5*min && Delta[i]<0) 
               {
               Trend[i]=-MathRound(Open[1]); 
               BuySell=-1;
               }
               else 
                  {
                  Trend[i]=0;
                  }
         if ((BuySell==1 && Delta[i]<0 && MathAbs(Delta[i])>0.33*min)
             || (BuySell==-1 && Delta[i]>0 && MathAbs(Delta[i])>0.33*min)) 
            {
            BuySell=0;
            }
         if (BuySell==1) Trade[i]=MathRound(Open[1])/2;
            else
            if (BuySell==-1) Trade[i]=-MathRound(Open[1])/2;
               else Trade[i]=0;
         }
      //---- Îïðåäåëèì äëèíó ôëåòà 
      int flat=0;
      j=0;
      for(i=1; i<History; i++)
         {
         if (Trade[i-1]!=0 && Trade[i]==0) {upp=1; j=0;}
         if (Trade[i]==0 && upp==1) j++;
         if (Trade[i+1]!=0 && Trade[i]==0 && upp==1) upp=0;
         if (j>flat) flat=j;
         }
      //up=0;
      up++;
      double in_min=min;
      for(i=0; i<History; i++)
         {
//         Alert("Öèêë i=",i," min=",min/Point);
         if ((Trade[i]>=0 && Trade[i+1]<0 && Trade[i+2]>=0)
           //||(Trade[i]>0 && Trade[i+1]==0 && Trade[i+2]>0)
           ||(Trade[i]<=0 && Trade[i+1]>0 && Trade[i+2]<=0)
           //||(Trade[i]<0 && Trade[i+1]==0 && Trade[i+2]<0)
           ||flat<Flat
            )
            {
            //up=1;
            //minmin=min;
//            Alert("Ñëó÷àé íà i=",i," min=",min/Point," DeltaMA[i+1]=",DeltaMA[i+1]/Point);
            if(in_min>=DeltaMA[i+1]) index=index*index;
            if(min<DeltaMA[i+1]) min=DeltaMA[i+1];
//            Alert("Ñòàëî min=",min/Point/*," minmin=",minmin/Point*/);
            for(j=0; j<=History; j++)
               {
//               Alert("Òåïåðü ïðè j=",j," minDeltaMA=",MathMin(DeltaMA[j],DeltaMA[j+1])/Point," control=",min*index/Point);
               if(min<MathMin(DeltaMA[j],DeltaMA[j+1])
                  && min*index>MathMin(DeltaMA[j],DeltaMA[j+1])) 
                  {
                  min=MathMin(DeltaMA[j],DeltaMA[j+1]);
                  break;
                  }
//               Alert("Íàçíà÷åí min=",min/Point);
               /*if (min>DeltaMA[j]
                  && minmin<DeltaMA[j]) 
                  {
                  min=DeltaMA[j]*1.1;
                  }
                  //else {min=minmin; up=0; break;}*/
               }
            break;
//            Comment("min=",min/Point,"\ni=",i,"\nDeltaMA[",i,"]=",DeltaMA[i]/Point);
            }
            else 
            if(i==History-1 && up!=2)
              {
//              Alert("针֌ min=",min/Point," up=",up);
              up=8;
              }
         }
//      Alert("Íà âûõîäå while min=",min/Point);
      //if (up==0) break; //else continue;
      }

//---- Èùåì è ñòðîèì ÑòîðËîññ
   double sl=Open[0];
   for(i=1; i<=VerExtr; i++)
      {
      if (Trade[0]>0 && Low[i]<sl) 
         sl=Low[i];
      if (Trade[0]<0 && High[i]>sl) 
         sl=High[i];
      if (Trade[0]==0) 
         sl=0;
      }
//---- Èùåì è ñòðîèì ÒåéêÏðîôèò
   double TPup  =0;
   double TPdown=0;
   for(i=1; i<History; i++)
      {
      if (Trade[i]>0) 
         if((Close[i]-Open[i])>TPup) TPup=Close[i]-Open[i];
      if (Trade[i]<0)
         if((Open[i]-Close[i])>TPdown) TPdown=Open[i]-Close[i];
//      Alert("i=",i," TPup=",TPup/Point," TPdown=",TPdown/Point);
      }
   if (Trade[0]>0) 
      {
      sl=-sl - MarketInfo(Symbol(), MODE_SPREAD)*Point;
      double tp=0.67*TPup/Point;
      }
   if (Trade[0]<0) 
      {
      sl= sl + MarketInfo(Symbol(), MODE_SPREAD)*Point;
      tp=-0.67*TPdown/Point;
      }
   if (Open[1]<10) tp=tp/100;
   if (Draw)
      {
      for(i=0; i<2; i++) 
         {
         SL[i]=sl;
         TP[i]=tp;
         }
      }
   SL[2]=0;
   TP[2]=0;
//---- done
   return(0);
  }

//+------------------------------------------------------------------+
void Fun_New_Bar()                              // Ô-èÿ îáíàðóæåíèÿ íîâîãî áàðà
  {                                             
   New_Bar=false;                               // Íîâîãî áàðà íåò
   if(New_Time!=Time[0])                        // Ñðàâíèâàåì âðåìÿ
     {
      New_Time=Time[0];                         // Òåïåðü âðåìÿ òàêîå
      New_Bar=true;                             // Ïîéìàëñÿ íîâûé áàð  
     }
  }

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