论坛全局菜单下方 - TICKMILL 285X70论坛全局菜单下方 - ThinkMarkets285X70论坛全局菜单下方 - 荔枝返现285X70论坛全局菜单下方 -  icmarkets285X70
  • 1
  • 2
前往
共 23 条
查看:1675回复:22
kkkkeeee
注册时间2016-02-01
白羊座金牛座双子座巨蟹座狮子座处女座天秤座天蝎座射手座摩羯座水瓶座双鱼座
[原创]金叉和死叉的箭头如何显示在均线交叉的位置?
楼主发表于:2018-08-22 04:30只看该作者倒序浏览
1楼 电梯直达
电梯直达
金叉和死叉的箭头如何显示在均线交叉的位置(比如红圈位置)?不要显示在K线下方。万分感谢! #property copyright "Copyright ?2004, by konKop,wellx" #property link "http://www.metaquotes.net" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Yellow #property indicator_color2 White #property indicator_color3 Yellow #property indicator_color4 White extern int 均线周期1 = 20; extern int 均线周期2 = 100; extern int 类型1 = 1; extern int 类型2 = 1; extern string 类型说明 = "0-SMA; 1-EMA; 2-SMMA; 3-LWMA"; extern int 文字水平 = 0; extern int 文字垂直 = 0; extern int 文字大小 = 14; extern string 文字标识 = "1"; extern color 文字颜色 = Yellow; extern int 是否报警 = 1; extern int 是否发邮件 = 1; double g_ibuf_132; double g_ibuf_136; double g_ibuf_140; double g_ibuf_144; int gi_148; int gi_152 = 0; datetime g_time_156; int init() { IndicatorBuffers(4); SetIndexStyle(0, DRAW_LINE); SetIndexStyle(1, DRAW_LINE); SetIndexStyle(2, DRAW_ARROW); SetIndexStyle(3, DRAW_ARROW); SetIndexBuffer(0, g_ibuf_132); SetIndexBuffer(1, g_ibuf_136); SetIndexBuffer(2, g_ibuf_140); SetIndexBuffer(3, g_ibuf_144); SetIndexArrow(2, 233); SetIndexArrow(3, 234); gi_148 = 0; return (0); } int start() { string ls_0; int li_8 = IndicatorCounted(); if (li_8 < 0) return (-1); if (li_8 > 0) li_8--; int li_12 = Bars - li_8; for (int li_16 = li_12 - 1; li_16 >= 0; li_16--) { g_ibuf_132[li_16] = iMA(NULL, 0, 均线周期1, 0, 类型1, PRICE_CLOSE, li_16); g_ibuf_136[li_16] = iMA(NULL, 0, 均线周期2, 0, 类型2, PRICE_CLOSE, li_16); if (g_ibuf_132[li_16 + 1] < g_ibuf_136[li_16 + 1] && g_ibuf_132[li_16] > g_ibuf_136[li_16]) { ls_0 = "[" + Period() + "分钟]" + TimeMonth(Time[li_16] + gi_148) + "月" + TimeDay(Time[li_16] + gi_148) + "日" + TimeHour(Time[li_16] + gi_148) + "点" + TimeMinute(Time[li_16] + gi_148) + "分 " + Symbol() + "在价格" + DoubleToStr(Close[li_16], 4) + "发生" + "金叉"; writetext(文字标识, ls_0, 文字水平 + 20, 文字垂直 + 40, 文字颜色, 文字大小); g_ibuf_140[li_16] = Low[li_16] - 3.0 * Point; if (li_16 == 0) { if (gi_152 == FALSE) { if (是否报警 == 1 && Time[0] > g_time_156) { Alert(ls_0); g_time_156 = Time[0]; } if (是否发邮件 == 1) SendMail(ls_0, ls_0); gi_152 = TRUE; } } } if (g_ibuf_132[li_16 + 1] > g_ibuf_136[li_16 + 1] && g_ibuf_132[li_16] < g_ibuf_136[li_16]) { ls_0 = "[" + Period() + "分钟]" + TimeMonth(Time[li_16] + gi_148) + "月" + TimeDay(Time[li_16] + gi_148) + "日" + TimeHour(Time[li_16] + gi_148) + "点" + TimeMinute(Time[li_16] + gi_148) + "分 " + Symbol() + "在价格" + DoubleToStr(Close[li_16], 4) + "发生" + "死叉"; writetext(文字标识, ls_0, 文字水平 + 20, 文字垂直 + 40, 文字颜色, 文字大小); g_ibuf_144[li_16] = High[li_16] + 3.0 * Point; if (li_16 == 1) { if (gi_152 == FALSE) { if (是否报警 == 1 && Time[0] > g_time_156) { Alert(ls_0); g_time_156 = Time[0]; } if (是否发邮件 == 1) SendMail(ls_0, ls_0); gi_152 = TRUE; } } } else gi_152 = FALSE; } return (0); } void writetext(string a_name_0, string a_text_8, int a_x_16, int a_y_20, color a_color_24, int a_fontsize_28) { ObjectDelete(a_name_0); ObjectCreate(a_name_0, OBJ_LABEL, 0, 0, 0); ObjectSetText(a_name_0, a_text_8, a_fontsize_28, "Arial", a_color_24); ObjectSet(a_name_0, OBJPROP_CORNER, 0); ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_16); ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_20); } asz.jpgasz.jpg
TK29帖子1楼右侧xm竖版广告90-240
个性签名

