Slippage-robust Gaze Tracking for Near-eye Display

论文:Slippage-robust Gaze Tracking for Near-eye Display

中文:基于滑动鲁棒的近眼显示器凝视跟踪

地址:2210.11637v1.pdf (arxiv.org)https://arxiv.org/pdf/2210.11637v1.pdf


目录

摘要

1 介绍

2 相关工作

3 系统概述

A 硬件设置

B  特征检测

 4 方法

A 眼球光轴估计

B  眼球位置估计

C  近眼显示器中抗滑鲁棒的视线估计

5 评估

A 数据收集

B 眼球位置估计的结果

C 注视估计

6 总结


摘要

        近年来,头戴式近眼显示设备已成为虚拟现实和增强现实的关键硬件基础。因此,头戴式视线跟踪技术作为人机交互的重要组成部分已经受到关注。然而,头戴式设备(HMD)的不可避免的滑动经常导致较高的注视跟踪误差并且阻碍HMD的实际使用。针对这一问题,提出了一种基于非球面眼球模型的滑动鲁棒视线跟踪近眼显示方法,精确计算眼球光轴和旋转中心。我们测试了几种方法的数据集与滑动和实验结果表明,所提出的方法显着优于以前的方法(几乎两倍的次优方法)。

1 介绍

        随着虚拟世界的繁荣,对增强、虚拟和混合现实(AR、VR和MR)的需求正在迅速增加。头戴式近眼显示器作为所有三种技术的硬件基础,将虚拟场景投射到人眼上,并创建沉浸式环境。尽管已经探索了包括抓握和键盘在内的各种交互方法,但是眼睛注视运动仍然是HMD中最自然的交互方式。因此,头戴式近眼注视跟踪技术在人机交互中显示出良好的潜力。

       基于基本环境中人类注视模式的知识,已经研究了图形渲染和显示中基于注视的改进。此外,人的注视直接表示人的感知和注意,这适合于人机交互。凝视线索已经被用于人类和智能系统之间的交互,并且已经在具有凝视跟踪实现的AR/VR设备上进行了类似的交互研究。结果表明,基于凝视的交互承诺更高的交互质量,速度和更友好的用户体验。不幸的是,在常见的AR/VR应用场景中,身体运动和头部运动在实际使用过程中不断存在,这导致不可避免的HMD滑动,并且轻微的滑动通常会导致头戴式设备的注视估计误差显著增加。大多数商业眼动仪也遭受由滑动引起的准确度降低。已经研究了在滑动后保持注视准确性的方法,结果显示了头戴式注视跟踪中头戴式装置滑动的鲁棒性。然而,滑动鲁棒方法的总体注视估计准确度低于大多数现有技术的方法,并且仅适用于有限的用途。

       在这项工作中,我们提出了一种基于非球面眼睛模型的眼球光轴和位置估计方法。然后,我们提出了一个视线跟踪几何模型的近眼显示器估计场景注视点。特别地,我们建立了一个低成本的硬件设备来验证我们的滑动鲁棒的近眼显示的凝视跟踪方法。我们对9名受试者进行了实验,并要求他们重新安装并反复旋转设备,以模拟实际使用中的滑动。实验结果表明,我们的方法优于现有方法100%,角偏移从1.51 Ω减小到0.76 Ω。

2 相关工作

       通常,注视点跟踪包括两个分支:数据驱动法模型驱动法。数据驱动的方法直接将眼球图像映射到注视点,而模型驱动的方法依赖于眼球模型和相关的光学知识。广泛使用的眼睛模型是勒格朗模型【Le Grand model】,如图1所示。勒格朗模型【Le Grand model】将角膜视为球体并忽略角膜折射。它非常适合远程凝视跟踪,因为模型中的近似不会在眼球检测中引入显著错误。然而,在近显示装置中,这种误差是不可忽略的。在头戴式视线跟踪中,眼球必须处于正确的位置,以获得理想的视觉外观和角度。假眼位置可能会导致VR中的图像失真和MR中的对象未对准。

(1:角膜;2:前眼房;3:晶状体;4:玻璃体;5:Optical axis光轴;6:kappa angle;7:visual axis视觉轴)

