отображения Баланс/Средства через Canvas

 

Всем привет! Есть советник mql5, отображает тики на графике через Canvas! Вот интересует вопрос... вместо тиков отображать текущий баланс и средства... как его реализовать? Да в рунете полно индикаторов и советников, но меня интересует как реализовать через Canvas)))

Пример тикового советника реализованного через Canvas polyline и FillCircle. Спасибо!

#include <Canvas\Canvas.mqh>
CCanvas Chart;

int scale_width=8;       //расстояние в пикселях между точками
color clr_ask = clrRed;  //цвет ask
color clr_bid = clrBlue; //цвет bid

MqlTick tick_array[];
int x_p[];
int y_p[];

int widtn_chart=0;
int height_chart=0;
int tick_in_chart=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ChartSetInteger(0,CHART_SHOW_DATE_SCALE,false);
   ChartSetInteger(0,CHART_SHOW_PRICE_SCALE,false);

   Chart.CreateBitmapLabel("Chart",20,20,300,435,COLOR_FORMAT_XRGB_NOALPHA);
   Chart.Erase(ColorToARGB(clrBlack));
   Chart.Update(true);

   tick_in_chart=widtn_chart/scale_width;
   ArrayResize(tick_array,tick_in_chart);
   ArraySetAsSeries(tick_array,true);

   ArrayResize(x_p,tick_in_chart);
   ArrayResize(y_p,tick_in_chart);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Chart.Destroy();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(widtn_chart!=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS) || 
      height_chart!=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS))
     {
      widtn_chart=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
      height_chart=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);

      Chart.CreateBitmapLabel("Chart",20,20,300,435,COLOR_FORMAT_ARGB_NORMALIZE);
      Chart.Erase(ColorToARGB(clrBlack));
      Chart.Update(true);

      tick_in_chart=300/1;
      ArrayResize(tick_array,tick_in_chart);
      ArraySetAsSeries(tick_array,true);

      ArrayResize(x_p,tick_in_chart);
      ArrayResize(y_p,tick_in_chart);
     }

   Chart.Erase(ColorToARGB(clrBlack));

   CopyTicks(_Symbol,tick_array,COPY_TICKS_INFO);

   double max = -1.0;
   double min = DBL_MAX;

   for(int i=0; i<tick_in_chart; i++)
     {
      if(tick_array[i].ask > max) max = tick_array[i].ask;
      if(tick_array[i].bid < min) min = tick_array[i].bid;
     }

   double delta=max-min;

//ask   
   for(int i=0; i<tick_in_chart; i++)
     {
      y_p[i]=int(435-435*(tick_array[i].ask-min)/delta);

      if(i==0)
         x_p[i]=300-8*5;
      else
         x_p[i]=x_p[i-1]-20;

      Chart.FillCircle(x_p[i],y_p[i],3,ColorToARGB(clr_ask));
     }

   Chart.Polyline(x_p,y_p,ColorToARGB(clr_ask));

//bid
   for(int i=0; i<tick_in_chart; i++)
     {
      y_p[i]=int(435-435*(tick_array[i].bid-min)/delta);

      if(i==0)
         x_p[i]=300-8*8;
      else
         x_p[i]=x_p[i-1]-8;

      Chart.FillCircle(x_p[i],y_p[i],3,ColorToARGB(clr_bid));
     }

   Chart.Polyline(x_p,y_p,ColorToARGB(clr_bid));

//выводим на экран
   Chart.Update(true);
  }
//+------------------------------------------------------------------+
//| Обработка событий
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      OnTick();
     }
  }
//+------------------------------------------------------------------+
 
Aibek Mugiynov:

Пример тикового советника реализованного через Canvas polyline и FillCircle. Спасибо!

Круто! Канвас для тикового графика никто не делал. Спасибо за идею!

Вы хотите потиковый график эквити отображать через Канвас? 

 
Anton Zverev:

Круто! Канвас для тикового графика никто не делал. Спасибо за идею!

Вы хотите потиковый график эквити отображать через Канвас? 

нет, дневной график баланса
 
Aibek Mugiynov:
нет, дневной график баланса
tick_array-данные замените на историю баланса.
 
Anton Zverev:
tick_array-данные замените на историю баланса.
вот как это сделать не знаю... не получается что-то
 
