初学者的问题 MQL5 MT5 MetaTrader 5 - 页 480

 
亲爱的朋友们,大家好!

请帮助翻译寻找两条线段的交点坐标的算法

摘自文章。

这很简单!
x1,y1和x2,y2是第一段的顶点的坐标。
x3,y3和x4,y4是第二段的顶点的坐标。

为了找到交点,我们要做直线的方程。
第一个方程式。
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
第二方程
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
这些方程定义了一条通过两点的直线,这就是我们需要的。
从这些方程中,我们通过以下公式找到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))或((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:
亲爱的朋友们,大家好!

请帮助翻译寻找两条线段的交点坐标的算法

摘自文章。

这很简单!
x1,y1和x2,y2是第一段的顶点的坐标。
x3,y3和x4,y4是第二段的顶点的坐标。

为了找到交点,我们要做直线的方程。
第一个方程式。
(x-x1)/(x2-x1)=(y-y1)/(y2-y1);
第二方程
(x-x3)/(x4-x3)=(y-y3)/(y4-y3);
这些方程定义了一条通过两点的直线,这就是我们需要的。
从这些方程中,我们通过以下公式找到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))或((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,那么线段是平行的,因此没有交集点。

也许有人在档案馆里有一个现成的?

这有点复杂...我写了线的交集的定义,一个是2米的高点,另一个是2米的低点,比下一个柱子还要远,或者不远。我是用切线来写的,即以点为单位的价差与画线的Haijs之间的条数 之比。相应地,它是第二线角在低点的正切。然后我用切线找到下一个条形的点数,也就是说,我用逆向公式,用改变了的一个猫头鹰的值(条形的数目)。我们在这些线的测试点获得价格值。而相应地,如果直条的价格值较小,则发生了交叉。

但到目前为止,我还没有找到这个指标。

 
Leo59:

...

或者有人在档案馆里有一个现成的?

Kim发布了一个功能。该函数返回从直线向右绘制的射线的点的价格。

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

x1 - 第一行坐标的小节,y1 - 第一行坐标的价格。 x2 - 第二行坐标的小节,y2 - 第二行坐标的价格,x - 返回价格的小节。

你可以找到两条线各自的价格,看看它们是否重叠...

 
非常感谢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个月。

但是!!!请注意,线条的交叉可以发生在条形图内或条形图外,而价格(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等),为每个模型设置数值的方法在哪里,但在Wizard 中还没有
,或者在某个地方有答案?

о значимости моделей
о значимости моделей
  • www.mql5.com
Значимость каждой рыночной модели, заложенной с сигнал, задаётся в конструкторе класса. - - Категория: общее обсуждение
 
我想在MT4(Alpari-Demo)中保存一个比默认值(2048个烛台)更长的报价档案。我删除了那里的东西,然后按 "加载"。
将从MetaQuotes网站加载一些东西,我得到以下图片。

顶部:数据库2049/12358条记录。
倒数第二张是2014年10月17日的,最后一张是1993年7月14日的。
失踪的人在哪里?
 
按 "加载"。只有最后的2048条被自动加载,其余的必须被踢掉。