KimIVの便利な機能 - ページ 33

 

SetVLine()関数を使用します。

この関数は、現在のチャートにOBJ_VLINE オブジェクトの垂直線を設定します。

  • cl- VERTICAL LINE オブジェクトの色.オブリガードパラメーター。
  • nm- オブジェクト名.デフォルト値である"" が渡された場合、現在のバーのオープン時間がオブジェクト名として使用される。
  • t1- オブジェクト設定時間。デフォルト値 -0- 現在のバーのオープン時間。
  • st- 線のスタイル.有効な値は、STYLE_SOLID(デフォルト)、STYLE_DASHSTYLE_DOTSTYLE_DASHDOT です。
  • wd- 線幅.初期値は1 です。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2008                                                     |
//|  Описание : Установка объекта OBJ_VLINE вертикальная линия                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время                      (0  - время открытия текущего бара)     |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (1  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetVLine(color cl, string nm="", datetime t1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_VLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1, t1);
  ObjectSet(nm, OBJPROP_COLOR, cl);
  ObjectSet(nm, OBJPROP_STYLE, st);
  ObjectSet(nm, OBJPROP_WIDTH, wd);
}
 

SetVLine()の使用例です。

  1. 現在のバー上の青い実線の
    SetVLine(Aqua);
  2. 8小節目にライラック色の太い線が入る
    SetVLine(Magenta, "", Time[8], STYLE_SOLID, 3);
  3. バー上の点線のグリッド 14:00。
    for (int i=0; i<7; i++) {
      datetime dt=StrToTime((TimeToStr(TimeCurrent()-i*1440*60, TIME_DATE))+" 14:00");
      int nb=iBarShift(NULL, 0, dt, True);
      SetVLine(Coral, "VLine"+i, Time[nb], STYLE_DOT);
    }

SZY. SetVLine()関数をテストするスクリプトを添付します。

ファイル:
 
Geronimo писал (а)>>