韬客社区www.talkfx.co

广告
TK30+TK31帖子一樓廣告
TK30+TK31帖子一樓廣告
乡巴佬对冲
注册时间2015-09-25
发表于:2018-08-22 23:32只看该作者
2楼
把 g_ibuf_140[li_16] = Low[li_16] - 3.0 * Point; 改成 g_ibuf_140[li_16] = g_ibuf_132[li_16]; 把 g_ibuf_144[li_16] = High[li_16] + 3.0 * Point; 改成 g_ibuf_144[li_16] = g_ibuf_132[li_16];

点评

撒网式求助了好多人都不懂,哈哈,这里解决了。 我就知道会有人骑着白马,踏着彩霞来帮助我。正在喝酸奶,真想给你喝剩下的一半。 大铅笔乐于助人,棒棒哒。发表于 2018-08-23 02:55
kkkkeeee
注册时间2016-02-01
白羊座金牛座双子座巨蟹座狮子座处女座天秤座天蝎座射手座摩羯座水瓶座双鱼座
楼主发表于:2018-08-23 02:55只看该作者
3楼
乡巴佬对冲 发表于 2018-8-23 07:32
把 g_ibuf_140[li_16] = Low[li_16] - 3.0 * Point; 改成
撒网式求助了好多人都不懂,哈哈,这里解决了。 我就知道会有人骑着白马,踏着彩霞来帮助我。正在喝酸奶,真想给你喝剩下的一半。 大铅笔乐于助人,棒棒哒。
tao的ke的
注册时间2015-09-04
积极参与奖大侦探白羊座金牛座双子座巨蟹座狮子座处女座天秤座天蝎座射手座摩羯座水瓶座双鱼座
发表于:2018-08-23 02:58只看该作者
4楼
正在喝酸奶,真想给你喝剩下的一半。爱的最高境界。emoji-imageemoji-image
乡巴佬对冲
注册时间2015-09-25
发表于:2018-08-23 03:06只看该作者
5楼
大铅笔:你养我? kkkkeee:我养你一辈子!
HOME龙尔
注册时间2016-06-29
积极参与奖友爱维和奖热心助人奖白羊座金牛座双子座巨蟹座狮子座处女座天秤座天蝎座射手座摩羯座水瓶座双鱼座
发表于:2018-08-23 03:08只看该作者
6楼
emoji-image 大铅笔就是知识
乡巴佬对冲
注册时间2015-09-25
kkkkeeee
注册时间2016-02-01
白羊座金牛座双子座巨蟹座狮子座处女座天秤座天蝎座射手座摩羯座水瓶座双鱼座
楼主发表于:2018-08-23 03:13只看该作者
8楼
一直后悔大学不是学计算机专业,感觉会写代码的帅帅的。。
乡巴佬对冲
注册时间2015-09-25
发表于:2018-08-23 03:28只看该作者
9楼
kkkkeeee 发表于 2018-8-23 11:13
一直后悔大学不是学计算机专业,感觉会写代码的帅帅的。。
现在学也来得及。 发现现在会编程的在国外也很吃香,报考国外非计算机硕士博士的时候你如果说编程能力强,教授都会要,大部分实验室都缺少编程人才。
馨泷MF
注册时间2018-08-21
发表于:2018-08-23 04:08只看该作者
10楼
乡巴佬对冲 发表于 2018-8-23 11:28
现在学也来得及。 发现现在会编程的在国外也很吃香,报考国外非计算机硕士博士的时候你如果说编程能力 ...
一直想问一下指标的原理,也就是指标运行时在界面上画图的流程。 比如描绘一条应用在close的20日均线,start函数每个tick执行一次,那么打开一个货币对的图形,k线被依次描绘在界面的同时,指标开始运行。 对于前19根K线,start执行后不画点,第20根以后开始针对close价格计算前20根K线均价并在界面上描画一个点,一直描画到当前K线,并根据当前tick一直对当前点进行涂抹后重画。 是这个逻辑吧? 那对于在界面右上角上显示当前点差的这种指标,点差数字也是从第一根K线开始到当前K线一直被涂抹后重画的吗?然后每个Tick继续重画?
个性签名

