Суммирование переменных к переменной прибыли - PullRequest
0 голосов
/ 17 июня 2020

ОБНОВЛЕНИЕ !!! Поэтому я пишу обновление вверху, чтобы запомнить это на потом.

Я выяснил, почему SellProfit показывает неправильную прибыль. Оказывается, функция суммирования запускает первый Selltrigger и dosent отображает его, но все равно сохраняет это значение до конца. Это означает, что он дает ложные результаты.

enter image description here

Как вы можете видеть на картинке, у нас есть только один buySquare и нет SellSquare, но есть комментарий SellProfit (до слева) по-прежнему показывает цену продажи. Таким образом, он считает первый триггер на продажу и последнее закрытие на продажу как одну сделку, но не отображает ее.

Я не знаю, как исправить это в коде, который у меня есть сейчас, но думаю, что смогу исправить это если я нахожусь, посмотрите на текстовый элемент и попытайтесь собрать их и таким образом суммировать. Это похоже на неправильный путь к go, но все, что я могу придумать до сих пор.


Итак.

Я работаю над индикатором, который отображает входные сигналы покупки / продажи и closeorder для тех. Я также работаю над отображением прибыли этого ордера.

это выглядит так.

double               SquareStartPrice        = 0;
double               SquareEndPrice          = 0;
double               OrderStartPrice         = 0;
double               BuyProfit               = 0;
double               SellProfit              = 0;
double               profit                  = 0;

и

 if(BuySignal && !BuyOrder_Bool)
        {
         SquareStartPrice   = Close[i];
         SquareEndPrice = Close[i];
         }
      if(BuySignalOut && !BuySignalOut_Bool)
        {
         SquareEndPrice = Close[i];
         BuyProfit += (SquareEndPrice-SquareStartPrice);
         //profit = (profit+BuyProfit);
        }
      if(SellSignal && !SellOrder_Bool)
        {
         SquareStartPrice   = Close[i];
         SquareEndPrice = Close[i];
        }
      if(SellSignalOut && ! SellSignalOut_Bool)
        {
         SellProfit += (SquareStartPrice-SquareEndPrice);
         profit = (profit+SellProfit);
        }

Проблема у меня при суммировании индекс SellProfit. Это неправильно, но BuyProfit работает (я думаю).

это выглядит примерно так. enter image description here

Зеленый квадрат - это BuySignal, а число слева - прибыль. Red Sqyare - это сигнал продажи, а число слева - это прибыль.

BuyProfit = (15,3) + (-4,38) = 10,92 SellProfit = (-1,07)

Если мы посмотрим на комментарий, который находится под символом, мы видим, что BuyProfit является правильным, но не SellProfit.

С чего начать определение проблемы?

И вот весь код: (не знаю, Могу прикрепить файл .mq4)

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot EmaTrend
#property indicator_label1  "EmaTrend"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlack
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
//--- plot EmaShort
#property indicator_label2  "EmaShort"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  4
//--- plot Trend
#property indicator_label3  "Trend"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrGreen
#property indicator_style3  STYLE_SOLID
#property indicator_width3  4
//--- input parameters
//input int            LookBack= 5000;
input datetime       LookBackTo = D'2020.06.01 00:00:00';
extern double        Static_LotSize=0.01;

extern string        ____Moving_Average____ = " //////////////////// ";
input int            myEmaTrend_Value       = 350;
input int            myEmaShort_Value       = 9;

extern string        ____MACD____ = " //////////////////// ";
//input bool            myMACD_Bool            = true;
input int            myMACD_FAST_EMA        =12;
input int            myMACD_SLOW_EMA        =26;
input int            myMACD_SIGNAL_SMA      =9;

extern string        ____RSI____ = " //////////////////// ";
input int            myRSI_Period           =14;
input int            myRSI_High             =70;
input int            myRSI_Low              =30;

extern string        ____DeMarker____ = " //////////////////// ";
input int            myDeMarker_Period      =14;
input double         myDeMarker_High        =0.70;
input double         myDeMarker_Low         =0.30;

