MQL5学习之简单移动平均线MA的编写

news2024/11/25 3:04:15

昨天还是有点高估自己了,MACD相对较难一点,改学MA的编写,首先明确MA的计算,假如有4个值,p=[1,2, 3, 4], period=3,

则v[0]=p[0], v[1]=p[1],v[2]=(p[0]+p[1]+p[2])/3=2,

v[3]=(v[2]*3+p[3]-p[0])/3,

然后将v[3]的计算公式化简单就得到v[3]=v[2] + (p[3]-p[0])/3,把period,初始值i代进来,注意i从period开始:

v[i]=v[i-1] + (p[i]-p[i-period])/period

一句话解释即为第i个平均值的计算为i-1的位置的平均值加上一个计算值,这个计算值由第i位置的价格减去步长前的价格再除于步长period得到。

然后即可以来观察一下移动平均线的代码了:

//+------------------------------------------------------------------+
//|                                        Custom Moving Average.mq5 |
//|                             Copyright 2000-2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_type2   DRAW_LINE
#property indicator_color2  Silver
//--- input parameters
input int            InpMAPeriod1=20;
input int            InpMAPeriod2=60;
//--- indicator buffer
double ExtLineBuffer1[];
double ExtLineBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLineBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLineBuffer2,INDICATOR_DATA);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- set first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod1);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpMAPeriod2);
//--- name for DataWindow
   string short_name ="SMA";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod1)+")");
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod2)+")");
//--- set drawing line empty value
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
  }
//+------------------------------------------------------------------+
//|  Moving Average                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   if(rates_total<InpMAPeriod1-1+begin)
      return(0);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      ArrayInitialize(ExtLineBuffer1,0);
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpMAPeriod1-1+begin);
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpMAPeriod2-1+begin);
     }
//--- calculation

   CalculateSimpleMA(rates_total,prev_calculated,begin,price,ExtLineBuffer1, InpMAPeriod1);
   if(rates_total<InpMAPeriod2-1+begin)
      return(rates_total); 
   else {
      CalculateSimpleMA(rates_total,prev_calculated,begin,price,ExtLineBuffer2, InpMAPeriod2);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|   simple moving average                                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA(int rates_total,int prev_calculated,int begin,const double &price[], double &buffer[], int period)
  {
   int i,start;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      start=period+begin;
      //--- set empty value for first start bars
      for(i=0; i<start-1; i++)
         buffer[i]=0.0;
      //--- calculate first visible value
      double first_value=0;
      for(i=begin; i<start; i++)
         first_value+=price[i];
      first_value/=period;
      buffer[start-1]=first_value;
     }
   else
      start=prev_calculated-1;
//--- main loop
   for(i=start; i<rates_total && !IsStopped(); i++)
      buffer[i]=buffer[i-1]+(price[i]-price[i-period])/period;
  }

#property indicator_chart_window 这一行表达为主图显示,若想显示到副图,可改为#property indicator_separate_window

这一行表达为需要画两个变量:#property indicator_plots   2

这一行表达第二个画出来的变量用灰色:#property indicator_color2  Silver

程序:

input int            InpMAPeriod1=20;

input int            InpMAPeriod2=60;表示输入两个参数,一个为20,一个为60

初始化时需要针对变量0和变量1分别初始化:

   SetIndexBuffer(0,ExtLineBuffer1,INDICATOR_DATA);

   SetIndexBuffer(1,ExtLineBuffer2,INDICATOR_DATA);

代码CalculateSimpleMA中计算MA的核心代码为:

   for(i=start; i<rates_total && !IsStopped(); i++)
      buffer[i]=buffer[i-1]+(price[i]-price[i-period])/period;
  }

然后我们运行代码,会发现弹出参数,刚好是前面代码中定义的变量

运行出来的20均,60均的图形如下:

然后与通达信上的相比较,发现是一致的,说明计算无误

