初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 480

 
こんにちは、親愛なる友人たちよ。

2つのセグメントの交点の座標を求めるアルゴリズムの翻訳を手伝ってください。

記事より

とてもシンプルですね。
x1,y1 と x2,y2 は、最初のセグメントの頂点の座標である。
x3,y3 と x4,y4 は2番目のセグメントの頂点の座標である。

というように、交点を求めるには、直線の方程式を作る必要があります。
を1次式で表す。
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
にじほうていしき
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
これらの方程式は、2点を通る直線を定義するもので、私たちが必要としているものです。
これらの式から、以下の式でxとyを求める。
x:=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
y:=((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3);
線が交差しているので、座標(x,y)を持つ共通の交点があり、それを求める必要があります。
交点が線分に属するためには、交点を拘束する、つまり条件をチェックする必要があります。
もし
(((x1<=x)and(x2>=x)and(x3<=x)and(x4 >=x))or((y1<=y)and(y2>=y)and(y3<=y) and(y4>=y)))。
であれば、これらのセグメントの交点が存在し、そうでなければ交点が存在しない。
また、これらのセグメントの平行度を角度係数を用いて確認する必要があります。
k1:=(x2-x1)/(y2-y1) です。
k2:=(x4-x3)/(y4-y3)。
ここで、k1 と k2 はセグメントの OX 軸の正の方向に対する角度の接線であり、もし k1=k2 ならばセグメントは平行であり、したがって交点がないことになる。

Готовая функция.
Код:

POINT Point_X(POINT a1,POINT a2,POINT a3,POINT a4){
        POINT T;
        if(((a1.x<=T.x)&&(a2.x>=T.x)&&(a3.x<=T.x)&&(a4.x >=T.x))||((a1.y<=T.y)&&(a2.y>=T.y)&&(a3.y<=T.y)&&(a4.y>=T.y))){
                float x1=a1.x,x2=a2.x,x3=a3.x,x4=a4.x,y1=a1.y,y2=a2.y,y3=a3.y,y4=a4.y;
                float k1,k2;
                if(y2-y1!=0){
                        k1=(x2-x1)/(y2-y1);
                        if(y4-y3!=0){
                                k2=(x4-x3)/(y4-y3);
                                if(k1!=k2){
                                        T.x=((a1.x*a2.y-a2.x*a1.y)*(a4.x-a3.x)-(a3.x*a4.y-a4.x*a3.y)*(a2.x-a1.x))/((a1.y-a2.y)*(a4.x-a3.x)-(a3.y-a4.y)*(a2.x-a1.x));
                                        T.y=((a3.y-a4.y)*T.x-(a3.x*a4.y-a4.x*a3.y))/(a4.x-a3.x);
                                        T.x*=-1;
                                        return T;
                                }else{
                                        T.x=969; T.y=969;
                                        //text2("Паралельны");
                                }
                        }else{
                                T.x=969; T.y=969;
                                //text2("Паралельны");
                        }
                }else{
                        T.x=969; T.y=969;
                        //text2("Паралельны");
                }
        }else{
                //text2("Пересечение вне отрезка");
                T.x=979; T.y=979;
                return T;
        }

}

もしかしたら、誰かがアーカイブで既製品を持っているかもしれませんね。
 
Leo59:
こんにちは、親愛なる友人たちよ。

2つの線分の交点の座標を求めるアルゴリズムの翻訳を手伝ってください。

記事より

とてもシンプルですね。
x1,y1 と x2,y2 は、最初のセグメントの頂点の座標である。
x3,y3 と x4,y4 は2番目のセグメントの頂点の座標である。

というように、交点を求めるには、直線の方程式を作る必要があります。
を1次式で表す。
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
にじほうていしき
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
これらの方程式は、2点を通る直線を定義するもので、私たちが必要としているものです。
これらの式から、以下の式でxとyを求める。
x:=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
y:=((y3-y4)*x-(x3*y4-x4*y3))/(x4-x3);
線が交差しているので、座標(x,y)を持つ共通の交点があり、それを求める必要があります。
交点が線分に属するためには、交点を拘束する、つまり条件をチェックする必要があります。
もし
(((x1<=x)and(x2>=x)and(x3<=x)and(x4 >=x))or((y1<=y)and(y2>=y)and(y3<=y) and(y4>=y)))。
であれば、これらのセグメントの交点が存在し、そうでなければ交点は存在しない。
また、これらのセグメントの平行度を角度係数を用いて確認する必要があります。
k1:=(x2-x1)/(y2-y1) です。
k2:=(x4-x3)/(y4-y3)。
ここで、k1 と k2 はセグメントの OX 軸の正の方向に対する角度の接線であり、もし k1=k2 ならばセグメントは平行であり、したがって交点がないことになる。

もしかしたら、誰かがアーカイブで用意しているかもしれませんね。

ちょっと複雑なんですが...。2m高値と2m安値の線の交点が、次のバーよりさらに上かそうでないかの定義を書きました。線が引かれたHaijs間のバー 数に対する価格差(pips)の比率であるタンジェントを用いて書きました。それに対応して、ローズの2本目の線の角の正接となる。そして、その接線を使って次のバーのポイント数を求めます。つまり、1カテの値(バーの数)を変更した逆算式を使うのです。これらのラインのテストされた点での価格値を得ることができる。そして、それに応じて、ストレートバーの価格値が小さくなれば、クロスが発生したことになります。

しかし、今のところこのインジケータを見つけることができません。

 
Leo59:

...

それとも、どなたかがアーカイブで既製品をお持ちなのでしょうか?

キムさんは、機能を投稿しました。この関数は、直線から右方向に引いたレイの点の価格を返します。

//+----------------------------------------------------------------------------+
double EquationDirect(double x1, double y1, double x2, double y2, double x) {
  return((x2==x1)?y1:(y2-y1)/(x2-x1)*(x-x1)+y1);
}
//+----------------------------------------------------------------------------+

x1 - 1行目の座標のバー,y1 - 1行目の座標の価格. x2 - 2行目の座標のバー,y2 - 2行目の座標の価格,x - 価格が返されるバー.

2つのラインそれぞれの価格を調べて、重なるかどうか...。

 
Alexeyさん、Artemさん、私の質問に丁寧に答えていただき、ありがとうございました。

ここになんとなく書いていますが...、何かがカウントされ、描かれるのですが、すべての交差点で描かれるわけではありません。私の文章に何か問題があるようだ。なんだかよくわからない。



#property indicator_separate_window
#property indicator_buffers 4

#property indicator_color1  Aqua                 // Массив 
#property indicator_width1  1
#property indicator_color2  Blue                 // Массив 
#property indicator_width2  1

#property indicator_color3  Lime                 // 
#property indicator_color4  Red                  // 


double   Buf0[];                                 // Массив
double   Buf1[];                                 // Массив

double   y1=0;                                   // Координата Значения буфера Buf0[] на баре с индексом i=2
double   y2=0;                                   // Координата Значения буфера Buf0[] на баре с индексом i=1
double   y3=0;                                   // Координата Значения буфера Buf1[] на баре с индексом i=2
double   y4=0;                                   // Координата Значения буфера Buf1[] на баре с индексом i=1

double   x1=2;                                   // Координата Времени Buf0[] на баре с индексом i=2
double   x2=1;                                   // Координата Времени Buf0[] на баре с индексом i=1
double   x3=2;                                   // Координата Времени Buf1[] на баре с индексом i=2
double   x4=1;                                   // Координата Времени Buf1[] на баре с индексом i=1

double   X=0;                                    // Точка пересечения. Координата по оси Времени
double   Y=0;                                    // Точка пересечения. Координата по оси Значения

double   k1=0;                                   // Тангенс угла наклона 1-первого отрезка
double   k2=0;                                   // Тангенс угла наклона 2-второго отрезка

double   PointX=0;                               // Значение индикатора в точке пересечения отрезков

double   UpArrow[];                              // Зелёные стрелки внизу индикаторного окна
double   DnArrow[];                              // Красные стрелки вверху индикаторного окна

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
   {
    SetIndexBuffer(0,Buf0);       
    SetIndexStyle(0,DRAW_LINE);

    SetIndexBuffer(1,Buf1); 
    SetIndexStyle(1,DRAW_LINE);
   
    SetIndexBuffer(2,UpArrow);                   // Зелёные стрелки внизу индикаторного окна
    SetIndexStyle(2,DRAW_ARROW);
    SetIndexArrow(2,233);

    SetIndexBuffer(3,DnArrow);                   // Красные стрелки вверху индикаторного окна
    SetIndexStyle(3,DRAW_ARROW);
    SetIndexArrow(3,234);
  
    return(0);
   }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
   {
    int i; 
    int limit;
    int counted_bars=IndicatorCounted();
    if(counted_bars<0) return(-1);
    if(counted_bars>0) counted_bars--;
    limit=Bars-counted_bars;

    for(i=limit; i>=0; i--)
         Buf0[i] = ....;

    for(i=limit; i>=0; i--)
         Buf1[i] = ....;

    Fun_New_Bar();
    if (New_Bar==true)
        {
         y1=Buf0_[2];
         y2=Buf0_[1];
         y3=Buf1_[2];
         y4=Buf1_[1];
         
         X=((x1*y2-x2*y1)*(x4-x3)-(x3*y4-x4*y3)*(x2-x1))/((y1-y2)*(x4-x3)-(y3-y4)*(x2-x1));
         Y=((y3-y4)*X-(x3*y4-x4*y3))/(x4-x3);

         if( ((x1<=X)&&(x2>=X)&&(x3<=X)&&(x4 >=X)) || ((y1<=Y)&&(y2>=Y)&&(y3<=Y)&&(y4>=Y)) )       // Проверка на "Пересечение линий вне отрезков"
             {
              if(y2-y1 != 0)                                                                       // Проверка 1-первого отрезка на вырождение в точку
                  {
                   k1=(x2-x1)/(y2-y1);                                                             // Тангенс угла наклона 1-первого отрезка
                   if(y4-y3 != 0)                                                                  // Проверка 2-второго отрезка на вырождение в точку
                       {
                        k2=(x4-x3)/(y4-y3);                                                        // Тангенс угла наклона 2-второго отрезка
                        if(k1 != k2)                                                               // Проверка прямых(отрезков) на параллельность
                            {
                             PointX=Y;                                                             // Значение индикатора в точке пересечения отрезков
                             if(PointX>=0) UpArrow[1]=-0.001;
                             if(PointX< 0) DnArrow[1]= 0.001;
                            }
                        //else              // Alert("Прямые(отрезки) параллельны");
                       }
                   //else              // Alert("2-второй отрезок выродился в точку");
                  }
              //else              // Alert("1-первый отрезок выродился в точку");
             }
         //else              // Alert("Пересечение вне, хотя бы одного, отрезка");
        }
    return(0);
   }
//+------------------------------------------------------------------+
void Fun_New_Bar()
   { 
    static datetime New_Time=0;
    New_Bar=false;
    if(New_Time!=Time[0])
        {
         New_Time=Time[0];
         New_Bar=true;
        }
   }
 
Leo59:
Alexeyさん、Artemさん、私の質問に丁寧に答えていただき、ありがとうございました。

ここになんとなく書いていますが...、何かがカウントされ、描かれるのですが、すべての交差点で描かれるわけではありません。私の文章に何か問題があるようだ。なんだかよくわからないけど。

今、プログラミングで何も理解できないでいるのは、今日が最愛の妻の誕生日だからだ。18歳384ヶ月。

しかし!!!線の交差はバーのINまたはOUTで起こり、価格(Y座標)はバー上でしか取得できないことに注意してください。前か後のどちらかだが、クロスオーバーポイントは必ずしも決定できない。珍しいと思いますね。以上のことを考慮して、コードを修正すると、もしかしたらうまくいくかもしれません。

 

Alexey Viktorov 2015.12.12 17:33 RU

彼女は18歳になった。

アレクセイ、これで何でもできるようになったね!ハッピーユー...。おめでとうございます。
 
TanFX:
エキスパートアドバイザーにどのようなコマンドを挿入すれば、オープンポジションを 再計算する際に、すでに設定されているテイクプロフィットを自動的に修正することができるのか、ご教示ください。あるいは、最後のセットのストップをすべて修正するスクリプトがあるのでは?
ポジションメンテナンスについてはこちら https://www.mql5.com/ru/articles/231
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
Мастер MQL5: Как написать свой модуль сопровождения открытых позиций
  • 2011.01.20
  • MetaQuotes Software Corp.
  • www.mql5.com
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный модуль управления открытыми позициями, устанавливающий уровень Stop Loss в безубыток при движении цены в благоприятном направлении, что позволяет защитить прибыль и уменьшить потери. Рассматривается структура и формат описания созданного класса для Мастера MQL5.
 

ストラテジーテスターで パターンの重みを変更できるようにするには、どのようにコードを追加すればよいか教えてください。m_pattern_0(90) 入力変数の置き換え

私はOOPが苦手で、「メンバー 関数が 定義されて いません」というエラーが出たり、コードが単純に動かなかったりするんです。

同様の未回答の質問はこちら https://www.mql5.com/ru/forum/13484

p.s. CiCustomではモデルの重みを変更できるのですが、標準クラス(CSignalEnvelopesなど)を持つ標準的な指標では、モデルごとに値を設定するメソッドがありますが、ウィザードには まだありません。
それとも、どこかにその回答があるでしょうか?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
MT4(Alpari-Demo)でデフォルト(2048ローソク足)より長い引用符のアーカイブを保存したいのですが。そこにあったものを削除して、「読み込み」を押す。
MetaQuotesのサイトから何かが読み込まれ、次のような画像が表示されます。

トップページ:データベース 2049/12358件
最後から2番目のものは2014.10.17から、最後のものは1993.07.14からです。
行方不明者はどこにいるのか?
 
Load "を押す。最後の2048小節だけが自動的に読み込まれ、残りはキックする必要があります。