extern string        ____BuySellSignalOut____= " //////////////////// ";
input bool           myEma_Bool             = true;
input bool           myRSI_Bool             = false;
input bool           myDeMarker_Bool        = false;




bool                 BuyOrder_Bool           = false;
bool                 SellOrder_Bool          = false;
bool                 BuySignalOut_Bool       = false;
bool                 SellSignalOut_Bool      = false;

double               SquareStartPrice        = 0;
double               SquareEndPrice          = 0;
double               OrderStartPrice         = 0;
double               BuyProfit               = 0;
double               SellProfit              = 0;
double               profit                  = 0;

int                  objcount=0;
int                  BuySquareCount=0;
int                  SellSquareCount=0;

color                SquareTextColor=clrBlack;
color                InfoTextColor=clrBlack;
int                  ButtonXSize      = 140;
double               pipsmultiplier;

//--- indicator buffers
double         EmaTrendBuffer[];
double         EmaShortBuffer[];
double         TrendBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,EmaTrendBuffer);
   SetIndexBuffer(1,EmaShortBuffer);
   SetIndexBuffer(2,TrendBuffer);
   deleteObjects();

   if(MarketInfo(Symbol(),MODE_DIGITS)==3 && MarketInfo(Symbol(),MODE_DIGITS)==5)
     {
      pipsmultiplier=10;
     }
   else
     {
      pipsmultiplier=1;
     }

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- initial zero
   int limit = rates_total - prev_calculated;
   ArraySetAsSeries(EmaTrendBuffer, true);
   ArraySetAsSeries(EmaShortBuffer, true);
   ArraySetAsSeries(TrendBuffer, true);
   SetLabelObject("TestPos1","TestPos1",10,40,InfoTextColor);


   int      shift=iBarShift(Symbol(),PERIOD_CURRENT,LookBackTo);
   Comment("BuyProfit = "+calculatePip(BuyProfit)+ "\n" + "SellProfit = "+calculatePip(SellProfit)+ "\n" +"SHIFT = "+shift);

   if(prev_calculated < 1)
     {
      ArrayInitialize(EmaTrendBuffer, 0);
      ArrayInitialize(EmaShortBuffer, 0);
      ArrayInitialize(TrendBuffer, 0);
     }
   else
      limit++;

