MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1519

 
またまたお邪魔して申し訳ないのですが、質問が出てきました。MT4用のColor Levelインジケータがあり、そのセットにはTrendCreateトレンドラインから作成された線分があり、日付と価格の4つのアンカーポイントがあり、レベルとしてさらに伸ばす場合は、Shiftを押さなければなりません。HLineCreateのようにTrendCreateのプロパティを変更する、つまり、レベルからセグメントを持つことは可能でしょうか、あるいは、HLineCreate自体でセグメントを作る方法があるのでしょうか?セグメントをトレンドライン ではなく、レベルのように動作させるということです
 
DYM:
またまたお邪魔して申し訳ないのですが、質問が出てきました。MT4用のColor Levelというインジケータがありますが、これはTrendCreate lineから作成された線分がセットになっていて、日付と価格の4つのアンカーポイントを持ち、さらにそれをレベルとして伸ばすとShiftを押さなければなりません。HLineCreateのようにTrendCreateのプロパティを変更する、つまり、レベルからセグメントを持つことは可能でしょうか、あるいは、HLineCreate自体でセグメントを作る方法があるのでしょうか?セグメントをトレンドライン ではなく、レベルのように動作させるということです

質問が明確でない...

なぜShiftキーを押したままなのか?線は好きなように動きます。中心点によって移動しても、傾きは変わりません。

インジケーターの線の長さを変更したい場合は、コードに黄色いハイライトを追加してください

extern   int               x_coor         =  10;                  // Coordinate X
extern   int               y_coor         =  20;                  // Coordinate Y

extern   int               x_size         =  155;                 // длина объектов
 
わああああああああああああああああああああああああああああああああ問題を解決するのを手伝ってください。何が問題なのかがわからない。テスターでのテストもできていない。そこに欠けているものは何でしょうか?なぜ、矢印ではなく、ローソク足ごとに実行されるのですか?もう気が狂いそうです(((
ファイル:
123.mq4  10 kb
 
MakarFX:

質問が明確でない...

なぜShiftキーを押したままなのか?線は好きなように動きます。中心点によって移動しても、傾きは変わりません。

インジケーターの線の長さを変更したい場合は、ハイライトされた黄色の線をコードに追加します。

gifを作りましたが、1本目はトレンドラインのプロパティ、2本目はレベルのプロパティを持っています(私にはそのように見えます)。線分に2本目の線分の性質を持たせる方法を理解したいのですが。

ファイル:
line.gif  2022 kb
 
DYM:

GIFを作りましたが、1本目の線はトレンドラインのプロパティを持ち、2本目の線はレベルのプロパティを持っています(まあ、私にはそう見えますが)。線分が2本目の線分の性質を持つようになる仕組みを理解したい。

double a=ObjectGetDouble(ChartID,name,OBJPROP_PRICE1);
double b=ObjectGetDouble(ChartID,name,OBJPROP_PRICE2);
if(b!=a) ObjectSetDouble(ChartID,name,OBJPROP_PRICE2,a);
 
MakarFX:

Igorさん、ありがとうございます。しかし、MT4は正しく動作しません。


何を直せばいいのか、教えてください。

このコードで動作するはずです。

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

// plot ZigZagZZ
#property indicator_label1  "ZigZagZZ"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrDarkBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
// input parameters
input int   Deviation=10;
// indicator buffers
double         ZZBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// indicator buffers mapping
   SetIndexBuffer(0,ZZBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   SetIndexEmptyValue(0,0.0);
   //PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   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[])
  {
   static bool UP;
   static double max,min;
   static int LastExt=rates_total - 1;
   static const double dev=NormalizeDouble(Deviation*_Point,_Digits);
   int limit=LastExt;
   if(prev_calculated==0)
     {
      ArrayInitialize(ZZBuffer,0.0);
      limit = LastExt = rates_total - 1;
      if(low[0]<high[1]) { min=low[limit];  max=high[limit - 1];   UP=true;  }
      else               { max=high[limit]; min  = low[limit - 1]; UP=false; }
     }
   for(int i=limit; i>=0; i--)
     {
      ZZBuffer[i]=0.0;
      if(UP)
        {
         if(low[i]-min<=0.0) { min=low[i]; ZZBuffer[LastExt]=0.0; LastExt=i; ZZBuffer[i]=min; }
         else
           {
            if(high[i]-min-dev>0.0) { max=high[i]; LastExt=i; ZZBuffer[i]=max; UP=false; }
           }
        }
      else
        {
         if(high[i]-max>=0.0) { max=high[i]; ZZBuffer[LastExt]=0.0; LastExt=i; ZZBuffer[i]=max; }
         else
           {
            if(low[i]-max+dev<0.0) { min=low[i]; LastExt=i; ZZBuffer[i]=min; UP=true; }
           }
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

このコードで動作するはずです。

ありがとうございました。全てうまくいった...あとは理屈を考えてみる(ジグザグ構造が私には難しい)。
 
MakarFX:
本当にありがとうございました。あとはロジックを考える(ジグザグを作るのは難しくて理解できない)。

確認せず、実行したところ、描画されました。

ロジックは簡単で、いずれかの条件が発生したバーの数を探し、それをコードに格納します。

static int LastExt

で、このバーと次のバーを比較し、ブレイクインフェーズであれば、このバーを静的 int LastExt に記憶させることになります。

 
Igor Makanu:

確認せず、実行したところ、描画されました。

ロジックは簡単で、いずれかの条件が発生したバーの数を探し、それをコードに格納します。

格納 し、このバーと次のバーを比較し、位相が途切れた場合は静的 int LastExt

今、私の頭の中ですべてが整列しています)イゴールさん、ありがとうございました。

 
MakarFX:

困っています。price1というアンカー ポイントは理解できるのですが、条件の作り方がわかりません。私のバリアントが効かないんです。

extern ENUM_LINE_STYLE  line_st   =  STYLE_SOLID;         // 9. Стиль линий
extern int              line_wd   =  2;                   // 10. Толщина линий
// Координаты
extern int x_coor = 7;    // Сдвиг по оси X
extern int y_coor = 10;    // Сдвиг по оси Y
//-- глобальные переменные
string line[6] = {"line_1","line_2","line_3","line_4","line_5","line_6"};

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
  
   datetime dt1     = 0;
   double   price1  = 0;
   datetime dt2     = 0;
   double   price2  = 0;
   int      window   = 0;
   int      x        = 0;
   int      y        = 0;

//+------------------------------------------------------------------+
   //--- Клик по 1 линии
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickObject=sparam;
      if(clickObject==line[0])
        {
         string name="line_"+IntegerToString(MathRand()+100,0,' ');

         y=210;
         ChartXYToTimePrice(0,x_coor+25,y,window,dt1,price1);
         ChartXYToTimePrice(0,x_coor+157,y,window,dt2,price2);

         TrendCreate(0,name,0,dt1,price1,dt2,price2,color2,line_st,line_wd,false,true,false,false,false,0);
         
           price1=ObjectGetDouble(id,name,OBJPROP_PRICE1);
           price2=ObjectGetDouble(id,name,OBJPROP_PRICE2);
             if(price2!=price1) 
           {
            ObjectSetDouble(id,name,OBJPROP_PRICE2,price1);
           }

        }
     }
}
//+------------------------------------------------------------------+