标图1.简化眼球模型。光轴包含瞳孔中心P、角膜中心C和眼球旋转中心E。视轴与光轴在角膜中心相交,它们之间的角度定义为kappa角。题

        在HMD注视点跟踪中,需要更精确的眼球模型来修正建模误差。例如,Nitschke提出了一种新的眼睛位置估计方法。Y. Itoh提出了一种用于眼睛位置采集的无交互AR校准方法。然而,预定义的眼球参数引入了人与人之间的偏差。在凝视跟踪中也讨论了利用眼睛姿态估计眼球旋转中心,但是结果高度依赖于瞳孔轮廓跟踪。此外,还有瞳孔中心和角膜中心的研究。在头戴式系统中,针对各种人的鲁棒眼球位置估计仍然是一个问题。

       头戴式凝视估计是实现凝视近眼显示的基础。大多数现有的头戴式注视跟踪方法的缺陷是缺乏滑动鲁棒性。在通常使用期间,头戴式设备与眼睛之间的轻微相对移动是不可避免的。在实际的头戴式系统中,应实现在考虑滑动的情况下保持高注视估计精度。

       基于模型的视线跟踪方法通常被认为是设计滑动的鲁棒性,但复杂的系统校准和相对较低的准确性使这些方法不那么出名。由PupilLab 提出的最先进的基于特征的凝视估计方法实现了低于0.6◦的平均角度误差。已经研究了PupilLab眼动仪和VR系统的组合。然而,该方法纯粹依赖于2D瞳孔特征,并且对滑动高度敏感。普遍接受的滑动鲁棒注视跟踪方法Grip 使用基于模型的特征(光轴)和基于特征的注视映射模型。显示了具有滑动鲁棒性的可接受的注视精度。基于端到端学习的注视估计方法被证明在发生耳机滑动时是鲁棒和准确的,但是模型训练是数据消耗的,并且需要用户收集大量的校准数据。

       近年来,头戴式视线跟踪中的滑动问题已经成为一个重要的研究课题,越来越多的研究工作已经意识到滑动鲁棒性的重要性。然而,很少有作品讨论了滑动鲁棒的近眼显示器注视跟踪。

3 系统概述

       本节介绍了我们的近眼显示系统的视线跟踪,其中我们构建了可以捕获眼睛图像、提取特征并具有光学透视显示器的硬件设备。图2示出了用于近眼显示器的滑动鲁棒注视跟踪的工作流程。