//--- main loop
   for(int i = limit-1; i >= 0; i--)
     {
      if(i >= MathMin(shift-1, rates_total-1-50))
         continue; //omit some old rates to prevent "Array out of range" or slow calculation

      //Indicator Buffer 1
      double myEmaTrend             = iMA(Symbol(),PERIOD_CURRENT,myEmaTrend_Value,0,MODE_EMA,PRICE_CLOSE,i);
      EmaTrendBuffer[i] = myEmaTrend;
      double myEmaTrend_Prev        = iMA(Symbol(),PERIOD_CURRENT,myEmaTrend_Value,0,MODE_EMA,PRICE_CLOSE,i+1);

      double myEmaShort             = iMA(Symbol(),PERIOD_CURRENT,myEmaShort_Value,0,MODE_EMA,PRICE_CLOSE,i);
      EmaShortBuffer[i] = myEmaShort;
      double myEmaShort_Prev        = iMA(Symbol(),PERIOD_CURRENT,myEmaShort_Value,0,MODE_EMA,PRICE_CLOSE,i+1);

      double myMACD_Signal          = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_SIGNAL,i);
      double myMACD_Signal_Prev     = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_SIGNAL,i+1);


      double myMACD                 = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_MAIN,i);
      double myMACD_Prev            = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_MAIN,i+1);

      double   myRSI                = iRSI(Symbol(),PERIOD_CURRENT,myRSI_Period,PRICE_CLOSE,i);
      double   myRSI_Prev           = iRSI(Symbol(),PERIOD_CURRENT,myRSI_Period,PRICE_CLOSE,i+1);

      double   myDeMarker           =iDeMarker(Symbol(),PERIOD_CURRENT,myDeMarker_Period,i);
      double   myDeMarker_Prev      =iDeMarker(Symbol(),PERIOD_CURRENT,myDeMarker_Period,i+1);

      bool     BuyTrend = myEmaShort>myEmaTrend;
      bool     BuyTrend_Prev = myEmaShort_Prev>myEmaTrend_Prev;

      //----------
      bool     BuySignal           = BuyTrend && BuyTrend_Prev && myMACD_Prev<myMACD_Signal_Prev && myMACD>myMACD_Signal && myMACD_Prev<0 && myMACD<0;
      bool     BuySignalOut        = (myEma_Bool && BuyTrend_Prev && !BuyTrend) ||
                                     (myRSI_Bool && myRSI>myRSI_High && myRSI_Prev<myRSI_High) ||
                                     (myDeMarker_Bool && myDeMarker>myDeMarker_High && myDeMarker_Prev<myDeMarker_High);
      //----------
      bool     SellSignal          = !BuyTrend && !BuyTrend_Prev && myMACD_Prev>myMACD_Signal_Prev && myMACD<myMACD_Signal && myMACD_Prev>0 && myMACD>0;
      bool     SellSignalOut       = (myEma_Bool && !BuyTrend_Prev && BuyTrend) ||
                                     (myRSI_Bool && myRSI<myRSI_Low && myRSI_Prev>myRSI_Low) ||
                                     (myDeMarker_Bool && myDeMarker<myDeMarker_Low && myDeMarker_Prev>myDeMarker_Low);

      //----------
      ObjectSetString(NULL,"TestPos1",OBJPROP_TEXT,"Profit = "+string(calculatePip(profit)));
      //----------

      if(BuySignal && !BuyOrder_Bool)
        {
         SquareStartPrice   = Close[i];
         SquareEndPrice = Close[i];

         SetVlineObject("BuySignal"+string(objcount), Time[i], clrGreen);
         SetSquareObject("BuySquare"+string(BuySquareCount), Time[i], SquareStartPrice,Time[i], SquareEndPrice,clrGreen);

         objcount++;
         BuySquareCount++;

         BuyOrder_Bool = true;
         SellOrder_Bool = false;
         BuySignalOut_Bool = false;
        }
      if(BuySignalOut && !BuySignalOut_Bool)
        {
         SetVlineObject("BuySignalOut"+string(objcount), Time[i], clrDarkGreen);
         ObjectSet("BuySquare"+string(BuySquareCount-1),OBJPROP_TIME2,Time[i]);
         SquareEndPrice = Close[i];
         ObjectSet("BuySquare"+string(BuySquareCount-1),OBJPROP_PRICE2,SquareEndPrice);
         ObjectSetString(NULL,"BuySquare"+string(BuySquareCount-1)+"text",OBJPROP_TEXT,string(calculatePip(SquareEndPrice-SquareStartPrice)));
         BuyProfit += (SquareEndPrice-SquareStartPrice);
         //profit = (profit+BuyProfit);




         objcount++;
         BuyOrder_Bool = false;
         BuySignalOut_Bool=true;
         //----------
        }


      if(SellSignal && !SellOrder_Bool)
        {
         SquareStartPrice   = Close[i];
         SquareEndPrice = Close[i];

         SetVlineObject("SellSignal"+string(objcount), Time[i], clrRed);
         SetSquareObject("SellSquare"+string(SellSquareCount), Time[i], SquareStartPrice,Time[i], SquareEndPrice,clrRed);

         objcount++;
         SellSquareCount++;

         BuyOrder_Bool = false;
         SellOrder_Bool = true;
         SellSignalOut_Bool = false;
        }
      if(SellSignalOut && ! SellSignalOut_Bool)
        {
         SetVlineObject("SellSignalOut"+string(objcount), Time[i], clrDarkRed);
         ObjectSet("SellSquare"+string(SellSquareCount-1),OBJPROP_TIME2,Time[i]);
         SquareEndPrice = Close[i];
         ObjectSet("SellSquare"+string(SellSquareCount-1),OBJPROP_PRICE2,SquareEndPrice);
         ObjectSetString(NULL,"SellSquare"+string(SellSquareCount-1)+"text",OBJPROP_TEXT,string(calculatePip(SquareStartPrice-SquareEndPrice)));
         SellProfit += (SquareStartPrice-SquareEndPrice);
         profit = (profit+SellProfit);


         objcount++;
         SellOrder_Bool = false;
         SellSignalOut_Bool = true;
        }

     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---

  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| SetVlineObject                                                   |