从目前实践的看起来,MQL5难度要显著高于通达信或是北极星什么的,唯一的好处是可以做极其复杂的计算,无限制的变量,类什么的,并可以做文件存储,网络传输,几乎能想到的一切,比如后面对接实盘时,官方对接实盘是收费的,如果你有程序化交易的程序接口,完全可在算法中直接http协议完成实盘交易。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1488975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xss.haozi.me:0x08

</style ><script> alert(1)</script>

商业运作之流量之谜,粉丝增长100%

从业13年工作需要才写了这个博客&#xff0c;13年累计粉丝15个&#xff0c;哈哈我是不是太佛系了&#xff1f; 如今走上了创业之路偶尔也会遇到一些技术难题&#xff0c;我都会把解决问题的思路和方法同步到博客&#xff0c;没想到短短半年粉丝从15增长到了30。之前我并没有认…

谷歌新一代Gemini 1.5多模态模型, 最长可达100万token上下文窗口

Google在人工智能领域已经发布了自己的Gemini大模型&#xff0c;其Gemini模型是一个多模态模型&#xff0c;不仅可以支持文字输入&#xff0c;还支持图片输入。而在Gemini ultra发布不久&#xff0c;Gemini 1.5大模型也相继发布。Gemini 1.5在多个维度上都有了显著的改进&#…

Shell管道和过滤器

一、Shell管道 Shell 还有一种功能&#xff0c;就是可以将两个或者多个命令&#xff08;程序或者进程&#xff09;连接到一起&#xff0c;把一个命令的输出作为下一个命令的输入&#xff0c;以这种方式连接的两个或者多个命令就形成了管道&#xff08;pipe&#xff09;。 重定…

模拟算法题练习(一)(扫雷,灌溉,回文日期)

目录 模拟算法介绍&#xff1a; &#xff08;一、扫雷&#xff09; &#xff08;二、灌溉&#xff09; &#xff08;三、回文日期&#xff09; 有一说一这题大佬的题解是真的强 模拟算法介绍&#xff1a; 模拟算法通过模拟实际情况来解决问题&#xff0c;一般容易理解但是实…

探索Linux世界:初次接触和基本指令(文件操作)

文章目录 1.基本介绍和准备2.基本指令和Linux的基本操作3.几个重要基本指令3.1 ls - 列出文件和目录3.1.1文件的知识3.1.2 .和..文件 3.2pwd - 显示当前工作目录3.2.1路径知识 3.3 cd - 切换目录3.4 touch - 创建文件或更新时间戳3.5mkdir - 创建新目录3.6rm - 删除文件或目录3…

22.基于springboot + vue实现的前后端分离-汽车票网上预定系统(项目 + 论文PPT)

项目介绍 系统是一个B/S模式系统&#xff0c;采用Spring Boot框架&#xff0c;MySQL 数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得汽车票网上预订系统管理工作系统化、规范化。本系统的使用使管理人…

解决prettier 报错 Delete `␍`

根目录&#xff08;么有的话&#xff09;新建 .prettierrc.js配置文件 module.exports {tabWidth: 2,semi: true,printWith: 80,singleQuote: true,quoteProps: consistent,htmlWhitespaceSensitivity: strict,vueIndentScriptAndStyle: true,// 主要是最后一行endOfLine:aut…

【Quarto】Markdown导出PPT

title: “Quarto Basics” mainfont: “LXGW WenKai Mono” format: revealjs: theme: default incremental: true pptx: incremental: true html: code-fold: true beamer: incremental: true aspectratio: 169 QUARTO 这段代码是一个 YAML 头部&#xff08;front matter&…

解决NENU研究生教务系统网站“不能创建对象”等兼容性问题

本问题由吴越洋同学首先解决&#xff0c;在阅读了吴越洋同学的博客和他编写的Tempermonkey插件脚本代码后&#xff0c;完成了本项目。 吴越洋同学的博客地址为修复NENU教务系统“不能创建对象”等兼容性问题 - YorkWus Blog 吴越洋同学的插件地址为东北师范大学本科生、研究生教…