韬客社区www.talkfx.co

乡巴佬对冲
注册时间2015-09-25
发表于:2018-08-23 06:01只看该作者
11楼
本帖最后由 乡巴佬对冲 于 2018-8-23 14:08 编辑 很多人都不理解这个地方的原理,我简单讲一下我的理解吧,如果这样理解以后编写程序就简单多了。 MT4在启动的时候开始装填K线,K线都装填好了后才开始装指标。 假如画面只装一个20MA指标,这里说的是MA原始指标。装MA指标的时候,MT4先执行一次只有一次init()函数,然后每有一次价格更新,就是有新的tick,就会执行一次start() 函数。 那MA指标是如何画上的,第一次执行start() 时你要在程序里针对画面上所有的K线,挨个算出移动平均线,并且画在屏幕上。 所以要写一个循环,取画面的所有时序的K线值,进行计算,跳过前20个K线。注意这里只能取到当前以外的过去的K线值,取不到过去的tick值。 那怎么知道是不是第一次执行start()呢,第一次IndicatorCounted()函数取到的是0,然后取到的是除了当前K线之外的K线数。bar第一次取到的是画面上K线的数量。通过这两个变量控制循环。 第二次tick来时我们就不需要在程序里用作这个工作了,以前画过的MA不要重新画了,只画新出现的K线的MA就行。非要每次都重新再画一遍也没问题,影响速度,控制循环就行。有的有未来函数的就必须重新画,比如那个zigzag。用最新tick描画涉及最新K线刚显示完和新的K线还在tick途中两个状态,有一点点复杂。 不知道能否说清楚。

点评