//+------------------------------------------------------------------+
void SetVlineObject(string name, datetime t, color colour)
  {
   if(ObjectFind(name) == -1)
     {
      ObjectCreate(name,OBJ_VLINE,0,t,0);
      ObjectSet(name, OBJPROP_COLOR, colour);
      ObjectSet(name, OBJPROP_BACK, false);
      ObjectSet(name, OBJPROP_WIDTH, 4);
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetSquareObject                                                   |
//+------------------------------------------------------------------+
void SetSquareObject(string name, datetime t1, double P1,datetime t2, double P2,color colour)
  {
   if(ObjectFind(name) == -1)
     {
      ObjectCreate(name,OBJ_RECTANGLE,0,t1,P1,t2,P2);
      ObjectSet(name, OBJPROP_CORNER, 1);    // Reference corner
      ObjectSet(name,OBJPROP_BGCOLOR,colour);
      ObjectSet(name,OBJPROP_COLOR,colour);

      ObjectCreate(name+"text",OBJ_TEXT,0,t1,P1);
      ObjectSet(name+"text",OBJPROP_COLOR,SquareTextColor);
      ObjectSet(name+"text",OBJPROP_FONTSIZE,25);
      ObjectSet(name+"text", OBJPROP_ANCHOR,4);
     }
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetLabelObject                                                   |
//+------------------------------------------------------------------+
void SetLabelObject(string name, string text, double P1, double P2,color colour)
  {
   if(ObjectFind(name) == -1)
     {
      ObjectCreate(name,OBJ_LABEL,0,0,0);
      ObjectSetString(NULL,name,OBJPROP_TEXT,text);
      ObjectSet(name, OBJPROP_CORNER, 1);    // Reference corner
      ObjectSet(name, OBJPROP_XDISTANCE, P1);// X coordinate
      ObjectSet(name, OBJPROP_YDISTANCE, P2);// Y coordinate
      ObjectSet(name,OBJPROP_BGCOLOR,colour);
      ObjectSet(name,OBJPROP_COLOR,colour);
      ObjectSet(name,OBJPROP_FONTSIZE,25);
     }
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetButtonObject                                                  |
//+------------------------------------------------------------------+
void SetButtonObject(string name,string text, double P1, double P2,color colour)
  {
   if(ObjectFind(name) == -1)
     {
      ObjectCreate(name,OBJ_BUTTON,0,0,0,0);
      ObjectSet(name, OBJPROP_CORNER, 1);
      ObjectSet(name,OBJPROP_XDISTANCE,P1);
      ObjectSet(name,OBJPROP_YDISTANCE,P2);
      ObjectSet(name,OBJPROP_XSIZE,ButtonXSize);
      ObjectSet(name,OBJPROP_YSIZE,40);
      ObjectSetString(NULL,name,OBJPROP_TEXT,text);
      ObjectSet(name,OBJPROP_COLOR,clrWhite);
      ObjectSet(name,OBJPROP_BGCOLOR,colour);

     }
  }
//+------------------------------------------------------------------+
double calculatePip(double number)
  {
   double a = Point;
   number = NormalizeDouble( (number/a) * (pipsmultiplier),Digits);
   number = number * Static_LotSize;
   return(number);
  }




//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   deleteObjects();
//----
   return(0);
  }


//+------------------------------------------------------------------+
//|   Delete CreateObjects                                           |
//+------------------------------------------------------------------+
int deleteObjects()
  {
   ObjectsDeleteAll(NULL, OBJ_VLINE); // delete all horizontal lines from the 2nd subwindow
   ObjectsDeleteAll(NULL, OBJ_RECTANGLE);
   ObjectsDeleteAll();
   return(0);
  }
//+------------------------------------------------------------------+

1 Ответ

0 голосов
/ 17 июня 2020

Так что мне нужно было добавить «BuyOrder_Bool» в Buy / SellSignalOut, и теперь он работает.

 if(BuySignal && !BuyOrder_Bool)
        {
         SquareStartPrice   = Close[i];
         SquareEndPrice = Close[i];

         BuyOrder_Bool = true;
         SellOrder_Bool = false;
         BuySignalOut_Bool = false;
        }
      if(BuySignalOut && !BuySignalOut_Bool && BuyOrder_Bool)
        {
         SquareEndPrice = Close[i];
         BuyProfit += (SquareEndPrice-SquareStartPrice);
         profit = (profit+BuyProfit);

         objcount++;
         BuyOrder_Bool = false;
         BuySignalOut_Bool=true;
         //----------
        }


      if(SellSignal && !SellOrder_Bool)
        {
         SquareStartPrice   = Close[i];
         SquareEndPrice = Close[i];

         objcount++;
         SellSquareCount++;

         BuyOrder_Bool = false;
         SellOrder_Bool = true;
         SellSignalOut_Bool = false;
        }
      if(SellSignalOut && ! SellSignalOut_Bool && SellOrder_Bool)
        {
         SquareEndPrice = Close[i];
         ObjectSet("SellSquare"+string(SellSquareCount-
         SellProfit += (SquareStartPrice-SquareEndPrice);
         profit = (profit+SellProfit);


         objcount++;
         SellOrder_Bool = false;
         SellSignalOut_Bool = true;
        }

     }

И вот весь код:

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot EmaTrend
#property indicator_label1  "EmaTrend"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlack
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
//--- plot EmaShort
#property indicator_label2  "EmaShort"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  4
//--- plot Trend
#property indicator_label3  "Trend"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrGreen
#property indicator_style3  STYLE_SOLID
#property indicator_width3  4
//--- input parameters
//input int            LookBack= 5000;
input datetime       LookBackTo = D'2020.05.01 00:00:00';
extern double        Static_LotSize=0.01;

extern string        ____Moving_Average____ = " //////////////////// ";
input int            myEmaTrend_Value       = 350;
input int            myEmaShort_Value       = 9;

extern string        ____MACD____ = " //////////////////// ";
//input bool            myMACD_Bool            = true;
input int            myMACD_FAST_EMA        =12;
input int            myMACD_SLOW_EMA        =26;
input int            myMACD_SIGNAL_SMA      =9;

extern string        ____RSI____ = " //////////////////// ";
input int            myRSI_Period           =14;
input int            myRSI_High             =70;
input int            myRSI_Low              =30;

extern string        ____DeMarker____ = " //////////////////// ";
input int            myDeMarker_Period      =14;
input double         myDeMarker_High        =0.70;
input double         myDeMarker_Low         =0.30;

extern string        ____BuySellSignalOut____= " //////////////////// ";
input bool           myEma_Bool             = true;
input bool           myRSI_Bool             = false;
input bool           myDeMarker_Bool        = false;

extern string        ____OtherSettings____= " //////////////////// ";
input bool           Vline_Bool             = false;




bool                 BuyOrder_Bool           = false;
bool                 SellOrder_Bool          = false;
bool                 BuySignalOut_Bool       = false;
bool                 SellSignalOut_Bool      = false;

double               SquareStartPrice        = 0;
double               SquareEndPrice          = 0;
double               OrderStartPrice         = 0;
double               BuyProfit               = 0;
double               SellProfit              = 0;
double               profit                  = 0;

int                  objcount=0;
int                  BuySquareCount=0;
int                  SellSquareCount=0;

color                SquareTextColor=clrBlack;
color                InfoTextColor=clrBlack;
int                  ButtonXSize      = 140;
double               pipsmultiplier;

//--- indicator buffers
double         EmaTrendBuffer[];
double         EmaShortBuffer[];
double         TrendBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,EmaTrendBuffer);
   SetIndexBuffer(1,EmaShortBuffer);
   SetIndexBuffer(2,TrendBuffer);
   deleteObjects();

   if(MarketInfo(Symbol(),MODE_DIGITS)==3 && MarketInfo(Symbol(),MODE_DIGITS)==5)
     {
      pipsmultiplier=10;
     }
   else
     {
      pipsmultiplier=1;
     }

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- initial zero
   int limit = rates_total - prev_calculated;
   ArraySetAsSeries(EmaTrendBuffer, true);
   ArraySetAsSeries(EmaShortBuffer, true);
   ArraySetAsSeries(TrendBuffer, true);
   SetLabelObject("TestPos1","TestPos1",10,40,InfoTextColor);


   int      shift=iBarShift(Symbol(),PERIOD_CURRENT,LookBackTo);                 
   Comment("BuyProfit = "+string(calculatePip(BuyProfit))+ "\n" 
            +"SellProfit = "+string(calculatePip(SellProfit))+ "\n" 
            +"SHIFT = "+string(shift)+ "\n" 
            //+"Vline_Bool = "+Vline_Bool
            );

   if(prev_calculated < 1)
     {
      ArrayInitialize(EmaTrendBuffer, 0);
      ArrayInitialize(EmaShortBuffer, 0);
      ArrayInitialize(TrendBuffer, 0);
     }
   else
      limit++;

//--- main loop
   for(int i = limit-1; i >= 0; i--)
     {
      if(i >= MathMin(shift-1, rates_total-1-50))
         continue; //omit some old rates to prevent "Array out of range" or slow calculation

      //Indicator Buffer 1
      double myEmaTrend             = iMA(Symbol(),PERIOD_CURRENT,myEmaTrend_Value,0,MODE_EMA,PRICE_CLOSE,i);
      EmaTrendBuffer[i] = myEmaTrend;
      double myEmaTrend_Prev        = iMA(Symbol(),PERIOD_CURRENT,myEmaTrend_Value,0,MODE_EMA,PRICE_CLOSE,i+1);

      double myEmaShort             = iMA(Symbol(),PERIOD_CURRENT,myEmaShort_Value,0,MODE_EMA,PRICE_CLOSE,i);
      EmaShortBuffer[i] = myEmaShort;
      double myEmaShort_Prev        = iMA(Symbol(),PERIOD_CURRENT,myEmaShort_Value,0,MODE_EMA,PRICE_CLOSE,i+1);

      double myMACD_Signal          = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_SIGNAL,i);
      double myMACD_Signal_Prev     = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_SIGNAL,i+1);


      double myMACD                 = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_MAIN,i);
      double myMACD_Prev            = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_MAIN,i+1);

      double   myRSI                = iRSI(Symbol(),PERIOD_CURRENT,myRSI_Period,PRICE_CLOSE,i);
      double   myRSI_Prev           = iRSI(Symbol(),PERIOD_CURRENT,myRSI_Period,PRICE_CLOSE,i+1);

      double   myDeMarker           =iDeMarker(Symbol(),PERIOD_CURRENT,myDeMarker_Period,i);
      double   myDeMarker_Prev      =iDeMarker(Symbol(),PERIOD_CURRENT,myDeMarker_Period,i+1);

      bool     BuyTrend = myEmaShort>myEmaTrend;
      bool     BuyTrend_Prev = myEmaShort_Prev>myEmaTrend_Prev;

      //----------
      bool     BuySignal           = BuyTrend && BuyTrend_Prev && myMACD_Prev<myMACD_Signal_Prev && myMACD>myMACD_Signal && myMACD_Prev<0 && myMACD<0;
      bool     BuySignalOut        = (myEma_Bool && BuyTrend_Prev && !BuyTrend) ||
                                     (myRSI_Bool && myRSI>myRSI_High && myRSI_Prev<myRSI_High) ||
                                     (myDeMarker_Bool && myDeMarker>myDeMarker_High && myDeMarker_Prev<myDeMarker_High);
      //----------
      bool     SellSignal          = !BuyTrend && !BuyTrend_Prev && myMACD_Prev>myMACD_Signal_Prev && myMACD<myMACD_Signal && myMACD_Prev>0 && myMACD>0;
      bool     SellSignalOut       = (myEma_Bool && !BuyTrend_Prev && BuyTrend) ||
                                     (myRSI_Bool && myRSI<myRSI_Low && myRSI_Prev>myRSI_Low) ||
                                     (myDeMarker_Bool && myDeMarker<myDeMarker_Low && myDeMarker_Prev>myDeMarker_Low);

      //----------
      ObjectSetString(NULL,"TestPos1",OBJPROP_TEXT,"Profit = "+string(calculatePip(profit)));
      //----------

      if(BuySignal && !BuyOrder_Bool)
        {
         SquareStartPrice   = Close[i];
         SquareEndPrice = Close[i];

         SetVlineObject("BuySignal"+string(objcount), Time[i], clrGreen);
         SetSquareObject("BuySquare"+string(BuySquareCount), Time[i], SquareStartPrice,Time[i], SquareEndPrice,clrGreen);

         objcount++;
         BuySquareCount++;

         BuyOrder_Bool = true;
         SellOrder_Bool = false;
         BuySignalOut_Bool = false;
        }
      if(BuySignalOut && !BuySignalOut_Bool && BuyOrder_Bool)
        {
         SetVlineObject("BuySignalOut"+string(objcount), Time[i], clrDarkGreen);
         ObjectSet("BuySquare"+string(BuySquareCount-1),OBJPROP_TIME2,Time[i]);
         SquareEndPrice = Close[i];
         ObjectSet("BuySquare"+string(BuySquareCount-1),OBJPROP_PRICE2,SquareEndPrice);
         ObjectSetString(NULL,"BuySquare"+string(BuySquareCount-1)+"text",OBJPROP_TEXT,string(calculatePip(SquareEndPrice-SquareStartPrice)));
         BuyProfit += (SquareEndPrice-SquareStartPrice);
         profit = (profit+BuyProfit);




         objcount++;
         BuyOrder_Bool = false;
         BuySignalOut_Bool=true;
         //----------
        }


      if(SellSignal && !SellOrder_Bool)
        {
         SquareStartPrice   = Close[i];
         SquareEndPrice = Close[i];

         SetVlineObject("SellSignal"+string(objcount), Time[i], clrRed);
         SetSquareObject("SellSquare"+string(SellSquareCount), Time[i], SquareStartPrice,Time[i], SquareEndPrice,clrRed);

         objcount++;
         SellSquareCount++;

         BuyOrder_Bool = false;
         SellOrder_Bool = true;
         SellSignalOut_Bool = false;
        }
      if(SellSignalOut && ! SellSignalOut_Bool && SellOrder_Bool)
        {
         SetVlineObject("SellSignalOut"+string(objcount), Time[i], clrDarkRed);
         ObjectSet("SellSquare"+string(SellSquareCount-1),OBJPROP_TIME2,Time[i]);
         SquareEndPrice = Close[i];
         ObjectSet("SellSquare"+string(SellSquareCount-1),OBJPROP_PRICE2,SquareEndPrice);
         ObjectSetString(NULL,"SellSquare"+string(SellSquareCount-1)+"text",OBJPROP_TEXT,string(calculatePip(SquareStartPrice-SquareEndPrice)));
         SellProfit += (SquareStartPrice-SquareEndPrice);
         profit = (profit+SellProfit);


         objcount++;
         SellOrder_Bool = false;
         SellSignalOut_Bool = true;
        }

     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---

  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| SetVlineObject                                                   |