图2. 建议系统概述。(a)用眼动仪实现的所提出的近眼显示系统的硬件原型。(b)对于每只眼睛,有两个近焦红外摄像头来捕获眼睛图像,并且每个眼睛摄像头周围的六个红外LED用于生成角膜反射闪光。在原型中实现了双目光学透视显示器作为近眼显示器。(c)要求受试者注视前方车辆。在眼睛图像中显示瞳孔中心和光轴检测结果。(d)受试者可以在一定范围内移动和旋转HMD。视线跟踪的结果保持高度准确。注视点估计结果在所显示的图像中被可视化为红色圆圈。用于注视估计演示的场景图像来自svl-simulator(https://www.svlsimulator.com/)。

A 硬件设置

       我们的头显原型包括近眼显示器,4个眼睛摄像头捕捉640×480pix2的眼睛图像,和850 nm红外LED。

       基于我们提出的眼睛模型,确定眼球光轴需要一个虚拟的瞳孔中心和一个包含眼睛摄像头中心的角膜表面法向量。可以在眼睛图像中捕获虚拟瞳孔中心。通过光源的角膜反射与眼睛摄像头中心重合,可以得出包含眼睛摄像头中心的角膜表面法向量。然而,在眼睛相机内实现光源在物理上是不可实现的。在我们的原型中,眼睛摄像头周围的6个红外LED用于生成角膜反射闪烁。一组闪烁的质心近似地提供光源的反射位置与眼睛相机中心重合。

(1:角膜;2:前眼房;3:晶状体;4:玻璃体;5:Optical axis光轴;6:kappa angle;7:visual axis视觉轴)

标图1.简化眼球模型。光轴包含瞳孔中心P、角膜中心C和眼球旋转中心E。视轴与光轴在角膜中心相交,它们之间的角度定义为kappa角。题

       在原型中实现了双目光学透视显示器作为近眼显示器。两个单目显示器都显示1920×1080pix2的图像,双目视野为44◦。

B  特征检测

       眼睛图像中的原始特征检测包括闪烁检测和瞳孔检测。

       闪烁看起来是眼睛图像中具有特殊图案的几个小的明亮区域。简单的阈值和形态学方法将给予闪烁的质心结果。从所收集的数据观察到的问题是隐形眼镜可能导致闪烁失真。由隐形透镜的边缘或隐形眼镜的不光滑表面反射的闪光可能导致闪光检测中的误差。

       瞳孔检测是视线跟踪技术中的一项成熟技术。我们采用径向对称变换来检测粗略的瞳孔中心星爆算法来检测瞳孔边缘PURE 选择瞳孔边缘并拟合瞳孔椭圆。由于眼睛图像是在近红外波段捕获的,因此环境光照对图像质量的影响较小,并且瞳孔检测保持准确。图3中给出了瞳孔检测结果的若干范例。

图3.(a)完整的瞳孔,(B)部分被眼睑覆盖的瞳孔,(c)佩戴隐形眼镜的眼睛的瞳孔的特征检测结果。

 4 方法

A 眼球光轴估计

       眼科学发现角膜的平均非球面系数Q=−0.3,这要归功于角膜的自然扁长非球面性将球面像差减少了一半。角膜数学建模为:

x^{2} + y^{2} + \left ( Q + 1 \right )\ast z^{2} = r^{2}\; \left ( 1 \right )

       z轴是眼睛的旋转轴和光轴。我们提出的眼睛模型结合了Nagamatsu模型和Lai模型的优点,考虑了非球面角膜表面和角膜屈光。

       所提出的光轴计算模型的示意图如图4所示。将角膜表面视为旋转椭圆体,旋转轴是眼球光轴Optical axis,因此,角膜表面的法向量与眼球光轴在3D空间中相交。考虑到角膜屈光,眼睛图像中的瞳孔是屈光虚像。根据光学原理,可以很容易地证明折射平面包含虚拟瞳孔中心、眼睛相机中心和光轴。因此,由角膜表面法向量、眼睛相机中心和虚拟瞳孔中心确定的平面包含眼球光轴Optical axis

(5:Optical axis光轴)

图4。提出的眼球光轴计算模型示意图。瞳孔中心P被角膜折射,并且在P'处成像在眼睛相机图像平面上。假设红外LED与眼睛相机中心OC重合。角膜反射G在G'处成像。由OcP'和OcG'确定的平面包含光轴。

       两个上述平面在光轴处相交。通过上述算法可以检测出眼睛图像中的瞳孔中心和角膜反射闪烁。使用校准的眼睛相机,将获得3D线O_{C}P{}'O_{C}G{}'。因此,包含眼球光轴的平面的法向量\overrightarrow{n}为 

\overrightarrow{n} = O_{C}P{}' \times O_{C}G{}'\; \left ( 2 \right )

       此外,利用捕获一个眼球的立体眼相机,获得包含光轴的两个平面,并且法向量分别表示为\overrightarrow{n_{1}}\overrightarrow{n_{2}}。那么光轴的方向矢量为 

OA= \overrightarrow{n_{1}}\times \overrightarrow{n_{2}}\; \left ( 3 \right )

B  眼球位置估计

       由于眼球旋转中心是光轴上的点,并且如果设备不漂移则是相对于眼睛相机的固定点,因此计算多个眼球姿态的光轴的交点是估计眼球旋转中心的方式。眼球旋转中心E到随机光轴OA_{i}的距离为d_{i}

d_{i}= \frac{\left \| EM_{i}\times OA_{i} \right \|}{\left \| EM_{i} \right \|}\; \left ( 4 \right )

       M_{i}是线OA_{i}上的随机点。E的估计等价于以下优化

E^{\star}=\underset{E}{\arg \min } \sum_{i \in\jmath }d_{i}\; \left ( 5 \right )

       其中\jmath是无滑移的所有光轴的指数集,E^{\star }是E的最佳估计,结果如图5所示,蓝色光轴线与红色中心相交。

图五.眼球光轴和旋转中心。蓝线表示受试者注视校准标记时的光轴。红点表示离所有光轴线最近的点,作为眼球旋转中心的估计。

        显然,E^{\star }不能用单个光轴获得。我们仅精确地获得光轴方向和相机闪烁方向。光轴与角膜反射线和眼睛相机中心的交点提供了线索。对于角膜非球面度的数学模型等式1。在图4中,G{}''是光轴和O_{C}G{}'的交点。

图4。提出的眼球光轴计算模型示意图。瞳孔中心P被角膜折射,并且在P'处成像在眼睛相机图像平面上。假设红外LED与眼睛相机中心OC重合。角膜反射G在G'处成像。由OcP'和OcG'确定的平面包含光轴。

       E和G{}''之间的距离L为

L=t+(1-p) \frac{r}{\sqrt{p}} \frac{1}{\sqrt{p \tan ^2 \theta+1}}\; \left ( 6 \right )

        其中θ是光轴与O_{C}G{}'的角度,其可以在每帧中获得。t是角膜的椭圆中心和眼球的旋转中心之间的距离。设p = Q+1,因此p、t和r是每个单独角膜的常数值参数。考虑泰勒级数展开式,方程6可以重写成更简单的形式: 

L=k_1+k_2 \tan ^2 \theta\; \left ( 7 \right )

        在校准期间,可以估计k_{1}k_{2},应用这些参数将产生具有一个光轴和任何数据帧的估计的眼睛中心。实验测得的距离L与角度之间的关系如图6所示,实际数据表明了该方法的正确性。

【图6 Ltan^{2}\theta的关系。这里,L是图4中所示的EG{}''的距离,θ是光轴与O_{C}G{}'的角度。我们可以看到EG{}''tan^{2}\theta是线性关系。】

C  近眼显示器中抗滑鲁棒的视线估计

       注视方向由视轴表示。在估计光轴的情况下,要求用户注视标记并校准用户的kappa角是大多数眼睛跟踪器中的常见做法。为了校准光轴和视轴之间的差异,需要预先获得眼睛相机坐标和场景坐标之间的3D变换。不幸的是,校准眼睛相机和近眼显示系统之间的关系是一个巨大的挑战,因为我们不能在近眼显示器周围放置标记并像普通的基于屏幕的眼睛跟踪器那样校准,或者像头戴式场景相机那样捕获真实的场景图像。然而,我们仍然可以将近眼显示器建模为捕获图像的虚拟场景相机,该图像是显示图像。注视估计公式为

\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\lambda\left[\begin{array}{ccc} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array}\right]\left(\boldsymbol{R}\left(d_e V A+T\right)\right),\; \left ( 8 \right )

       [u, v]^T是近眼显示图像上的注视点,\lambda是归一化系数,f_{x}f_{y}c_{x}c_{y}是虚拟相机的固有参数,VA是眼球视轴,d_{e}是虚拟图像到眼球的距离,E是眼球旋转中心,并且R是从眼睛相机到虚拟相机坐标的变换。预期公式由可测量的变量(例如OA和E)组成。基于kappa角,VA将被OA和kappa角(待校准的个人参数)替代。由于虚拟相机位置与眼睛位置相关,因此平移向量T将由眼球位置E和校准期间的眼球位置E_{calib}代替。因此,等式8可以被变换为

