Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1034

 
Alexandr Sokolov:

Спасибо! А если для коммерческих целей?

для маркета в смысле ?

тогда самому для себя монстрячить GUI-библиотеку по образу и подобию :-(

имеющиеся хромают каждая по своему.. ну не предназначен MQL для сложных GUI. Его дело считать и торговать, он под это заточен

То есть сделать можно, но это мучительно тупо.

 

Решил изучать библиотеку CCanvas


Не могу понять - ошибок нет (точнее компилятор их не выдаёт), и на экране тоже ничего нет. Хочу нарисовать красный треугольник ...

#include <Canvas\Canvas.mqh>

#property copyright "Alexandr Sokolov"
#property link      "https://www.mql5.com/en/users/asokolov7"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
CCanvas canvas;
//-------------------------------------------------------------------------------------------------
int OnInit()
  {
   bool a = canvas.Create("a",600,400,0);
   canvas.FillTriangle(100,100,80,120,120,120,clrRed);
   canvas.Update(true); Alert(a);
   return(INIT_SUCCEEDED);
  }
//-------------------------------------------------------------------------------------------------
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[])
  {
   
   return(rates_total);
  }


А вот что в итоге


 
Alexandr Sokolov:

Решил изучать библиотеку CCanvas

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

#include <Canvas\Canvas.mqh>

CCanvas canvas;
int xtr[3] = {2, 100, 198};
int ytr[3] = {198, 2, 198};
const uint clrtr = ColorToARGB(clrRed);

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   if(!canvas.CreateBitmapLabel(0, 0, "canvasname", 10, 10, 200, 200)) return(INIT_FAILED);
   canvas.Erase();
   canvas.FillTriangle(xtr[0], ytr[0], xtr[1], ytr[1], xtr[2], ytr[2], clrtr);
   canvas.Update();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   canvas.Destroy();
}
//+------------------------------------------------------------------+
//| 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[])
{
//---

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
 
Igor Makanu:

Спасибо за готовый пример

Если не трудно, можно несколько слов о моих ошибках? Просто я смотрел справку на сайте, и в документации есть только описание самих функций, а примеров ниже какая функция после какой там нет

 
Alexandr Sokolov:

Спасибо за готовый пример

Если не трудно, можно несколько слов о моих ошибках? Просто я смотрел справку на сайте, и в документации есть только описание самих функций, а примеров ниже какая функция после какой там нет

почитайте статьи, там много готовых примеров  https://www.mql5.com/ru/search#!keyword=Canvas&module=mql5_module_articles

 

Добрый день!!!

Хочу попробовать написать ф-ция для запоминания убыточных ордеров по профиту, лоту и тикету.
С массивами до этого не работал, делал по образцу и справки.

Не понятно где и как указывать размер массива.

Посмотрите, по возможности поправьте.  

 ======

struct StructOrder

  {

   double            OrProf;

   double            OrLot;

   int               OrTiK;

  };

StructOrder  OrBuy[];

StructOrder  OrSell[];

====

void Cloce_No_FreeMargin()

  {

   double profit_SELL      = 0;

   double profit_BUY       = 0;

   double no_profits_BUY   = 0;

   double no_profits_SELL  = 0;

   double cur_profits_SELL = 0;

   double cur_profits_BUY  = 0;

//--- 

   int bo = 0;

   int so = 0;

   InitStruct_Order(OrBuy);

   InitStruct_Order(OrSell);

   //ArrayResize(OrBuy,bo);

   //ArrayResize(OrSell,so);

   for(int trade= OrdersTotal()-1; trade>= 0; trade--)

     {

      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==false)

         break;

      if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

        {

         if(OrderType()==OP_SELL)

           {

            profit_SELL+=OrderProfit()+OrderSwap()+OrderCommission(); 

           }

         if(OrderType()==OP_BUY)

           {

            profit_BUY+=OrderProfit()+OrderSwap()+OrderCommission(); 

           }

         //===========================================================

         if(OrderType()==OP_SELL)

           {

            cur_profits_SELL=OrderProfit()+OrderSwap()+OrderCommission();

            if(cur_profits_SELL<0)

              {

               no_profits_SELL+=cur_profits_SELL;

               OrSell[so].OrProf = OrderProfit()-OrderSwap()-OrderCommission();

               OrSell[so].OrLot  = OrderLots();

               OrSell[so].OrTiK  = OrderTicket();

               so++;

               Print(" Тип SELL:   Профит -  ",OrBuy[bo].OrProf,":  Лот -  ",OrBuy[bo].OrLot,":  Тикет -  ",OrBuy[bo].OrTiK);

              }

           }

         //===========================================================

         if(OrderType()==OP_BUY)

           {

            cur_profits_BUY=OrderProfit()+OrderSwap()+OrderCommission();

            if(cur_profits_BUY<0)

              {

               no_profits_BUY+=cur_profits_BUY;

               OrBuy[bo].OrProf = OrderProfit()-OrderSwap()-OrderCommission();

               OrBuy[bo].OrLot  = OrderLots();

               OrBuy[bo].OrTiK  = OrderTicket();

               bo++;

               Print(" Тип BUY:   Профит -  ",OrBuy[bo].OrProf,":  Лот -  ",OrBuy[bo].OrLot,":  Тикет -  ",OrBuy[bo].OrTiK);

              }

           }

        }

     }

  }

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

