Zmud机器人制作--基础知识,技巧以及实例讲解终极篇上 fanuc机器人编程实例
第五章 buttons﹑系统变量﹑function
5.1 button
按钮(buttons)是很实用的一个功能,不光应用于半自动的机器人让游戏过程更加便捷,也用于全自动机器人,让人为修改某些变量更加简单.
按钮有3个要素:Caption,Commands(zmud721中这个要素被称为Value)和Class.其中Caption是按钮的名字,显示在按钮中间;Commands保存有一系列命令,当你点击按钮的时候,Commands中的内容就作为指令发送出去;Class是按钮所属的类,只是为了加载的时候方便。
Caption后面的颜色图标可以更改按钮的颜色,主选项卡ButtonStates里可以选择按钮的种类;Postion/Size选项卡里的内容可以更改按钮的大小和位置;Advanced选项卡里BitmapFile可以选择一个自定义图标显示在按钮上,并且zmud721还有自带图标供选择。
按钮的种类:一共四种Push﹑Toggle﹑Separator和Multistate
Push:点击一下执行一次Commands中的命令
Toggle:分为button up和buttondown2种状态,分别储存有2个命令串;每次点击都会执行对应状态中储存的命令串并且从一种状态改变为另一种状态。简单点说就相当于2个按钮。
Separator:仅仅作为分隔其他按钮的工具来使用,不包含任何命令。
Multistate:一个下拉式按钮,点击之后会出现下拉列表,然后选择,不同的选择执行不同的命令。
在Buttons列表里有button的序号,#button 序号这个命令等同于鼠标点击一次按钮,这个命令可以用于alias,variable,marco和trigger中。其他与button有关的命令有#yesno,#pr和#pick,这3个命令将在第八章中介绍。另外#button也可用于新建按钮,鉴于语法格式过于复杂,这里略过了。
按钮的功能可以说非常丰富,可以做出很漂亮的界面。
这里要推荐inspector同学的一篇文章http://telweb.pkuxkx.net/forum/thread-6501-1-3.html小蜜蜂机器人(新手专用)
5.2 系统变量
主要介绍最实用的%ctime,%i和%random
%ctime表示你的连线时间,单位是秒
实例一:我需要机器人计算吐纳时每小时增加精力的速度。
#tri {你的精力上限增加了!!} {#add jingli_add 1;#vartuna_speed [@jingli_add*3600/%ctime];#show每小时获得@tuna_speed点精力!}
%ctime还可用于萧峰,万安塔,胡一刀,护镖,护送和朝廷守门等任务,能接任务时由机器人自动提醒,具体在第七章中专门介绍
%i主要用于各种命令中,配合#number和#loop来使用,也用于专门针对数据库变量、record类型变量和list类型变量的命令中,这些命令主要有#loopdb,#forall等等
比如 #5 kill menggu bing %i等价于kill menggu bing 1;kill menggu bing 2;kill minggu bing 3;killmenggu bing 4;kill menggu bing 5
#number和#loop都是一次性发送数个相同的命令,区别在于变量可以用于#loop中来控制发送命令的次数,而#number中的number一定要是一个实际的阿拉伯数字
错误用法:#var number5;#@number kill menggu bing %i
正确用法:#var number 5;#loop @number{kill menggu bing %i}
注意事项:#var number 0;#loop @number{kill menggu bing %i}实际效果是kill menggu bing1,也就是说#loop至少会执行一次,@number中的值为0或者负值或者干脆是字符串乃至汉字,都是执行1次命令,zmud不会抱错,可以自行试验。
#loop命令在我发的领悟机器人中被用到,用来改变领悟或者练习的次数,以适用不同exp层次的id。
%random产生一个0-99的随即数字,%random(1,5)产生一个1-5的随机数,结合#case命令来发送随机命令
#case @variable {cmd1} {cmd2} {cmd3} {cmd4}{cmd5}...可以根据@variable值的不同来发送不同的命令,比如@variable值为3,第3个括号中的命令cmd3会被执行,其他命令都不执行。
另外%time和%dice有兴趣也可以看一下,举几个例子简单说下
#say %time()显示为星期三 七月22, 2009 2:14:14 am
#say%time(c)显示为2009/7/222:16:12
#say %time("aaaatttt")显示为星期三2:26:03
%time()的括号中可以使用参数来改变显示内容,这些参数有a(星期)、d(日期)、m(月份)、y(年)、e(年)、t(时分秒)、h(小时)、n(分)和s(秒),下面给个复杂点的例子,有兴趣可以自行试验看下显示结果。
#FORALL {a|d|m|y|e|g|t|h|n|s} {#SH %i: %time(%i)| %time(%i%i) | %time(%i%i%i) |%time(%i%i%i%i)}
这个例子基本包含了所有的格式,%i依次等于a、d、m、y、e、g、t、h、n、s,%time()的括号中分别用1-4个%i来显示不同详细程度的内容。
%dice(2d6+2)显示为掷2个6面色子的和再加上2,是一个随机结果,()中用到的格式为xdy+n,表示"x个y面色子+n",相关变量有%dicemin()、%dicemax()、%diceavg()、%dicedev()。
其他系统变量还有很多,作用都不大,不感兴趣的可以跳过。下面只列举一些,太多了不可能全面的,具体可以#help 自行查找。
%action 最后一次触发所执行的命令。
%cr 换行。
%def 当前使用的特殊字符。
%host 当前连线MUD的IP地址。
%lastcom 最后被执行的命令。
%lastcom2 倒数第二个被执行的命令。
%lastcom3 倒数第三个被执行的命令。
%line 从MUD中得到的最后一行文本。
%line2 从MUD中得到的倒数第二行文本。
%line3 从MUD中得到的倒数第三行文本。
%port 当前连线的端口号。
%selected 当前选中的文本。可用于speed menu的制作,通过鼠标点击来发出包含选中文本的命令
%selline 当前选中的行。可用于speed menu的制作
%selword 当前选中的单词。可用于speed menu的制作
%title 当前MUD的标题。
%trigger 最近一次被触发的行。
%window 当前窗口的标题。
5.3 fuction(函数)
zmud允许自定义函数,命令为#function,#fu为命令的缩写形式.可以简单的把函数理解为带参数的变量.还是用实际的小例子来说明函数的用法.
实例1:#fu sum%(%1+%2)
这里%是系统自带函数,作用等于[],负责运算并且返回运算结果
#say @sum(100,40)显示为140
sum在这里为一个自定义函数,包含2个参数,用法相当于带参数的变量,@sum()为函数的值
实例2:#fu min%if(%1<%2,%1,%2)
这里定义了一个函数min,作用是选择2个数中较小的数
%if为系统自带的条件函数,语法为%if(表达式,true-value,false-value),如果表达式为真,返回true-value,否则返回false-value
#say @min(5,7)显示为5
#say@min(20,11)显示为11
实例3:#fu fact{%if(%1<=1,1,%1*@fact(%(%1-1)))}
这个例子要复杂些,用到了函数的自身嵌套,如果参数<=1,返回1,否则返回"参数*@face(参数-1)",然后再对@fact(参数-1)重复上面的条件运算,最终的结果就是"参数*(参数-1)*(参数-2)*...*1",其实就是一个阶乘运算.
#say [@fact(5)]显示为120
函数很多时候用起来很方便,使你的机器人更容易看懂,修改起来当然就更容易
比如在上一章打坐吐纳机器人中,可以定义一个函数对气血,内力,精神,精力进行计算,确定dazuo,tuna的数值
#fu need%max(%min([(%if(%(%4*2-%3)<1000,[(%4*2-%3)/2],[%4*2-%3])*100+129)/@sudu],[%1-(%2+9)/10]),10)
这个函数拥有4个参数,并且包含一个变量@sudu
打坐的命令是dazuo@need(@qixue,@qixue_max,@neili,@neili_max)
吐纳的命令是tuna@need(@jingshen,@jingshen_max,@jingli,@jingli_max)
可以看到比第4章更简洁明了,省去了一大堆#var,#math,#if
另外值得一提的是,zmud的命令,系统自带变量,系统自带函数相当的多,从而使得机器人的写法多种多样,相当灵活.基本上任意一个#xxx的命令都对应有一个系统已定义好了的函数或变量%xxx()
比如#if,%if;#case,%case;#,%;#null,%null;#walk,%walk;#alias,%alias;#color,%color;#additem,%additem
太多了,实在无法一一举例,如此多的命令使zmud语言变得相当丰富灵活,我也无法做到全部了解并且熟练运用每一个命令。但是毫无疑问,知道的越多,做机器人就越容易。你知道多少对这样的命令,他们的用法你都知道吗?平时做机器人的时候有用过吗?
第六章 Variable和Alias的更多应用
本章主要介绍record类型变量和list类型变量以及变量别名的自身嵌套和相互嵌套
6.1 record类型变量
实例一:
#var skill.name "玄铁剑法"
#var skill.id "xuantie-jia"
#var skill.level 310
上面3个命令将一个技能的中文名字、英文名字和等级全部保存到了一个变量@skill中
#say@skill///@skill.name///@skill.id///@skill.level
显示结果为:name玄铁剑法idxuantie-jialevel310///玄铁剑法///xuantie-jia///310
也有专门针对record类型变量的显示命令#showdb,注意没有#saydb这个命令
#showdb @skill,显示结果一共3行如下:
name: 玄铁剑法
id: xuantie-jia
level: 310
我们把@skill称为一个databaserecord,把name、id、level称为key,而"玄铁剑法"、"xuantie-jian"、"310"分别为对应key的值。
record类型的变量的优点在于变量的含义更加清楚,并且相关的信息都保存在一个变量中,对这些信息的使用更加方便.
对record类型的变量进行操作的相关命令非常多,下面通过一些例子来简单说明下
(1)#say %db(@skill,level)完全等同于#say @skill.level
(2)#say%iskey(@skill,id)//%iskey(@skill,shuliandu)
%iskey(record,key)返回record中key的序号,如果不存在返回0
上面例子中id是第二个key,shuliandu不是@skill的key,所以显示为2//0
(3)#say%addkey(@skill,shuliandu,10002)//%iskey(@skill,shuliandu)
显示为:name玄铁剑法idxuantie-jialevel310shuliandu10002//0
%addkey可以在record中添加key和key对应的值,但是并不会改变record的内容,所以%iskey(@skill,shuliandu)的显示结果仍然为0
如果需要改变record的内容,可以用下面的3个命令中的任意一个
#addkey skill shuliandu 10002
#var skill.shuliandu 10002
#var skill %addkey(@skill,shuliandu,10002)
跟添加key类似,删除key的命令有#delkey,%delkey,用法类似,这里就不做介绍了
(4)#say %numkeys(@skill) 显示@skill中key的个数
这里介绍的一些命令已经跟DataBase有点沾边了。在zmud555和721版本中提供DB和Map,并且有非常多的命令配合DB和Map来使用。考虑到DB和Map的制作及使用讲起来需要大量篇幅,同时还要配合大量图片,并且在机器人制作过程中并非不可缺少,所以此文暂时不涉及这2方面内容。以后如有需要,可能会专门开贴来介绍DB和Map。
6.2 list类型变量
将一列信息保存在一个变量中,每个单独的信息用"|"间隔开来,每项信息称为list类型变量的item
实例一:做一个trigger来拾取游戏中掉落的随机装备
#var baobei"剑|刀|杖|鞭|斧|枪|锤|戟|匕|铠甲|盔|腰带|靴|项链|戒指|披风|袍|护腕|手套|盾"
#var baobei2"sword|blade|staff|whip|axe|spear|hammer|halberd|dagger|armor|head|waist|boots|necklace|ring|surcoat|cloth|wrists|hands|shield"
#tri {从@dbrname身上掉了出来一*之(*)$} {get%item(@baobei2,%ismember(%1,@baobei))}
在这个例子中@baobei中保存了所有随机装备的种类,@baobei2中保存所有随机装备的id,并且注意到@baobei和@baobei2中种类和id是一一对应的。
%ismember(%1,@baobei)返回%1在@baobei中的位置。比如如果掉落刀返回值为2,掉落鞭返回值为4
如果%1不在@baobei中,返回为0
%item(@baobei2,%ismember(%1,@baobei)),通过%ismember(%1,@baobei)的返回值得到掉落的随机装备的id
注:现在这个例子已经没有意义了,应该写一些触发来drop垃圾,不过这个例子中的方法还是很好的.
实例二:输入sk命令,抓取所有技能的中文名字英文名字技能等级保存到变量中
#tri {你目前所学过的技能:} {#var skname {};#var sklevel{};#var skills {}}
//将@skname,@sklevel,@skills清空
#tri {│%s(*)%s~((*)~)%s-*%s(%d)~/} {#if(%numitems(@skname)=0) {#var skname %1} {#var skname%additem(%1,@skname)};#if (%numitems(@skils)=0) {#var skills %2}{#var skills %additem(%2,@skills)};#if (%numitems(@sklevel)=0){#var sklevel %3} {#var sklevel%additem(%3,@sklevel)}}
//%numitems()返回list类型变量中item的个数
//抓取中文名字英文名字和技能等级进行赋值,如果变量为空就直接赋值,否则作为变量的一个item添加进去
//%additem和#additem类似于前面讲过的%addkey和#addkey
//对每个技能都触发,并且抓取到的中文名字英文名字和技能等级在变量中的位置都是对应的
再定义几个函数就可以了
#fu name{%item(@skname,%ismember(%1,@skills))}
#fu level {%item(@sklevel,%ismember(%1,@skills))}
#say@name("xuantie-jian")//@level("xuantie-jian")级
显示为:玄铁剑法//310级
实例三:输入semote,抓取所有的表情命令保存到变量中
输入semote,每一行有5个表情命令,每个命令由字母和数字组成,需要用%a通配
#tri {^(%a)%s(%a)%s(%a)%s(%a)%s(%a)$} {#additememotes %1;#additem emotes %2;#additem emotes %3;#additem emotes%4;#additem emotes%5}
//list类型变量中item的个数是没有限制的,把所有的表情都保存到@emotes中
然后你可以通过%random %disc等函数来选取随机表情使用
#say %numitems(@emotes) 显示出表情的个数
注意:举个例子来说明%additem和#additem的另一个区别
#varpath {n|e|sw|se|e|u|enter boat|out|w}
#say %additem("sw",@path) 显示为n|e|sw|se|e|u|enter boat|out|w|sw
#say %additem(@path,"sw") 显示为sw|n|e|sw|se|e|u|enter boat|out|w
#say @path 显示为n|e|sw|se|e|u|enterboat|out|w
#additem path "sw";#say@path 显示为n|e|sw|se|e|u|enterboat|out|w
//如果要添加的item已经存在于list变量中,则添加无效
#additem path "enter";#say @path显示为n|e|sw|se|e|u|enterboat|out|w|enter
简而言之,#additem不允许item重复,如果有重复则命令无效.需要添加重复的item,请用%additem
对list类型变量进行操作的命令除了上面提到的%item、%numitems、%ismember、%additem、#additem,还有#delitem、#delnitem、%delitem、%dups、%sort
#delitem list item删除指定item,如果变量中有多个重复的item,则删除所有重复的item
%delitem(item,@list)删除指定item,如果变量中有多个重复的item,只删除第一个的item
#delnitem list n 从@list中删除第n个item
%dups 去掉变量中重复的item,只保留第一个item
#SHOW%dups(Athos|Bertrand|Caesar|Bertrand|Caesar|Bertrand)
显示为Athos|Bertrand|Caesar
%sort 对变量中的item按照字母和数字进行排序
6.3 嵌套
zmud允许variable,alias和function互相嵌套,来完成更复杂的事情
上一章中已经介绍了一个function的嵌套
#fu fact{%if(%1<=1,1,%1*@fact(%(%1-1)))}
其实就是定义了一个阶乘函数,不用嵌套很难计算阶乘
实例一:定义一个函数,计算exp支持的技能等级上限
#fu maxlevel%if((%1*%1*%1/10)<%2,@maxlevel(%(%1+1),%2),%1)
#say@maxlevel(1,100000)//@maxlevel(100,3000000)//@maxlevel(700,50000000)
显示为100/311/794,分别为100k,3m,50mexp对应的技能等级上限
这里第一个参数的作用是保守的预估一个等级,一定要比最大技能等级低,可以减少计算次数,提高计算速度,第二个参数就是要计算的经验值
实例二:用alias来计算exp支持的技能等级上限
#aliasmaxlevel {#var n 1;#while ((@n*@n*@n/10)<%1) {#add n1};#say 技能最高为@n级}
maxlevel 3000000 显示为:技能最高为312级
不使用嵌套,但是用到了#while循环语句.#while功能也很强大,但同时也有我不喜欢的缺点,所以我一般避免使用#while,后面章节中会讲到#while的缺点
#alias maxlevel {#if((%1*%1*%1/10)<%2) {maxlevel %(%1+1) %2} {#say技能最高为%1级}}
使用嵌套同样可以达到目的,你可以随意预估一个值作为%1,要计算的经验值作为%2
这几个例子中,用定义函数的方法来计算速度最快,比另外2种方法要快几倍,推荐使用
总结:个人认为,本章和下一章将要讲到的内容是所有章节中最重要的2章,可以算是从中级水平到高级水平的一个转折。机器人编写中用到record,list以及嵌套,能完成很多复杂的事情.后面的章节中将会大量的出现record,list以及嵌套.
第七章 掌控时间
7.1 #wa命令
#wa是#wait的缩写,用来延迟一个命令的执行.
用法一:延迟的具体时间以毫秒为单位指定.
比如{#wa2000;hp}作用是2秒后发送hp这个命令
#wa后面可以指定具体数字,也可以指定一个变量,用变量来控制等待的时间。
前面章节中多次使用这种用法.#wa命令太重要了,如果没有#wa,任何命令都是立即发送,容易造成机器人发狂.另外有些命令执行完毕之后人物处于busy状态,用#wa命令来度过busy时间,#wa的时间设置应该保守一些,一般大于busy时间.
用法二:不指定时间,#wa单独使用
实例一:{study bookfor 1;hp;#wa;exert regenerate}
在zmud462和555两个版本中,运行结果为
> study book for 1
hp
你的「基本剑法」进步了!
exert regenerate
你从身上拿出一本华山剑谱准备好好研读。
你研读了一次有关基本剑法的技巧,似乎有点心得。
> ≡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━≡
【 精神 】 110 /130 [100%]【 精力 】0/0(+0)
【 气血 】 48 /97[80%]【 内力 】 0/0(+0)
【 食物 】 0/300 [饥饿]【 潜能 】234901
【 饮水 】 0/300 [饥渴]【 经验 】75643
≡━━━━━━━━━━━━━━━━━━━━━━━◎北大侠客行◎━━≡
> 你略一凝神,精神看起来好多了。
study book for 1;hp;#wa3个命令同时发送执行,然后等待命令执行的结果,但是只等待一行信息,接着发送exertregenerate这个命令。#wa后面的命令得不到hp的信息,如果想让#wa后面的命令对内力气血进行判断,数一下上面的行数,至少需要连续6次#wa,而且会被中途输出的其他信息干扰,实用性为0。使用462和555版本的可以忘记这个用法。需要用其他方法来替代这个用法,最简单的就是tell自己的id,然后用tell的信息做触发。
在zmud721中运行结果为
> study book for 1
hp
你的「基本剑法」进步了!
你从身上拿出一本华山剑谱准备好好研读。
你研读了一次有关基本剑法的技巧,似乎有点心得。
> ≡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━≡
【 精神 】 110 /130 [100%]【 精力 】0/0(+0)
【 气血 】 48 /97[80%]【 内力 】 0/0(+0)
【 食物 】 0/300 [饥饿]【 潜能 】234901
【 饮水 】 0/300 [饥渴]【 经验 】75643
≡━━━━━━━━━━━━━━━━━━━━━━━◎北大侠客行◎━━≡
exert regenerate
> 你略一凝神,精神看起来好多了。
具有比较高的实用性了。不同版本的差异请多多体会。
注意事项:#wa为单线流程,多个#wa同时执行时,后面的会替代前面。
试验A:在命令行里输入#wa 10000;hp,然后输入#wa 1,会发现hp被立刻执行了
试验B:在命令行反复输入{#wa3000;hp}6次,每次输入的间隔小于3秒,会发现hp迟迟没有执行,当你停止输入时,3秒后会同时执行6次hp
请大家自行体会,做机器人时应该尽量避免多个#wa同时执行,另外可以重新输入#waxxx来延长或者缩短前面已经输入的#wa命令。这个虽然是#wa命令的不足之处,但是仍然可以被我们利用。
因为#wa单线流程的特点,决定了#wa只用于简单的控制时间。
7.2 tick timer
点击菜单Actions->Tick Timer来设置ticktimer,有3个要素组成:Timer Interval,Timeout Margin和TimeoutCommand。
举例来说,设置Timer Interval为10,Timeout Margin为2,TimeoutCommand为hp,点击Start之后,zmud开始循环倒计时10秒,当计时至2秒时,执行hp这个命令。
这是另外一个控制时间的工具,最大的优点是稳定,我喜欢称它为计时器。准确地倒计时,准确地执行命令,不受到机器人的影响。缺点在于一个窗口只能设置一个ticktimer,一般只用在最关键的地方。
相关命令#timer on,#timer off,#ts和#tz等。
#timer on :打开tick timer
#timer off:关闭tick timer
#ts 数字:设置TimerInterval中的值
#tz: 重置计时器的时间,让他重新开始计时
以上4个命令被用于trigger,alias中用来对tick timer进行操作.
注意:zmud 555在加载其他机器人时,不同的时间器之间会发生干扰,ticktimer的3要素都会发生改变,所以建议Timeout Command中的值统一填为timer,并且新建一个aliastimer来保存计时结束需要执行的命令串。
实例二:胡一刀接任务的时间间隔为10分钟,10分钟到了的时候由机器人提醒
tick timer中Timer Interval设置为600秒,Timeout Margin设置为5秒,TimeoutCommand设置为{#say 可以接任务了!}
#tri{胡一刀说道:『我收到消息,听说&hydaddress有盗宝人&dbrname~(&dbr~)找到了闯王宝藏的地图}{#tz}
实例三:用#wa来实现计时器的功能,这样你就拥有相当于2个计时器了。
#alias ticktimer {#wa 10000;hp;ticktimer}
如果你在命令行输入ticktimer,恭喜你,你有了另外一个计时器,每隔10秒就执行一次hp命令。如果你不修改ticktimer这个alias,它将永远不会停止,请用#aliasticktimer {}来停止这个时间器。
实例四:达摩院领悟,内力不足时回去睡觉
#alias lw {#if @sleep {d;sd;w;n;sleep} {#wa500;lingwu sword 100;exert regenerate;lw}}
#tri {你的内力不够。} {#var sleep 1}
这个例子也可以用ticktimer来实现;zmud721中也可以直接用#wa来实现;或者用下面要讲到的#alarm来实现。zmud的灵活性使得同样的事情,可以有很多种方法完成。
zmud本身提供#while命令,但是#wa和#while混合使用时会出问题,所以我一般不用#while,而是用这种自身嵌套来实现#while的功能。
上面的2个例子都用到了alias的自身嵌套,更多的用法大家可以自己创造,在高级篇中我会大量的使用自身嵌套,使用时需要注意不要造成死循环,一定要设置一个办法让它停止;否则,唉,你的zmud已经崩溃了,重启吧!
更多阅读
MATLAB 各种 对数函数 用法以及实例 matlab 对数函数
MATLAB 各种 对数函数 用法以及实例——简介在MATLAB运算当中,我们常常需要求对数,在编写M文件的过程中,我们也需要表示对数,下面我就通过一些示例介绍一下如何在MATLAB中求对数。MATLAB 各种 对数函数 用法以及实例——工具/原料MATLA
空调基础知识 空调分几部分
空调基础知识——简介空气调节简称“空调”,即用控制技术使室内空气的温度、湿度、清洁度、气流速度和噪声达到所需的要求。目的为改善环境条件以满足生活舒适和工艺设备的要求。空调的功能主要有制冷、制热、加湿、除湿和温湿度控制
茶叶基础知识1 茶叶的基础知识
中国人民素来爱茶,茶的基础知识已经深入日常生活,小编班门弄斧,整一整说一说茶的基本知识。1、茶叶的划分茶叶的分类方法有很多种,我们中国主要的分类方法是按照色泽、加工工艺以及发酵程度来分。按照茶叶的色泽、加工工艺可以将茶
色彩基础知识 美术色彩基础知识调色
第二章?色彩色彩概述1.色彩基础知识色彩的概念光从物体反射到人的眼睛所引起的一种视觉心理感受。色彩按字面含义上理解可分为色和彩,所谓色是指人对进入眼睛的光并传至大脑时所产生的感觉;彩则指多色的意思,是人对光变化的理解
现货k线图基础知识经验分享 自由知识和经验分享
现货快活谷给大家分享现货市场中,技术面分析是很重要的,很多投资老手钟爱投资现货,很大一部分原因就是因为现货基本面信息比较好把握,技术面占的比重更多,技术分析中,K线图的研究分析更是重中之重!本文通过对现货k线图基础知识的讲解,希望对