你好,请问一下, for(i=0; i发表于 2018-08-23 06:57
个性签名

韬客社区www.talkfx.co

HOME龙尔
注册时间2016-06-29
积极参与奖友爱维和奖热心助人奖白羊座金牛座双子座巨蟹座狮子座处女座天秤座天蝎座射手座摩羯座水瓶座双鱼座
发表于:2018-08-23 06:05只看该作者
12楼
我是某某
乡巴佬对冲
注册时间2015-09-25
发表于:2018-08-23 06:21只看该作者
13楼
你是龙龙,或者是尔尔。
以梦为马
注册时间2015-01-23
发表于:2018-08-23 06:57只看该作者
14楼
乡巴佬对冲 发表于 2018-8-23 14:01
很多人都不理解这个地方的原理,我简单讲一下我的理解吧,如果这样理解以后编写程序就简单多了。 MT4在 ...
你好,请问一下, for(i=0; i
乡巴佬对冲
注册时间2015-09-25
发表于:2018-08-23 07:09只看该作者
15楼
本帖最后由 乡巴佬对冲 于 2018-8-23 15:14 编辑
以梦为马 发表于 2018-8-23 14:57
你好,请问一下, for(i=0; i
你这个应该是画面上bar的数量不够i+50个造成的,在ExtMacdBuffer=语句的前面加一句,if(Bars <= i+50) continue;

点评

int i,limit; limit=rates_total-prev_calculated; if(prev_calculated>0) limit++; for(i=0; i发表于 2018-08-23 08:53
以梦为马
注册时间2015-01-23
发表于:2018-08-23 08:53只看该作者
16楼
本帖最后由 以梦为马 于 2018-8-23 17:38 编辑
乡巴佬对冲 发表于 2018-8-23 15:09
你这个应该是画面上bar的数量不够i+50个造成的,在ExtMacdBuffer=语句的前面加一句,if(Bars
int i,limit; limit=rates_total-prev_calculated; if(prev_calculated>0) limit++; for(i=0; i============== Bars就代表k线数量啊,你加在那里,结论是永远成立的啊。 ================== 这个问题的难点是怎么限制i, 当i> limit-50的时候,不参与 ExtMacdBuffer [ i ] 数组计算。 第一次运行的时候limit需要加这个限制条件 。 但是第一次运行结束,后面再来新的k线时候不需要这个限制条件了,因为这个时候limit是1. @偶然帅
春夏春
注册时间2016-06-15
发表于:2018-08-23 09:38只看该作者
17楼
有点看不懂,可能是自己水平差。
乡巴佬对冲
注册时间2015-09-25
发表于:2018-08-23 09:45只看该作者
18楼
本帖最后由 乡巴佬对冲 于 2018-8-23 17:56 编辑
以梦为马 发表于 2018-8-23 16:53
int i,limit; limit=rates_total-prev_calculated; if(prev_calculated>0) limit++;
你加上试一下看看 if(limit == 0) limit = 1;

点评

好吧 谢谢 我加了这一句: for(i=0; i= limit-60) continue; ExtMacdBuffer [ i ] = 某个数值 / iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,i) ; } 这样没有零除错误了,但是运行完limit里面的k线数量,lim发表于 2018-08-23 11:02
以梦为马
注册时间2015-01-23
发表于:2018-08-23 11:02只看该作者
19楼
乡巴佬对冲 发表于 2018-8-23 17:45
你加上试一下看看 if(limit == 0) limit = 1;
好吧 谢谢 我加了这一句: for(i=0; i if(i >= limit-60) continue; ExtMacdBuffer [ i ] = 某个数值 / iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,i) ; } 这样没有零除错误了,但是运行完limit里面的k线数量,limit =0. 之后新的k线出来-跳动之后,limit=1 了。 因为 0 > 1-60,所以跳过,新k线出来对应的ExtMacdBuffer [ i ] 值永远没办法输出出来了。 这就是我为什么上面说:第一次运行结束,后面再来新的k线时候不需要这个限制条件了,因为这个时候limit是1. for(i=0; i< 1; i++) { if(i >= limit-60) continue; //因为 0 > 1-60,所以跳过,新k线出来对应的ExtMacdBuffer [ i ] 值永远没办法输出出来了。 ExtMacdBuffer [ i ] = 某个数值 / iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,i) ; }
乡巴佬对冲
注册时间2015-09-25
发表于:2018-08-23 12:05只看该作者
20楼
不知道你的程序干啥用的,你试一下下面的程序。 int limit=rates_total-prev_calculated; if(limit == 0) limit = 1; for(int i=limit-1; i>=0; i--){ if(Bars <= i+60) continue; ExtMacdBuffer [ i ] = 某个数值  /  iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,i)  ;  }

点评

大铅笔,又要麻烦你了,如何只显示最后一个最新的箭头,前面的自动删除?发表于 2018-08-27 04:14
发表于 2018-08-23 14:56
谢谢 可以了 被转换来转换去绕晕了发表于 2018-08-23 14:56
scalping 明天复活了发表于 2018-08-23 14:10

评分

参与人数1
积分
金币
人气
时间
理由
0
0
0
2018-08-23
  • 1
  • 2
前往
共 23 条

本站免责声明:

1、本站所有广告及宣传信息均与韬客无关,如需投资请依法自行决定是否投资、斟酌资金安全及交易亏损风险;

2、韬客是独立的、仅为投资者提供交流的平台,网友发布信息不代表韬客的观点与意思表示,所有因网友发布的信息而造成的任何法律后果、风险与责任,均与韬客无关;

3、金融交易存在极高法律风险,未必适合所有投资者,请不要轻信任何高额投资收益的诱导而贸然投资;投资保证金交易导致的损失可能超过您投入的资金和预期。请您考虑自身的投资经验及风险承担能力,进行合法、理性投资;

4、所有投资者的交易帐户应仅限本人使用,不应交由第三方操作,对于任何接受第三方喊单、操盘、理财等操作的投资和交易,由此导致的任何风险、亏损及责任由投资者个人自行承担;

5、韬客不隶属于任何券商平台,亦不受任何第三方控制,韬客不邀约客户投资任何保证金交易,不接触亦不涉及投资者的任何资金及账户信息,不代理任何交易操盘行为,不向客户推荐任何券商平台,亦不存在其他任何推荐行为。投资者应自行选择券商平台,券商平台的任何行为均与韬客无关。投资者注册及使用韬客即表示其接受和认可上述声明,并自行承担法律风险。

版权所有:韬客外汇论坛 www.talkfx.com 联络我们:[email protected]