エラー、バグ、質問 - ページ 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);
  }
//+------------------------------------------------------------------+

具体的には、最初のタイプ(キャンドル+輪郭の最初の色)は問題なく動作し、他のタイプに切り替わりません。

追加されました。

プリプロセッサー指令で 色を設定した場合、すべてOKですが、描画タイプ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:
なるほどと思いました。でも、そんなキャスティングではうまくいきません。
なぜダメなのか?