\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\lambda\left[\begin{array}{ccc} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array}\right] \boldsymbol{R}\left(\boldsymbol{R}_{\text {kappa }} O A+\frac{1}{d_e}\left(E-E_{\text {calib }}\right)\right),\; \left ( 9 \right )

       R_{kappa} 是由kappa角产生的旋转矩阵,并且d_{e}是系统相关参数。在校准期间,可以估计RR_{kappa},在测试期间,我们使用眼球滑动E-E_{calib}来校正注视估计。注意,虚拟相机的固有参数可以通过近眼显示器视场参数和显示器分辨率来近似计算。上述等式提供了注视点与单眼光轴之间的关系。由于在我们的系统中双眼的近眼显示器中示出的图像是相同的,所以双眼注视估计可以简单地通过以下方式获得:

\left[\begin{array}{l} u_{\text {bino }} \\ v_{\text {bino }} \end{array}\right]=\frac{1}{2}\left(\left[\begin{array}{l} u_l \\ v_l \end{array}\right]+\left[\begin{array}{l} u_r \\ v_r \end{array}\right]\right),\, \; \left ( 10 \right )

       其中 \left[u_l, v_l\right]^T\left[u_r, v_r\right]^T分别是用左眼光轴和右眼光轴估计的注视点。通过对两个单眼结果求平均,双眼注视估计被期望更稳健和稳定。

5 评估

        受限于硬件差异和我们的方法缺乏一致的数据集,公共数据集不适合评估过程。为了评估所提出的方法,我们收集了一些不同的主题的数据。进行实验以证明眼球定位方法的有效性,并评估注视跟踪方法在具有头戴式设备滑动的情况下收集的数据上的性能。本节给出了数据收集过程、实验和结果分析的详细信息。

