错误、漏洞、问题 - 页 1793

 
fxsaber:

那么有没有可能写出这样一个函数呢?

是的,你需要实现一个构造器和复制操作符
 
Slawa:

更新后,在绘图类型DRAW_CANDLES中出现了一个错误:我按照这里的描述做了一切:https://www.mql5.com/ru/forum/23/page19#comment_2891050

不能通过输入参数的选择来改变构建类型(1-2-3)。代码。

#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);
  }
//+------------------------------------------------------------------+

具体来说--第一种类型(蜡烛+轮廓线第一种颜色)工作正常,它不会切换到其他类型。

已添加。

如果你通过预处理器指令 设置颜色--一切正常,但也无法改变绘图类型DRAW_CANDLES。

Список изменений в билдах MetaTrader 5 Client Terminal
Список изменений в билдах MetaTrader 5 Client Terminal
  • www.mql5.com
Автоматическое обновление доступно через систему LiveUpdate:.
 
Комбинатор:
是的,我们需要实现一个构造器和复制操作符
不幸的是,这个解决方案只对自定义结构有效。在MqlTradeRequest 的例子中。
 
Alexey Kozitsyn:

更新后,在绘图类型DRAW_CANDLES中出现了一个错误:我按照这里的描述做了一切:https://www.mql5.com/ru/forum/23/page19#comment_2891050

不能通过输入参数的选择来改变构建类型(1-2-3)。代码。

你的代码中有一个错误,你应该使用PlotIndexSetInteger

         ////--- Устанавливаем количество цветов стиля (не помогает)
         PlotIndexSet Integer( 0, PLOT_COLOR_INDEXES, 3 );
 
fxsaber:
不幸的是,这个解决方案只对自定义结构有效。在MqlTradeRequest 的例子中。
然后在参数中通过引用传递结构。另一个选择是自己制作结构的副本并铸造它,但我们必须考虑如何使它好看。
 
Anton:
你的代码中有一个错误,你应该使用PlotIndexSetInteger

         ////--- Устанавливаем количество цветов стиля (не помогает)
         PlotIndexSet Integer( 0, PLOT_COLOR_INDEXES, 3 );
天啊,对了,谢谢!
 
Комбинатор:
然后在参数中通过引用传递该结构。另一个选择是自己制作结构和演员的副本,但你必须考虑如何做得漂亮。
我不明白。
 
fxsaber:
我不明白。
struct MyTradeRequest
{
  // копия MqlTradeRequest
  // + нужные операторы
};

// ...
MyTradeRequest request = Function();
MqlTradeResult = {0};
OrderSend((MqlTradeRequest)request, result);
// ...
这只是一个想法,可能有错误,我直接在浏览器中写的
 
Комбинатор:
struct MyTradeRequest
{
  // копия MqlTradeRequest
  // + нужные операторы
};

// ...
MyTradeRequest request = Function();
MqlTradeResult = {0};
OrderSend((MqlTradeRequest)request, result);
// ...
这只是一个想法,可能有错误,我直接在浏览器中写的
我明白这个意思。但这种选拔方式是行不通的,不是吗?
 
fxsaber:
我明白这个意思。但这种选拔方式是行不通的。
为什么不呢?