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

 
xrust писал (а)>>
もう一つ質問ですが、私が自分の関数で、いわば標準化のために、あなたの構文と変数名を使っても構いませんか?

自分が正しいと思うことをする。

 

SetLabel()関数です。

この関数は、現在のチャートにOBJ_LABEL テキストラベルオブジェクトを設定します。

  • nm- オブジェクトの名前です。必須パラメータです。
  • tx- テキスト.必須パラメータです。
  • cl- マーカーの色。必須パラメータです。
  • xd- 基準となる角度に対するピクセル単位のX座標.必須パラメータです。
  • yd- データム角度を基準にしたピクセル単位のY座標.必須パラメータです。
  • cr- 参照角度番号.有効な値:0 左上1 右上2 左下3 右下。初期値は0 です。
  • fs- フォントサイズ.初期値は9 です。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
 

SetLabel()の使用例です。

  • 左上隅に3つの青いテキストラベル、フォント9。
    SetLabel("Label1", "Текстовая метка", Blue, 5, 15);
    SetLabel("Label2", "Ещё одна текстовая метка", Blue, 5, 30);
    SetLabel("Label3", "Параметр cr=0", Blue, 5, 45);

  • 上に紫色のテキストラベルを3つ、フォント12。
    SetLabel("Label1", "Текстовая метка", Magenta, 5, 15, 1, 12);
    SetLabel("Label2", "Ещё одна текстовая метка", Magenta, 5, 30, 1, 12);
    SetLabel("Label3", "Параметр cr=1", Magenta, 5, 45, 1, 12);

  • 右下に緑色のテキストラベル3枚、フォント12。
    SetLabel("Label1", "Текстовая метка", Green, 5, 15, 3, 12);
    SetLabel("Label2", "Ещё одна текстовая метка", Green, 5, 30, 3, 12);
    SetLabel("Label3", "Параметр cr=3", Green, 5, 45, 3, 12);


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

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

inluder」ファイル(mqh)を作成し(おそらく「trade」と「other」の2つ)、その名前に合意して、「開発者」に強制的に配布物に含ませる。

アイデアを殺すことはできない、統合には長い時間がかかる。プロではない私の夢は、一般のユーザーに意思決定だけを任せ、ソフトウェアの複雑さから解放することです。

イゴールの開発したもの(その一貫性とディテールの見事さ)は、これに限りなく近いものであった。さらに、著者はプログラミングだけでなく、常に自分の作品をキープしています。

実際の取引で アドバイザーが活躍し、コードの実用的な価値を高めています。

Igorの開発したものをmqh-framingする可能性や、そのような実装の利点と欠点について、Igorの意見を聞くのは興味深いことです。

 
granit77 писал (а)>>
Igorの開発のmqhデザインの可能性、そのような実装の利点と欠点についてのIgorの意見を知りたいです。

可能性について...

MQHのファイルは以前からやってもらっていたのですが...。まだ掲載はしていませんが...。エースがいるんだ...。最後の和音は...全機能を掲載し、mqh-filesを掲載して総括する。

長所と短所...

MQH-fileは便利です。異なるExpert Advisorで使用することができます。特定のEAのコードが大幅に削減されます。むき出しのロジックといくつかのものだけが残され、ガジェットやラッピングはすべて外に出ています。

しかし、私はmqh-filesをほとんど使わず、基本的に1つしか使いません。stdlib.mqhなんです。Expert Advisorのファイルに必要な関数を全てコピーしています。そのほうが、私には便利なんです。この習慣は、注文の多い仕事をしていたときに、しばしば1つまたは別のmqhファイルをクライアントに送信するのを忘れてしまったときに身につきました。さらに、1つのEAファイルの後にinludeの山全体をドラッグするのではなく、異なるターミナルフォルダにコピーしたいのです。

 
喜びだけではありません!愉快です!このようなライブラリーを持たないディストリビューションが不完全とみなされる日もそう遠くはないだろう。
 

もしかしたら、便利な関数で、記事http://www.kroufr.ru/content/view/1027/124/ に書かれている注文の開始を 行うことができるスクリプトがあるかもしれません。

ない場合は、どこで手に入るかアドバイスしてください。 .

 

CrossPointOfLines()関数です。

この関数は、2本の直線の交点の座標を計算する。各直線は、その点の座標の組で定義される。3つの配列がパラメータとして関数に渡されます。

  • x- 横座標の配列.x[0],x[1]- 1行目の横軸,x[2],x[3]- 2行目の横軸の4 要素で構成される。
  • y- 座標の配列.y[0],y[1]- 1行目の縦座標,y[0],y[1]- 2行目の縦座標。
  • t- 2つの直線の交点を示す座標の配列.関数が正常に実行されると,この配列には2つの 要素が含まれます:t[0] は求められた2直線の交点の横軸,t[1] は同じ交点の縦軸です.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Вычисляет координаты точки пересечения двух прямых.            |
//|             Каждая прямая задаётся парой координат своих точек.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив абсцисс              x[0], x[1] - первая прямая              |
//|                                    x[2], x[3] - вторая прямая              |
//|    y - массив ординат              y[0], y[1] - первая прямая              |
//|                                    y[0], y[1] - вторая прямая              |
//|    t - массив искомых координат    t[0]       - абсцисса                   |
//|                                    t[1]       - ордината                   |
//+----------------------------------------------------------------------------+
void CrossPointOfLines(double& x[], double& y[], double& t[]) {
  double z=(y[3]-y[2])*(x[1]-x[0])-(y[1]-y[0])*(x[3]-x[2]);
  ArrayResize(t, 2);
  ArrayInitialize(t, 0.0);

  if (z==0) Print("CrossPointOfLines(): Не удалось найти точку пересечения!");
  else {
    double xy1=x[1]*y[0]-x[0]*y[1];
    double xy2=x[3]*y[2]-x[2]*y[3];
    t[0]=NormalizeDouble((xy1*(x[3]-x[2])-xy2*(x[1]-x[0]))/z, 0);
    t[1]=(xy1*(y[3]-y[2])-xy2*(y[1]-y[0]))/z;
  }
}
 

CrossPointOfLines()関数の使用例です。

CrossPointOfLines()関数の使用例として、従来から私のスクリプトを提供しています(添付ファイル参照)。スクリプトが正しく動作するためには、現在のチャートに、垂直、水平、トレンドのいずれかのタイプの2本の交差する線を引く必要があります。そして、そのスクリプトをチャートに添付してください。このスクリプトは、2本の線の交点で左の価格をマーク する結果となります。

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

ファイル:
 

SetRegression()関数です。

この関数は、現在のチャートの線形回帰チャネルのOBJ_REGRESSION オブジェクトを設定します。

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