//+------------------------------------------------------------------+
void SetVlineObject(string name, datetime t, color colour)
  {
   if(Vline_Bool && ObjectFind(name) == -1)
     {
      ObjectCreate(name,OBJ_VLINE,0,t,0);
      ObjectSet(name, OBJPROP_COLOR, colour);
      ObjectSet(name, OBJPROP_BACK, false);
      ObjectSet(name, OBJPROP_WIDTH, 4);
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetSquareObject                                                   |
//+------------------------------------------------------------------+
void SetSquareObject(string name, datetime t1, double P1,datetime t2, double P2,color colour)
  {
   if(ObjectFind(name) == -1)
     {
      ObjectCreate(name,OBJ_RECTANGLE,0,t1,P1,t2,P2);
      ObjectSet(name, OBJPROP_CORNER, 1);    // Reference corner
      ObjectSet(name,OBJPROP_BGCOLOR,colour);
      ObjectSet(name,OBJPROP_COLOR,colour);

      ObjectCreate(name+"text",OBJ_TEXT,0,t1,P1);
      ObjectSet(name+"text",OBJPROP_COLOR,SquareTextColor);
      ObjectSet(name+"text",OBJPROP_FONTSIZE,25);
      ObjectSet(name+"text", OBJPROP_ANCHOR,4);
     }
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetLabelObject                                                   |
//+------------------------------------------------------------------+
void SetLabelObject(string name, string text, double P1, double P2,color colour)
  {
   if(ObjectFind(name) == -1)
     {
      ObjectCreate(name,OBJ_LABEL,0,0,0);
      ObjectSetString(NULL,name,OBJPROP_TEXT,text);
      ObjectSet(name, OBJPROP_CORNER, 1);    // Reference corner
      ObjectSet(name, OBJPROP_XDISTANCE, P1);// X coordinate
      ObjectSet(name, OBJPROP_YDISTANCE, P2);// Y coordinate
      ObjectSet(name,OBJPROP_BGCOLOR,colour);
      ObjectSet(name,OBJPROP_COLOR,colour);
      ObjectSet(name,OBJPROP_FONTSIZE,25);
     }
  }

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetButtonObject                                                  |
//+------------------------------------------------------------------+
void SetButtonObject(string name,string text, double P1, double P2,color colour)
  {
   if(ObjectFind(name) == -1)
     {
      ObjectCreate(name,OBJ_BUTTON,0,0,0,0);
      ObjectSet(name, OBJPROP_CORNER, 1);
      ObjectSet(name,OBJPROP_XDISTANCE,P1);
      ObjectSet(name,OBJPROP_YDISTANCE,P2);
      ObjectSet(name,OBJPROP_XSIZE,ButtonXSize);
      ObjectSet(name,OBJPROP_YSIZE,40);
      ObjectSetString(NULL,name,OBJPROP_TEXT,text);
      ObjectSet(name,OBJPROP_COLOR,clrWhite);
      ObjectSet(name,OBJPROP_BGCOLOR,colour);

     }
  }
//+------------------------------------------------------------------+
double calculatePip(double number)
  {
   double a = Point;
   number = NormalizeDouble( (number/a) * (pipsmultiplier),Digits);
   number = number * Static_LotSize;
   return(number);
  }




//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   deleteObjects();
//----
   return(0);
  }


//+------------------------------------------------------------------+
//|   Delete CreateObjects                                           |
//+------------------------------------------------------------------+
int deleteObjects()
  {
   ObjectsDeleteAll(NULL, OBJ_VLINE); // delete all horizontal lines from the 2nd subwindow
   ObjectsDeleteAll(NULL, OBJ_RECTANGLE);
   ObjectsDeleteAll();
   return(0);
  }
//+------------------------------------------------------------------+
...