Windows10笔记本亮度调节按键失灵

操作&#xff1a;任务管理器 -> 监视器 -> 右键点击 -> 通用即插即用监视器 -> 更新驱动程序 -> 浏览我的电脑以查找我的驱动程序 -> 让我从计算机上的可用驱动程序列表中选取 -> 点击通用即插即用监视器 -> 点击关闭 -> 重启电脑。 第一步&#x…

计算复数x的余弦值计算复数x的反余弦值cmath.cos(x)cmath.acos(x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算复数x的余弦值 计算复数x的反余弦值 cmath.cos(x) cmath.acos(x) [太阳]选择题 请问cmath.cos(x)的作用是&#xff1a; import cmath print("【执行】cmath.cos(0)") print(cm…

2.3_5 用信号量实现互斥、同步、前驱关系

文章目录 2.3_5 用信号量实现互斥、同步、前驱关系&#xff08;一&#xff09;信号量机制实现进程互斥&#xff08;二&#xff09;信号量机制实现进程同步&#xff08;三&#xff09;信号量机制实现前驱关系 总结 2.3_5 用信号量实现互斥、同步、前驱关系 我们之前学习了进程互…

MySQL学习Day25——数据库其他调优策略

一、数据库调优的措施: 1.调优的目标: (1)尽可能节省系统资源&#xff0c;以便系统可以提供更大负荷的服务 (2)合理的结构设计和参数调整&#xff0c;以提高用户操作的响应速度 (3)减少系统的瓶颈&#xff0c;提高MySQL数据库整体的性能; 2.如何定位调优:用户的反馈、日志…

基于Springboot的无人智慧超市管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的无人智慧超市管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

微软多兴趣召回:Octopus

Octopus: Comprehensive and Elastic User Representation for the Generation of Recommendation Candidates 背景&#xff1a; 多兴趣通道(channel)结构的多兴趣召回模型在兴趣通道数量上面存在两个问题 兴趣通道较少&#xff0c;不能充分学习到用户的多个兴趣。兴趣通道较…

力扣hot9---滑动窗口

题目&#xff1a; 先记录一下&#xff08;没想到有生之年&#xff0c;还能&#xff09;&#xff1a;其实还能优化&#xff0c;后面会讲述优化思路 思路&#xff1a; 滑动窗口的大小就是固定的&#xff0c;就是len_p。那么依次将窗口从s的最左端向右滑动。在当下的窗口中&#x…

鸿蒙开发就业前景以及发展方向分析~

鸿蒙操作系统作为华为公司自主研发的操作系统&#xff0c;已经成为当下炙手可热的话题。作为一个全新的操作系统&#xff0c;鸿蒙开发为IT行业带来了巨大的就业机会。本文将围绕鸿蒙开发的就业前景以及发展方向展开讨论。 一、鸿蒙开发就业前景 随着鸿蒙操作系统的发布&#…

Windows快速删除大量文件

直接上命令 rmdir 磁盘:\文件夹名字\ /s /q /S 表示除目录本身外&#xff0c;还将删除指定目录下的所有子目录和文件。 /Q 表示安静模式&#xff0c;删除时不需要经过确认。 特别是vue项目中的node_modules&#xff0c;删除贼快&#xff01;

【代码随想录算法训练营Day34】860.柠檬水找零;406.根据身高重建队列;452.用最少数量的箭引爆气球

❇️Day 34 第八章 贪心算法 part04 ✴️今日任务 860.柠檬水找零406.根据身高重建队列452.用最少数量的箭引爆气球 ❇️860.柠檬水找零 本题看上好像挺难&#xff0c;其实挺简单的&#xff0c;大家先尝试自己做一做。题目链接&#xff1a;https://leetcode.cn/problems/lem…