EXECUTIVE(エグゼクティブ>> 私はそうするつもりです。

写真を見せて、作ってみよう。

 
TheXpert писал (а)>>

図に示す、やってみよう。

RSIやミッドラインなど、インジケータで記述された領域を計算するカスタム関数です。

中央線より下の曲線と中央線自体に囲まれた空間は面積-S1、中央線より上は+S2である。

https://www.mql5.com/ru/forum/109590、干渉しないように投稿しています。

 

SetTLine()関数です。

この関数は、現在のチャートにOBJ_TREND トレンドラインオブジェクトを設定します。

  • cl- TREND LINE オブジェクトの色.必須パラメータである。
  • nm- オブジェクト名。デフォルト値である"" を渡すと、現在のバーのオープン時間が名前として使用されます。
  • t1- オブジェクト設定時間の最初の座標.デフォルト値 -0- 10小節目のオープニング時間。
  • p1- 価格を設定するオブジェクトの最初の座標.初期値 -0- 10本目のバーの最小値。
  • t2- オブジェクト設定時間の第2座標.デフォルト値 -0- 現在のバーのオープン時間。
  • p2- オブジェクト設定価格の2番目の座標.デフォルト値 -0- 現在のバーが低い。
  • ry- BLUEプロパティのフラグ。 デフォルト値はFalse です。
  • st- 線のスタイル.有効な値は、STYLE_SOLID(デフォルト)、STYLE_DASHSTYLE_DOTSTYLE_DASHDOT です。
  • wd- 線幅.初期値は1 です。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
 

SetTLine()の使用例です。

  1. 15本目と現在のバーの最小値を通るオレンジ色の実線。
    SetTLine(Orange, "", Time[15], Low[15], 0, Low[0], True);
  2. 35本目と10本目の高値を通る赤いトレンドライン
    SetTLine(Red, "", Time[35], High[35], Time[10], High[10]);
  3. 前々日の高値を抜くライラック太線
    datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
    datetime d1=TimeCurrent()-24*60*60;
    while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
    d1=StrToTime(TimeToStr(d1, TIME_DATE));
    datetime d2=d1-24*60*60;
    while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
    d2=StrToTime(TimeToStr(d2, TIME_DATE));
    int b2=iBarShift(NULL, 0, d2);     // номер бара начала второго дня
    int b1=iBarShift(NULL, 0, d1);     // номер бара начала первого дня
    int b0=iBarShift(NULL, 0, d0);     // номер бара начала текущего дня
    int n2=iHighest(NULL, 0, MODE_HIGH, b2-b1-1, b1);
    int n1=iHighest(NULL, 0, MODE_HIGH, b1-b0-1, b0);
    datetime t1=Time[n2];
    double   p1=High[n2];
    datetime t2=Time[n1];
    double   p2=High[n1];
    SetTLine(Magenta, "", t1, p1, t2, p2, True, STYLE_SOLID, 3);

HH. SetTLine()関数をテストするためのスクリプトを添付します。

ファイル:
 

イゴール、私はより経験豊富なMQL4コーダーとしてあなたに声をかけているのです。

私は、コホネンのネットワーク用のライブラリを書き始めました。

できるだけ柔軟で便利なものにしたいのですが、まだ乗り越えられない瞬間に直面しています。

例1.

int& value; // так нельзя, интересует аналог на MQL4, если он есть
 
void AssignValue(int& newValue)
{
   value = newValue;
}
 
void SetValue(int newValue)
{
   value = newValue;
}
 
int init()
{
   int someValue = 5;
   AssignValue(someValue);
   SetValue(10);
   Print(someValue); // очень хочется, чтобы вывелось 10
}

MQL4でこのようなことは可能ですか?



例2:

void SetSize(double& matrix[][], int inSize, int outSize)
{
    // требуется установить размеры матрицы, не осилил
}
 
void Init(double& matrix[][])
{
    // допустим, требуется проиниализировать всю матрицу значением 1, также не осилил
}

繰り返しになりますが、可能であれば、コードを教えてください。この例は実現可能だと思います。



よろしくお願いします。

 
TheXpert писал (а)>>
最も柔軟で便利なものにしたいのですが、まだ乗り越えられない瞬間に直面しています。
>> 例1.
MQL4ツールで可能か、また可能な場合はどのように可能か?

ポインターを使った仕事の整理をしたいというのはよくわかります。ある変数が別の変数を指し示すように...。それとも、私が勘違いしているのでしょうか?何が必要なのか、言葉で説明してみてください。

TheXpert さんが書き込みました >>1
例2:
繰り返しになりますが、もし可能であれば、そのコードを教えてください。この例は、実装可能だと思われます。
void start()
{
  double arr[3][2];
  Init(arr);
  for (int i=0; i<3; i++)
  {
    for (int j=0; j<2; j++)
    {
      Print("arr[",i,"][",j,"]=",arr[i][j]);
    }
  }
}
void Init(double& matrix[][])
{
  ArrayInitialize(matrix, 1);
}
 
KimIV писал (а)>>

ポインターを使った仕事の整理をしたいというのはよくわかります。ある変数が別の変数を指し示すように...。それとも、私が勘違いしているのでしょうか?何が必要なのか、言葉で説明してみてください。

はい、そんな感じです。


2つ目について -- ランダムな値で初期化するのはどうでしょうか?

はい、また、私は正確に動的な配列が必要です。

 
TheXpert писал (а)>>
ええ、そんな感じです。

MQL4でのポインターは厄介です。直接のサポートはありません。ここの掲示板で、配列でやろうとした人がいたような気がします。これ以上ないくらい正確です。自分で探す。

TheXpert さんが書きました(a) >>。
2つ目についてですが、ランダムな値で初期化するのはどうでしょうか?

MathRand()

TheXpert さんが書きました(a) >>。
ああ、あと、正確には動的配列が必要なんだ。
プログラムで変更できるのは、配列の1次元目のみです。ArrayResize() 関数を使用します。2次元、3次元、4次元は厳密に設定する必要があります。