A 数据收集

       总共有9名受试者(4名女性和5名男性)在21至27岁之间参加了实验。本实验中的所有受试者具有正常或矫正至正常的视力。所有受试者均签署了知情同意书。研究方案由参与大学的机构审查委员会批准。

        为确保所有受试者正确佩戴头戴式耳机,要求其在采集过程中不佩戴眼镜,隐形眼镜可接受,2名受试者在数据采集过程中佩戴隐形眼镜。由于瞳孔间距(两个瞳孔之间的距离)的差异,受试者可以自由地调整双眼近眼显示器之间的距离,以获得更大和更清晰的视野。

       该过程将为每名受试者收集四个记录,一个用于校准,另外三个用于测试。标记物的分布示于图7中。在校准记录期间,9个青色标记顺序地显示在近眼显示器上,并且在测试记录期间,25个标记顺序地显示。每个点显示4秒。要求受试者注视所示标记的中心。每次记录后,要求受试者取下耳机并重新安装,以模拟实际使用中的滑动。校准和测试样品不仅产生滑移,而且还提供了一些校准点分布之外的测试点。

图7。该图显示了数据收集中使用的标记。要求受试者注视近显示设备上每个标记的中心,以收集校准、验证和测试数据。在校准记录中,受试者注视9个青色标记的数据用于校准,并且其他16个标记的数据用于验证。所有25个标记物的数据用于在受试者重新安装头戴式设备后进行测试。

B 眼球位置估计的结果

       通过眼球旋转中心估计眼球位置。对于没有滑动的多个光轴,眼球旋转中心将通过优化等式5来获得。图5示出了通过校准数据估计一只眼睛的眼球旋转中心的结果。当没有发生滑动时,可以通过历史数据来估计眼睛的中心。然而,如果发生滑动,则需要中心的实时解决方案。我们根据等式7实时求解眼睛的中心,并且使用由优化等式计算的中心作为地面实况,评估实时求解眼球旋转中心性能。眼球旋转中心估计的结果在表1中给出。

表1 眼球转动中心估计的平均误差和标准差。眼球旋转中心地面真实度通过优化测试数据的方程5获得,评估实时求解眼球旋转中心的性能。

        在实践中,稳定的眼球位置通常比高度准确的位置重要得多,因为固定误差容易通过校准来补偿。结果表明,我们的方法产生了稳定和准确的估计眼球旋转中心,从而意味着以前的光轴结果是精确的。

C 注视估计

        在我们的原型中实现的双目近眼显示器显示图像在两个不同的单眼显示器。因此,双眼独立旋转以聚焦在显示器中的同一目标点上并产生合并视图,使得我们能够同时实现基于左眼或右眼的注视估计。在表2中给出了九个受试者的近眼显示器中的单眼注视估计的结果。

表2 左眼和右眼的注视估计结果。对于每例受试者,使用图7中所示的9个校准标记数据进行校准,其中9个校准标记数据来自一个记录。在其他三个记录上测试凝视估计性能,其中引入了头戴式耳机滑动并呈现了平均角度偏移。在PUPIL[26]、GRIP[13]和我们的方法之间进行了凝视估计性能比较。

        使用图7中以青色示出的九个标记物的数据对每个受试者进行校准。所有25个点的数据用于其他三个记录中的评估,这些记录是在受试者取下耳机并将其放回以模拟滑动之后收集的。特别是,我们使用了前一节中发现的眼球旋转中心,以提供每次测试和校准记录之间的滑动。结果如图8所示,重新安装确实会产生滑动。

图8。重新安装后的滑动分布。不同颜色的实心点代表不同物体的滑移分布,空心点代表原点。

        我们比较了Pupil ,Grip 和我们的方法之间的性能。注视估计的平均角度偏移用作访问三种方法的结果的度量。我们的方法优于其他两种方法的滑移数据。虽然Pupil在仔细校准后达到了很高的精度,但当耳机滑动时,性能会严重下降。当发生滑动时,Grip保持相对准确的注视估计。然而,我们的方法仍然减少了27.3%的角度误差(左眼32.4%,右眼22.2%),由于光轴和注视点之间的映射更合理。另一个事实是八个测试点位于校准点的分布之外,并且注视预测结果保持准确。外推能力被证明是由我们的方法拥有。

       人类使用双眼已经很久了,大脑对双眼的视觉模式更熟悉,这与单眼的视觉模式不同。因此,双目信息应该更适合于注视点估计。我们进一步测试了我们的方法的双眼注视估计结果,并将它们与表3中给出的现有技术进行比较。双目注视估计通过两个单眼注视结果的简单平均来获得。实验结果表明,与单目测量结果相比,该方法的平均角度误差降低了25.5%,比Grip方法的平均角度误差有了较大的改善。与此同时,我们的方法比夹持方法的性能高出100%,角度偏移从1.51◦减小到0.76◦。平均角度误差的减小意味着滑动鲁棒性的改善。