Aibek Mugiynov:
вот как это сделать не знаю... не получается что-то
Бежите по истории от конца к началу, отнимая профиты и записывая время.
 
Anton Zverev:
Бежите по истории от конца к началу, отнимая профиты и записывая время.
мне пример нужен)) а так я не пойму)) с простыми линиями сделал бы, но с канвасом немного трудно, не пойму че и как!
 
Aibek Mugiynov:
мне пример нужен)) а так я не пойму)) с простыми линиями сделал бы, но с канвасом немного трудно, не пойму че и как!
А канвас не при чем. Замените CopyTicks на другую функцию, что баланс записывает вместо тиков. И ничего больше по коду менять не надо.
 
Вы знаете как? Хотя бы пример какой-нить, а то я не скоро реализую  функцию)
 
Aibek Mugiynov:
Вы знаете как? Хотя бы пример какой-нить, а то я не скоро реализую  функцию)
Если вам нужно понять, как составить массив значений баланса, то поиск поможет. Если же канвас смущает, то по одним лишь только названиями можно разобраться, что делает исходник.
 

Что-то я не так делаю... вчера работала, сейчас не работает... в Графике Canvas всё отображалась потом исчезло... сейчас ничего, а внизу индикатор работает без проблем! Ребята подскажите что тут исправить? Спасибо! индикатор Mql4

//+------------------------------------------------------------------+
//|                                                testindicator.mq4 |
//|                      Copyright © 2016, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
color clr_ask = clrRed;  //цвет ask
color clr_bid = clrBlue; //цвет bid

#property indicator_buffers 1
#property indicator_color1 Red
#include <Canvas\Canvas.mqh>
CCanvas Chart;
//---- buffers
double ExtMapBuffer[];
double MaxBuffer[];
double MinBuffer[];
int x_p[];
int y_p[];

int widtn_chart=0;
int height_chart=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexStyle(0,DRAW_LINE,0,2);
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexShift(0, 1);

   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Chart.Destroy();
//----
   return(0);
  }
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i=0, j=0, accTotal=OrdersHistoryTotal(), currentTotal = OrdersTotal(), tt = OrderProfit();  
   double AE = 0;

   ExtMapBuffer[0] = AccountBalance();
   ExtMapBuffer[1] = AccountBalance();

   {
     for(i=0; i<accTotal; i++)
     {
         if (!OrderSelect(accTotal-i-1,SELECT_BY_POS,MODE_HISTORY)) continue;
         if (OrderSymbol() != Symbol()) continue;
         if (OrderType() == 6) continue;
         AE += (OrderProfit() + OrderSwap());
     }
     ExtMapBuffer[0] = AE;
     ExtMapBuffer[1] = AE;
   }

  j++;
   

  for(i=0; i<accTotal; i++)
    {
      if (OrderSelect(accTotal-i-1,SELECT_BY_POS,MODE_HISTORY))
      {
         if ((OrderSymbol() != Symbol())) continue;
         ExtMapBuffer[j+1] = ExtMapBuffer[j] -OrderProfit();
         j++;
      }
    }

   if(widtn_chart!=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS) || 
      height_chart!=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS))
     {
      widtn_chart=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
      height_chart=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);

      Chart.CreateBitmapLabel("Chart",20,20,350,500,COLOR_FORMAT_ARGB_NORMALIZE);
      Chart.Erase(ColorToARGB(clrBlack));
      Chart.Update(true);
      ArrayResize(ExtMapBuffer,tt);
      ArraySetAsSeries(ExtMapBuffer,true);
      ArrayResize(x_p,15);
      ArrayResize(y_p,15);
     }

   Chart.Erase(ColorToARGB(clrBlack));



//ask   
      for(i=0; i<15; i++)
     {
      y_p[i]=int(100-500*(ExtMapBuffer[i]));

      if(i==0)
         x_p[i]=350-10;
      else
         x_p[i]=x_p[i-1]-20;

      Chart.FillCircle(x_p[i],y_p[i],3,ColorToARGB(clr_ask));
     }

   Chart.Polyline(x_p,y_p,ColorToARGB(clr_ask));
//выводим на экран
   Chart.Update(true);
  

   return(0);

  }


//+------------------------------------------------------------------+