//| Init Struct  для ордеров                                         |

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

void InitStruct_Order(StructOrder &Masiv[])

  {

   int Size = ArrayRange(Masiv,0);


   for(int i=0; i<Size; i++)

     {

      Masiv[i].OrProf = 0;

      Masiv[i].OrLot  = 0;

      Masiv[i].OrTiK  = 0;

     }

  }

 

Привет, 

Подскажите, пожалуйста, как собрать проект состоящий из mq4-файла и множества mqh-файлов в один, для маркета ?

 

Друзья, помогите запрограммировать в советнике через iCustom разворот индикатора, состоящего из одной линии, но разными цветами для бай и селл. Стрелок у него нет. Для цвета есть вроде три буфера, но по сути при наведении мышкой показывает только одно значение Value1 для обоих цветов. Пробовал и бары сравнивать и с нулем сравнивать, не помогает. Как программировать развороты таких индикаторов, кто знает? Вот начальные настройки буферов индюка и его картинка. Он похож на StepMA, но это не он: 

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 DodgerBlue
#property indicator_color2 Tomato
#property indicator_color3 Tomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
extern int    Range           = 9;
extern int    FastMA          = 3;
extern int    SlowMA          = 30;
extern int    filter          = 25;
extern int    normalizeDigits = 4;

extern bool   alertsOn        = false;
extern bool   alertsOnCurrent = false;
extern bool   alertsMessage   = true;
extern bool   alertsSound     = true;
extern bool   alertsEmail     = false;
extern string soundfile       = "alert2.wav";


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];

//------------------------------------------------------------------
//
//------------------------------------------------------------------