表3 双眼注视估计结果。比较国家的最先进的方法和我们的方法表明,所提出的方法表现出更准确和滑动鲁棒性能在近眼显示器的凝视估计。双目信息带来的凝视精度的改进,这意味着如果利用双目数据,滑动鲁棒性将更高。

       实验结果表明,基于所提出的眼睛模型,我们的方法实现了高精度和高滑动鲁棒性的近眼显示器凝视估计。外推使得用户能够利用位于有限视野中的少量标记进行校准,同时在更大的空间中实现注视跟踪。 

6 总结

       本文提出了一种基于非球面眼睛模型的眼球光轴和位置估计方法。此外,基于注视点、眼球光轴和眼球位置之间的关系,构建了一个具有抗滑动性的视线跟踪系统。实验结果表明,该方法在发生滑动时仍能保持高精度的视线估计。滑动鲁棒性是一个实用的视线跟踪系统的关键,我们的方法保证了一个有前途的近眼显示头戴式耳机。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 MQL5 代码示例,演示了使用均线策略进行量化交易。在这个示例中,我们使用了简单移动平均线 (SMA) 来确定交易信号。 ```mql5 //+------------------------------------------------------------------+ //| Simple Moving Average EA | //| Copyright 2021, CSDN C知道 | //| https://blog.csdn.net | //+------------------------------------------------------------------+ #property copyright "CSDN C知道" #property link "https://blog.csdn.net" #property version "1.00" #property strict // 输入参数 input int FastMA_Period = 10; // 快速移动平均线周期 input int SlowMA_Period = 20; // 慢速移动平均线周期 input double LotSize = 0.1; // 交易手数 // 全局变量 int ticket = 0; // 订单号码 //+------------------------------------------------------------------+ //| 自定义指标函数 | //+------------------------------------------------------------------+ double MovingAverage(int period, int shift) { double sum = 0; for (int i = 0; i < period; i++) { sum += Close[i + shift]; } return sum / period; } //+------------------------------------------------------------------+ //| 程序初始化函数 | //+------------------------------------------------------------------+ void OnInit() { // 设置移动平均线指标参数 SetIndexBuffer(0, NULL); SetIndexStyle(0, DRAW_LINE); SetIndexLabel(0, "SMA"); // 创建订单标签 ObjectCreate("OrderLabel", OBJ_LABEL, 0, 0, 0); ObjectSet("OrderLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER); } //+------------------------------------------------------------------+ //| 每个Tick的处理函数 | //+------------------------------------------------------------------+ void OnTick() { // 计算快速和慢速移动平均线的值 double fastMA = MovingAverage(FastMA_Period, 0); double slowMA = MovingAverage(SlowMA_Period, 0); // 检查是否有已存在的订单 if (ticket == 0) { // 检查交叉条件 if (fastMA > slowMA) { // 开多仓 ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, Bid - StopLevel * Point, Bid + TakeProfit * Point, "Buy Order", 0, 0, Green); } else if (fastMA < slowMA) { // 开空仓 ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, Ask + StopLevel * Point, Ask - TakeProfit * Point, "Sell Order", 0, 0, Red); } } else { // 检查订单是否已关闭 if (OrderClose(ticket, OrderClosePrice(), Bid, Slippage)) { ticket = 0; } } // 更新移动平均线指标 ObjectCreate("SMA", OBJ_TREND, 0, Time[0], fastMA); ObjectSet("SMA", OBJPROP_TIME1, Time[0]); ObjectSet("SMA", OBJPROP_PRICE1, fastMA); // 显示订单标签 ObjectSetText("OrderLabel", "Order: " + IntegerToString(ticket), 10, "Arial", Red); ObjectSet("OrderLabel", OBJPROP_XDISTANCE, 10); ObjectSet("OrderLabel", OBJPROP_YDISTANCE, 20); } //+------------------------------------------------------------------+ ``` 请注意,这只是一个简单的示例,可能需要根据您的具体需求进行修改和优化。在使用此代码之前,请确保您已经了解并熟悉 MQL5 语言和量化交易的基本概念。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值