Erros, bugs, perguntas - página 1793

 
fxsaber:

E é possível escrever uma tal função?

Sim, é necessário implementar um construtor e um operador de cópia
 
Slawa:

Há um erro no desenho do tipo DRAW_CANDLES depois de o actualizar: faço tudo como aqui descrito: https://www.mql5.com/ru/forum/23/page19#comment_2891050

Não é possível alterar o tipo de construção (1-2-3), seleccionando através de parâmetros de entrada. Código:

#property indicator_separate_window
#property indicator_plots 1
#property indicator_buffers 4                          
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Перечисление - новые типы отрисовки DRAW_CANDLE
enum ENUM_DRAW_CANDLE_TYPE
  {
   DRAW_CANDLE_TYPE_1,            // Один цвет: #1 - контуры и тела
   DRAW_CANDLE_TYPE_2,            // Два цвета: #1 - контуры, #2 - тела
   DRAW_CANDLE_TYPE_3             // Три цвета: #1 - контуры, #2 - восход., #3 - нисход.
  };
//---
double bufopen[];
double bufhigh[];
double buflow[];
double bufclose[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input ENUM_DRAW_CANDLE_TYPE inpDrawCandleStyle=DRAW_CANDLE_TYPE_1;
input color inpClr1 = clrWhite;
input color inpClr2 = clrLime;
input color inpClr3 = clrRed;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Привязываем буферы
   SetIndexBuffer(0,bufopen,INDICATOR_DATA);
   SetIndexBuffer(1,bufhigh,INDICATOR_DATA);
   SetIndexBuffer(2,buflow,INDICATOR_DATA);
   SetIndexBuffer(3,bufclose,INDICATOR_DATA);
//--- Устанавливаем тип графического построения
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_CANDLES);
//--- Устанавливаем пустые значения в буферах
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- Устанавливаем цвета индикатора
   switch(inpDrawCandleStyle) // В зависимости от типа построения свечей
     {
      case DRAW_CANDLE_TYPE_1:                                          // Если все свечи одним цветом
         ////--- Устанавливаем количество цветов стиля (не помогает)
         //PlotIndexGetInteger( 0, PLOT_COLOR_INDEXES, 1 );
         //---
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,inpClr1);
         break;
      case DRAW_CANDLE_TYPE_2:                                          // Если контуры цветом #1, а тела - цветом #2
         ////--- Устанавливаем количество цветов стиля (не помогает)
         //PlotIndexGetInteger( 0, PLOT_COLOR_INDEXES, 2 );
         //--- Устанавливаем цвет индикатора
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,inpClr1);
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,inpClr2);
         break;
      case DRAW_CANDLE_TYPE_3:                                          // Если контуры цветом #1, восх - #2, нисх - #3
         ////--- Устанавливаем количество цветов стиля (не помогает)
         //PlotIndexGetInteger( 0, PLOT_COLOR_INDEXES, 3 );
         //--- Устанавливаем цвет индикатора
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,inpClr1);
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,inpClr2);
         PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,inpClr3);
         break;
      default:                                                         // Если тип построения не определен
         Print(__FUNCTION__,": ОШИБКА! Неизвестный тип построения свечей '"+EnumToString(inpDrawCandleStyle)+"'");
         return(INIT_FAILED);                                          // Выходим с ошибкой
     }
//---
   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[])
  {
//---
   if(prev_calculated<=0)
      for(int i=0; i<rates_total; i++)
        {
         bufopen[ i ] = open[ i ];
         bufhigh[ i ] = high[ i ];
         buflow[i]=low[i];
         bufclose[i]=close[i];
        }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Especificamente - o primeiro tipo (velas + contornos primeira cor) funciona bem, não muda para os outros.

Adicionado:

Se definir cores via directiva de pré-processador - tudo bem, mas depois também impossível de alterar o tipo de desenho DRAW_CANDLES.

Список изменений в билдах MetaTrader 5 Client Terminal
Список изменений в билдах MetaTrader 5 Client Terminal
  • www.mql5.com
Автоматическое обновление доступно через систему LiveUpdate:.
 
Комбинатор:
Sim, precisamos de implementar um construtor e um operador de cópia
Infelizmente, esta solução funciona apenas para estrutura personalizada. No exemplo da MqlTradeRequest.
 
Alexey Kozitsyn:

Há um erro no desenho do tipo DRAW_CANDLES depois de o actualizar: faço tudo como aqui descrito: https://www.mql5.com/ru/forum/23/page19#comment_2891050

Não é possível alterar o tipo de construção (1-2-3), seleccionando através de parâmetros de entrada. Código:

Tem um erro no seu código, deve usar PlotIndexSetInteger:

         ////--- Устанавливаем количество цветов стиля (не помогает)
         PlotIndexSet Integer( 0, PLOT_COLOR_INDEXES, 3 );
 
fxsaber:
Infelizmente, esta solução funciona apenas para estrutura personalizada. No exemplo da MqlTradeRequest.
Em seguida, passar a estrutura por referência em parâmetros. Outra opção é fazer a sua própria cópia da estrutura e fundi-la, mas temos de pensar como torná-la agradável.
 
Anton:
Tem um erro no seu código, deve usar PlotIndexSetInteger:

         ////--- Устанавливаем количество цветов стиля (не помогает)
         PlotIndexSet Integer( 0, PLOT_COLOR_INDEXES, 3 );
Caramba, certo, obrigado!
 
Комбинатор:
Em seguida, passar a estrutura por referência nos parâmetros. Outra opção é fazer a sua própria cópia da estrutura e do elenco, mas tem de pensar em como fazê-lo de forma simpática.
Não percebo.
 
fxsaber:
Não percebo.
struct MyTradeRequest
{
  // копия MqlTradeRequest
  // + нужные операторы
};

// ...
MyTradeRequest request = Function();
MqlTradeResult = {0};
OrderSend((MqlTradeRequest)request, result);
// ...
É apenas uma ideia, pode haver erros, eu escrevi directamente no browser
 
Комбинатор:
struct MyTradeRequest
{
  // копия MqlTradeRequest
  // + нужные операторы
};

// ...
MyTradeRequest request = Function();
MqlTradeResult = {0};
OrderSend((MqlTradeRequest)request, result);
// ...
É apenas uma ideia, pode haver erros, eu escrevi directamente no browser
Percebo a ideia. Mas esse tipo de fundição não vai funcionar, pois não?
 
fxsaber:
Percebo a ideia. Mas esse tipo de fundição não vai funcionar.
Porque não?