int init()
  {
   for (int i=0; i<indicator_buffers; i++) SetIndexStyle(i,DRAW_LINE);
   IndicatorBuffers(6);
   SetIndexBuffer(0, fAMA); 
   SetIndexBuffer(1, Downa); 
   SetIndexBuffer(2, Downb); 
   SetIndexBuffer(3, trend); 
   SetIndexBuffer(4, mAMA);
   SetIndexBuffer(5, AMA);
   return(0);
}
int deinit()
{
   return(0);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------


int start()
{
   int counted_bars = IndicatorCounted(); 
      if (counted_bars < 0) return(-1); 
      if (counted_bars > 0) counted_bars--;  
         int limit=MathMin(Bars-counted_bars,Bars-1);
         if (trend[limit] == -1) ClearPoint(limit,Downa,Downb);

 
   
   double k1 = 2.0 / (SlowMA + 1);
   double k2 = 2.0 / (FastMA + 1) - k1;
   for(int i = limit; i>= 0; i--)
   {
      double sdAMA = 0;
      double Noise = 0; for(int k=0; k<Range; k++) Noise += MathAbs(Close[i+k] - Close[i+k+1]);
      double ER    = 0; if(Noise != 0) ER = MathAbs(Close[i] - Close[i+Range]) / Noise;
      double SSC   = (ER*k2+k1);
 
     
      
      AMA[i]  = AMA[i+1] + NormalizeDouble(SSC*SSC*(Close[i] - AMA[i+1]), normalizeDigits);
      mAMA[i] = AMA[i];
 
         if(filter < 1) fAMA[i] = mAMA[i];
         else
         {
            for(k = i; k <= i + SlowMA - 1; k++)  sdAMA = sdAMA + MathAbs(mAMA[k] - mAMA[k+1]);
               double dAMA  = mAMA[i] - mAMA[i+1];
               if(dAMA >= 0)
                  if(dAMA < NormalizeDouble(filter*sdAMA/(100*SlowMA),4) &&  High[i] <= High[Highest(NULL, 0, MODE_HIGH, 4, i)]+10*Point)
                         fAMA[i] = fAMA[i+1];
                  else   fAMA[i] = mAMA[i];
               else
                  if(MathAbs(dAMA) < NormalizeDouble(filter*sdAMA/(100*SlowMA),4) && Low[i] > Low[Lowest(NULL, 0, MODE_LOW, 4, i)]-10*Point)
                        fAMA[i] = fAMA[i+1];
                  else  fAMA[i] = mAMA[i];
         }
       
      Downa[i] = EMPTY_VALUE;
      Downb[i] = EMPTY_VALUE;
      trend[i] = trend[i+1];
         if (fAMA[i]> fAMA[i+1]) trend[i] =1;
         if (fAMA[i]< fAMA[i+1]) trend[i] =-1;
         if (trend[i]==-1) PlotPoint(i,Downa,Downb,fAMA);
   }
    
   //
  
      
   if (alertsOn)
   {
      if (alertsOnCurrent)
           int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
      if (trend[whichBar] == 1)
            doAlert("buy");
      else  doAlert("sell");       
   }
   return(0);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//


void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
      if (previousAlert != doWhat || previousTime != Time[0]) {
          previousAlert  = doWhat;
          previousTime   = Time[0];

          //
          //
          

          message =  StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," AMA STL_Color ",doWhat);
             if (alertsMessage) Alert(message);
             if (alertsEmail)   SendMail(StringConcatenate(Symbol()," AMA STL_Color "),message);
             if (alertsSound)   PlaySound(soundfile);
      }
}
      
//------------------------------------------------------------------
//
//------------------------------------------------------------------


void ClearPoint(int i,double& first[],double& second[])
{
   if ((second[i]  != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE))
        second[i+1] = EMPTY_VALUE;
   else
      if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE))
          first[i+1] = EMPTY_VALUE;
}
void PlotPoint(int i,double& first[],double& second[],double& from[])
{
   if (first[i+1] == EMPTY_VALUE)
      if (first[i+2] == EMPTY_VALUE) 
            { first[i]  = from[i]; first[i+1]  = from[i+1]; second[i] = EMPTY_VALUE; }
      else  { second[i] = from[i]; second[i+1] = from[i+1]; first[i]  = EMPTY_VALUE; }
   else     { first[i]  = from[i]; second[i]   = EMPTY_VALUE; }
} 

 
zig2003:

Друзья, помогите запрограммировать в советнике через iCustom разворот индикатора, состоящего из одной линии, но разными цветами для бай и селл. Стрелок у него нет. Для цвета есть вроде три буфера, но по сути при наведении мышкой показывает только одно значение Value1 для обоих цветов. Пробовал и бары сравнивать и с нулем сравнивать, не помогает. Как программировать развороты таких индикаторов, кто знает? Вот начальные настройки буферов индюка и его картинка. Он похож на StepMA, но это не он: 


Вставляйте код, пожалуйста, при помощи кнопки  Кнопка "Вставить MQL5 код"

 
zig2003:

Друзья, помогите запрограммировать в советнике через iCustom разворот индикатора, состоящего из одной линии, но разными цветами для бай и селл. Стрелок у него нет. Для цвета есть вроде три буфера, но по сути при наведении мышкой показывает только одно значение Value1 для обоих цветов. Пробовал и бары сравнивать и с нулем сравнивать, не помогает. Как программировать развороты таких индикаторов, кто знает? Вот начальные настройки буферов индюка и его картинка. Он похож на StepMA, но это не он: 


Пример

DRAW_COLOR_LINE Lite Example

индикатора на базе DRAW_COLOR_LINE. Два индикаторных буфера - один для значений ('ColorLineBuffer'), а второй для цвета (' ColorLineColors').

//+------------------------------------------------------------------+ 
//|                                         DRAW_COLOR_LINE Lite.mq5 | 
//|                        Copyright 2016, MetaQuotes Software Corp. | 
//|                                             https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 

#property description "An indicator to demonstrate DRAW_COLOR_LINE" 
#property description "It draws a line on Close price in colored pieces of 20 bars each" 
#property description "The width, style and color of the line parts are changed randomly" 
#property description "every N ticks" 

#property indicator_chart_window 
#property indicator_buffers 2 
#property indicator_plots   1 
//--- plot ColorLine 
#property indicator_label1  "ColorLine" 
#property indicator_type1   DRAW_COLOR_LINE 
//--- Define 5 colors for coloring each bar (they are stored in the special array) 
#property indicator_color1  clrBlue,clrRed // (Up to 64 colors can be specified) 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  3 
//--- A buffer for plotting 
double         ColorLineBuffer[];
//--- A buffer for storing the line color on each bar 
double         ColorLineColors[];
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
//--- Binding an array and an indicator buffer 
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorLineColors,INDICATOR_COLOR_INDEX);
//---
   ArraySetAsSeries(ColorLineBuffer,true);
   ArraySetAsSeries(ColorLineColors,true);
//--- 
   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[])
  {
   ArraySetAsSeries(close,true);
   if(prev_calculated==0)
     {
      for(int i=0;i<rates_total;i++)
         ColorLineBuffer[i]=close[i];
     }
//--- Block for calculating indicator values 
   for(int i=0;i<10;i++)
     {
      //--- Write the indicator value into the buffer 
      ColorLineBuffer[i]=close[i];
      //--- For this bar, the line will have the color with the index color_index 
      if(ColorLineBuffer[i]>ColorLineBuffer[i+1])
         ColorLineColors[i]=0;
      else
         ColorLineColors[i]=1;
     }

//--- Return the prev_calculated value for the next call of the function 
   return(rates_total);
  }
//+------------------------------------------------------------------+


И советник, копирует значения с буфера номер '0' ('ColorLineBuffer') и номер '1' ('ColorLineColors').

//+------------------------------------------------------------------+
//|                                 DRAW_COLOR_LINE Lite Example.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
int    handle_iCustom;                       // variable for storing the handle of the iCustom indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(Symbol(),Period(),"DRAW_COLOR_LINE Lite");
//--- if the handle is not created
   if(handle_iCustom==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double array_value[],array_color[];
   ArraySetAsSeries(array_value,true);
   ArraySetAsSeries(array_color,true);
   int start_pos=0,count=1;
   if(!iGetArray(handle_iCustom,0,start_pos,count,array_value) ||
      !iGetArray(handle_iCustom,1,start_pos,count,array_color))
     {
      return;
     }
//---
   string text="Value: "+DoubleToString(array_value[0],8)+", color: "+DoubleToString(array_color[0],8);
   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • www.mql5.com
В своей статье  я сделал достаточно убедительные тесты, доказывающие тот факт, что далеко не каждый вызов пользовательского или даже технического индикатора в коде - это самый оптимальный вариант для обработки им промежуточных расчетов в разрабатываемом индикаторе. Итоговый результат по скорости своего исполнения может оказаться значительно...