[{"data":1,"prerenderedAt":1049},["ShallowReactive",2],{"blog-page-27":3,"blog-count":1048},[4,279,336,839,898],{"id":5,"title":6,"body":7,"date":255,"description":13,"extension":256,"meta":257,"navigation":260,"path":272,"seo":273,"stem":274,"tags":275,"__hash__":278},"blogs\u002F_legacy\u002F2014\u002F2014-08-22-ue4%e5%af%bc%e5%85%a5mmd%e6%a8%a1%e5%9e%8b.md","UE4导入MMD模型",{"type":8,"value":9,"toc":251},"minimark",[10,14,23,26,38,45,48,59,68,71,76,79,84,87,90,93,96,101,104,109,112,117,120,123,128,131,134,139,142,147,150,155,158,163,166,171,184,187,190,193,196,201,204,207,212,215,220,223,226,229,234,237,240,245,248],[11,12,13],"p",{},"折腾了好几天，终于把MMD模型导入UE4给搞定了。于是总结下经验，顺便把从贴吧淘到的夏娜模型导入到UE4。",[11,15,16,17,22],{},"这篇文章中的部分内容已经过期，详情请参考",[18,19,21],"a",{"href":20},"\u002F?p=1250","[这篇文章]","。\n事先声明，本人对3D建模这块一窍不通。如果术语方面有出入，请见谅。下面正式开始：",[11,24,25],{},"首先在Blender这边需要做一点准备工作。",[11,27,28,29,33,34,37],{},"到Blender的插件目录\u003C",[30,31,32],"span",{},"Blender","\\2.71\\scripts\\addons>中找到FBX导出插件",[30,35,36],{},"io_scene_fbx","，用编辑器打开export_fbx.py文件。到第2425行，对两行代码进行注释，如果使用的编辑器没有跳转的功能话可以用搜索快速定位。",[11,39,40],{},[41,42],"img",{"alt":43,"src":44},"image","\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb1.png",[11,46,47],{},"修改后的文本如下：",[49,50,55],"pre",{"className":51,"code":53,"language":54},[52],"language-text","#for bonename, bone, obname, me, armob in ob_bones:\nfor my_bone in ob_bones:\n# Always parent to armature now\nif my_bone.parent:\nfw('\\n\\tConnect: \"OO\", \"Model::%s\", \"Model::%s\"' % (my_bone.fbxName, my_bone.parent.fbxName))\n#else:\n# the armature object is written as an empty and all root level bones connect to it\n#fw('\\n\\tConnect: \"OO\", \"Model::%s\", \"Model::%s\"' % (my_bone.fbxName, my_bone.fbxArm.fbxName))\n","text",[56,57,53],"code",{"__ignoreMap":58},"",[11,60,61,62,67],{},"然后需要做的事情是到这个地址去下载Blender用的MMD插件：",[18,63,64],{"href":64,"rel":65,"title":64},"https:\u002F\u002Fgithub.com\u002Fsugiany\u002Fblender_mmd_tools",[66],"nofollow","。下载完成后将mmd_tools文件夹解压到Blender的插件目录。",[11,69,70],{},"打开Blender，进入用户配置。启用刚刚下载的插件。用MMD这个关键词可以快速的过滤到插件，在选择框上打勾即可。如果启用成功的话，在左边的功能区域就能看到MMD的功能了。如果启用了看不见的话可以试着重启一下Blender。",[11,72,73],{},[41,74],{"alt":43,"src":75},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb2.png",[11,77,78],{},"做好了上面的工作之后就可以进行导入的工作了。点击MMD面板上的Model按钮，在弹出的选择窗口左边，将缩放比例调整为8倍。选择想要导入的模型即可，这里选择前几天在贴吧淘到的夏娜模型。",[11,80,81],{},[41,82],{"alt":43,"src":83},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb3.png",[11,85,86],{},"之所以在这里做缩放操作，是因为这个插件不支持导入之后做任何缩放。有读刚刚GitHub页面作者说明的童鞋应该有注意到。由于这个限定的关系，为了保证最终导入UE4的单位不会出错，通过计算得出这里的缩放倍数是8。",[11,88,89],{},"需要注意的是，这里根据模型的不同，导入之后在视图上看到的模型材质可能是灰色的。",[11,91,92],{},"模型导入之后先不忙着下一步动作，要对模型的骨骼结构进行一下检查。由于UE4是不支持多个骨骼作为根骨骼的，所以对于不符合的模型我们要稍作修改。",[11,94,95],{},"在右上角的大纲视图中找到骨架，并查看其结构。如果是类似这样的结构就不需要更改了：",[11,97,98],{},[41,99],{"alt":43,"src":100},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb4.png",[11,102,103],{},"这样的就是可以使用的结构，所有的骨骼都在\u003C全ての親>这个节点之下。如果导入之后发现没有这个节点，而是这样的结构：",[11,105,106],{},[41,107],{"alt":43,"src":108},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb5.png",[11,110,111],{},"那么就需要对骨骼结构进行修正。推荐使用PmxEditor进行修正，打开PE，导入刚刚的模型。执行下面的操作即可：",[11,113,114],{},[41,115],{"alt":43,"src":116},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb6.png",[11,118,119],{},"保存之后重新导入Blender，再次检查一下就能进行下一步工作了。",[11,121,122],{},"模型导入完成之后，接下来就导入动作。这里用的是忘记是哪里下载过来的行走的vmd。导入动作之前注意，保证所有的Object，包括骨骼都处于被选中的状态。Blender全选的快捷键是A。导入时同样调整缩放为8。",[11,124,125],{},[41,126],{"alt":43,"src":127},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb7.png",[11,129,130],{},"完成以上两个操作之后，使用下面的动画预览功能看看模型和骨骼的绑定是否正常。通常缩放设定不一致、导入动画时没有选中骨骼是常见的出错原因。",[11,132,133],{},"成功导入之后看到的差不多就是这样的模型了：",[11,135,136],{},[41,137],{"alt":43,"src":138},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb8.png",[11,140,141],{},"然后我们把Blender的场景单位调节为与UE4一致，在右边的面板上可以找到场景标签。调整为下面的样子就可以了：",[11,143,144],{},[41,145],{"alt":43,"src":146},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb9.png",[11,148,149],{},"接下来我们可以打开环境光，再加上些光源，拖一个摄像机到视图上。",[11,151,152],{},[41,153],{"alt":43,"src":154},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb10.png",[11,156,157],{},"然后选择最左边的那个面板进行渲染预览，就可以看到并检查是否所有的导入都正常了。",[11,159,160],{},[41,161],{"alt":43,"src":162},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb11.png",[11,164,165],{},"预览渲染如果正常话，就可以开始进行导出操作了。配置上保持默认就可以了，为了防止版本不同引起的问题，配置截图如下：",[11,167,168],{},[41,169],{"alt":43,"src":170},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb12.png",[11,172,173,174,179,180,183],{},"导出之后的FBX如果直接导入到UE4的话会出错，因为UE4导入FBX时不识别其中的非英文字符，会出现命名冲突错误。由于MMD模型中的日文实在是太多了，想要手动修正显然不现实。于是参照FBX的官方文档，通过FBX SDK写了一个转义工具来解决这个问题。直接从\u003C",[18,175,178],{"href":176,"rel":177},"http:\u002F\u002Fpan.baidu.com\u002Fs\u002F1xW9ye",[66],"这里","|共享密码：5xrd|>下载，具体的说明请看\u003C",[18,181,178],{"href":182},"\u002Fpage\u002Ffbx-utf8-convert",">。",[11,185,186],{},"打开工具，点上面的按钮打开fbx，然后点击下面的转换按钮即可。转换成功的话会在同级目录下生成文件名追加了_ue4的fbx文件。",[11,188,189],{},"这样导出的文件就能成功的导入UE4了，只是由于UE4的导入器目前功能还不是很完善。其导入的结果和3dsmax导入的结果有一定差别。最容易出现的问题就是斗鸡眼了，虽然可以在UE4中进行调整，但这里我们还是将模型导入3dsmax再重新导出一次，对模型格式进行一下规范化。",[11,191,192],{},"FBX这个文件格式是autodesk定义的，其他软件对fbx的支持或多或少都会有些问题。多次的导入导出很容易出现奇怪的问题。所以出现问题时，用autodesk官方的软件进行一下规范化比较好。",[11,194,195],{},"导入时保持默认配置不动，会有一些警告信息，不会有什么影响。导入之后是这个效果：",[11,197,198],{},[41,199],{"alt":43,"src":200},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb13.png",[11,202,203],{},"对比下会发现下方丝袜的材质效果有些不明显，材质相关的建议在UE4中进行相应的修正。在这里进行修正需要会使用3dsmax，而且也无法保证UE4对材质的处理和3dsmax完全相同。",[11,205,206],{},"同时我们会发现动画的帧数变成了100，由于始终没有搞明白3dsmax要怎么用。这里我选择将其发送到MotionBuilder。",[11,208,209],{},[41,210],{"alt":43,"src":211},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb14.png",[11,213,214],{},"发送成功之后，我们会发现夏娜的丝袜又回来了……",[11,216,217],{},[41,218],{"alt":43,"src":219},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb15.png",[11,221,222],{},"调整好动画的帧数之后，直接导出成FBX。",[11,224,225],{},"至此，UE4外部的模型转换工作就完成了。",[11,227,228],{},"打开UE4，新建一个ThirdPerson BluePrint的项目。项目打开之后，到Content Browser，在自己喜欢的位置导入FBX模型。",[11,230,231],{},[41,232],{"alt":43,"src":233},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb16.png",[11,235,236],{},"根据模型文件的不同可能会出现一些警告信息，例如POT、平滑组之类的。一般情况下无视就好了。",[11,238,239],{},"导入之后效果如下：",[11,241,242],{},[41,243],{"alt":43,"src":244},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb17.png",[11,246,247],{},"唯一的遗憾是表情动画从3dsmax导出之后再导入就消失了，尝试导入到别的3d软件也无法读取到。不是很明白其中的机理，好在从游戏制作的方面来看，表情动画并不是必须的。需要的情况下也可以直接在UE4的编辑器里面拖动骨骼，故而这个问题只能暂时搁置了。",[11,249,250],{},"到这里模型的导入工作就完成了。材质和光照全部保存默认的情况下，效果不会很好。这些都是之后需要研究的地方，模型导入成功的话就什么都好说了。",{"title":58,"searchDepth":252,"depth":253,"links":254},2,3,[],"2014-08-22","md",{"layout":258,"status":259,"published":260,"author":261,"author_login":262,"author_email":263,"author_url":264,"wordpress_id":265,"wordpress_url":266,"date_gmt":267,"excerpt":268},"post","publish",true,{"display_name":262,"login":262,"email":263,"url":264},"chaoshikari","chaoshikari@gmail.com","\u002F",1002,"\u002F\u002F?p=1002","2014-08-22 02:12:24 +0000",{"type":8,"value":269},[270],[11,271,13],{},"\u002F2014-08-22-ue4导入mmd模型",{"title":6,"description":13},"_legacy\u002F2014\u002F2014-08-22-ue4%e5%af%bc%e5%85%a5mmd%e6%a8%a1%e5%9e%8b",[276,277],"UE4","MMD","0EpYkU2jkiiy9se72Lmd6y6ntUUM_PAZaylrB-jAjWg",{"id":280,"title":281,"body":282,"date":319,"description":286,"extension":256,"meta":320,"navigation":260,"path":329,"seo":330,"stem":331,"tags":332,"__hash__":335},"blogs\u002F_legacy\u002F2014\u002F2014-08-19-%e8%87%aa%e4%b8%bb%e4%bf%ae%e6%94%b9%e5%be%ae%e5%8d%9a%e7%a7%80%e7%9a%84%e6%96%b9%e6%b3%95.md","自主修改微博秀的方法",{"type":8,"value":283,"toc":317},[284,287,290,293,296,302,305,311,314],[11,285,286],{},"自从WP-Micro插件停止更新后，一直没有找到可用的替换品。但是随着时间的推移，WP-Micro能支持的微博越来越少，到最后只能自己动手丰衣足食了。",[11,288,289],{},"通过微博的API来重新做的方案基本可以不用考虑，因为没有那么多的时间花费在这上面。于是决定采用新浪官方的微博秀作为替代品，但是微博秀有个问题，就是他的定制性非常的弱。直接嵌入的话会导致和主题的风格严重冲突，于是，本着我的地盘我做主的原则。我们通过PHP做中继来解决这个问题。",[11,291,292],{},"需要注意的是，直接使用JS来处理是不可行的。由于浏览器的安全策略，即便使用了黑科技搞定了跨域问题，内容在不同浏览器上的表现将变得不可预知。",[11,294,295],{},"首先上PHP代码，嫌麻烦的童鞋直接把下面的代码中url的部分替换成自己的微博秀就可以了。代码中有注释，相对还是比较单纯的代码。自定义CSS部分大家可以根据需要自己调整。",[49,297,300],{"className":298,"code":299,"language":54},[52],"\u003C?php\n \u002F\u002F 获取微博秀\n $url = 'http:\u002F\u002Fwidget.weibo.com\u002Fweiboshow\u002Findex.php?language=&width=0&height=750&fansRow=2&ptype=1&speed=0&skin=1&isTitle=0&noborder=0&isWeibo=1&isFans=0&uid=2306189460&verifier=a1b73969&dpc=1';\n $lines_array = file($url);\n $lines_string = implode('', $lines_array);\n\n \u002F\u002F 输出自定义CSS\n echo \"\n \u003Cstyle type='text\u002Fcss'>\n \u003C!--\n .weiboShow_developer{\n display: none !important;\n }\n .weiboShow .weiboShow_main_height, .weiboShow .weiboShow_main_allList_focus, .weiboShow .weiboShow_follow {\n background: transparent !important;\n }\n .weiboShow .weiboShow_wrap {\n border:0 !important;\n }\n .weiboShow_main_feed{\n border:0 !important;\n }\n .weiboShow_topborder{\n display: none !important;\n }\n -->\n \u003C\u002Fstyle>\";\n \n \u002F\u002F 输出微博秀\n echo $lines_string;\n?>\n\n",[56,301,299],{"__ignoreMap":58},[11,303,304],{},"将上面的php代码放到网站的可访问路径上之后，在小工具中新建一个”文本“小工具，在里面插入以下Html代码。其中src部分是刚刚添加的php代码的路径。",[49,306,309],{"className":307,"code":308,"language":54},[52],"\u003Ciframe width=\"100%\" height=\"750\" class=\"share_self\"  frameborder=\"0\" scrolling=\"no\" src=\"\u002Fget_wb.php\" frameborder=\"0\" scrolling=\"auto\"  border=\"0\">\n载入中...\n\u003C\u002Fiframe>\n",[56,310,308],{"__ignoreMap":58},[11,312,313],{},"以上这些步骤就可以了。",[11,315,316],{},"关于扩展功能部分，如果网站的流量很大，可以考虑做一下缓存工作。虽然做成wp的插件比较合适，但是对wp的插件机制没有怎么研究，也没那么多时间去搞。总之能用就行了。",{"title":58,"searchDepth":252,"depth":253,"links":318},[],"2014-08-19",{"layout":258,"status":259,"published":260,"author":321,"author_login":262,"author_email":263,"author_url":264,"wordpress_id":322,"wordpress_url":323,"date_gmt":324,"excerpt":325},{"display_name":262,"login":262,"email":263,"url":264},955,"\u002F\u002F?p=955","2014-08-19 01:23:00 +0000",{"type":8,"value":326},[327],[11,328,286],{},"\u002F2014-08-19-自主修改微博秀的方法",{"title":281,"description":286},"_legacy\u002F2014\u002F2014-08-19-%e8%87%aa%e4%b8%bb%e4%bf%ae%e6%94%b9%e5%be%ae%e5%8d%9a%e7%a7%80%e7%9a%84%e6%96%b9%e6%b3%95",[333,334],"微博秀","网站","u8N5MRiJBnu5mq5kiIFiiuiUKU6C-DMfl9j9iRHrV9k",{"id":337,"title":338,"body":339,"date":823,"description":343,"extension":256,"meta":824,"navigation":260,"path":833,"seo":834,"stem":835,"tags":836,"__hash__":838},"blogs\u002F_legacy\u002F2014\u002F2014-08-09-ue4%e5%ae%98%e6%96%b9fps%ef%bc%88c%ef%bc%89%e8%8c%83%e4%be%8b%e5%ae%9e%e7%8e%b0%e8%ae%b0%e5%bd%95.md","UE4官方FPS（C++）范例实现记录",{"type":8,"value":340,"toc":813},[341,344,352,355,359,367,373,386,389,393,396,402,417,420,430,433,440,443,446,457,460,474,477,484,487,490,493,496,499,502,505,786,789,792,795,798,801,806,809],[11,342,343],{},"看完Digital Tutors的UE4教程之后，参照官方wiki的教程文章把FPS的范例实现了一遍。于是趁热打铁，用文字的形式记录和总结一下。",[11,345,346,347,351],{},"教程原文地址：",[18,348,349],{"href":349,"rel":350},"https:\u002F\u002Fwiki.unrealengine.com\u002FFirst_Person_Shooter_C%2B%2B_Tutorial",[66],"。",[11,353,354],{},"使用的UE版本是4.4版，按照教程中的顺序来：",[356,357,358],"h2",{"id":358},"新建项目",[11,360,361,362,366],{},"直接新建一个空白项目，不要默认的资源文件。项目名",[363,364,365],"strong",{},"FPSProject","，为了方便后面代码的复制粘贴。在这里不做变更。",[11,368,369,370,351],{},"新建后点保存，将地图保存为",[363,371,372],{},"FPSMap",[11,374,375,376,379,380,383,384,351],{},"然后有一个步骤是在",[363,377,378],{},"Game>Project Settings",">",[363,381,382],{},"Maps & Modes","中将编辑器默认地图设置为刚刚保存的",[363,385,372],{},[11,387,388],{},"这一步在操作的时候不知为何自动被添加了一块地板，总之不影响操作，直接无视。",[356,390,392],{"id":391},"创建gamemode","创建GameMode",[11,394,395],{},"粗略的浏览了下文档之后，发现GameMode大概相当于游戏规则的核心管理类。大体上的地位相当于cocos2d中的Scene。如下图：",[11,397,398],{},[41,399],{"alt":400,"src":401,"title":400},"clip_image001","\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fclip_image001_thumb.jpg",[11,403,404,405,408,409,412,413,416],{},"在菜单",[363,406,407],{},"File","下",[363,410,411],{},"Add Code to Project","中新建一个类，基类选择为",[363,414,415],{},"GameMode","。选择编辑会自动打开VS2013。这个时候intellisense会报错，按照官方的建议，直接无视即可。原因似乎是有的文件要到编译的时候才会生成，这里的情况问题出在\"FPSGameMode.generated.h\"上。",[11,418,419],{},"在生成的类中覆盖掉BeginPlay函数，并在屏幕上输出HelloWolrd。关闭UEEditor，在VS中进行代码编译。要注意如果不关闭编辑器的话，VS会无法写入文件导致失败。",[11,421,422,423,426,427,351],{},"生成完毕之后重新打开UE，在配置中的",[363,424,425],{},"Game>Project Settings>Maps & Modes","将Default Mode设置为",[363,428,429],{},"FPSGameMode",[356,431,432],{"id":432},"创建角色",[11,434,435,436,439],{},"和上面一样，添加代码命名",[363,437,438],{},"FPSCharacter","，继承Charater。和上面的步骤几乎没什么不同，继承BeginPlay并输出调试文字。",[11,441,442],{},"完成操作之后在FPSGameMode的构造函数中添加DefaultPawnClass = AFPSCharacter::StaticClass()。",[356,444,445],{"id":445},"玩家操作",[11,447,448,449,452,453,456],{},"UE的操作接口分为",[363,450,451],{},"Axis Mappings","和",[363,454,455],{},"Action Mapings","，分别对应连续输入的方向控制操作和离散输入的按键操作。设定在项目配置中的Input项内进行。",[11,458,459],{},"接口的作用是将硬件输入绑定到特定的名称上，然后由Charater类来注册。主要提供一个映射的操作来隔离游戏逻辑和硬件操作，很常见的引擎输入控制模式，基本上按照文档描述没有遇到什么问题。",[11,461,462,463,466,467,466,470,473],{},"途中有介绍到",[363,464,465],{},"UFUNCTION","、",[363,468,469],{},"UCLASS",[363,471,472],{},"UPROPERTY","这几个宏，它们的作用是将特定的函数、类、属性暴露给引擎，代码中出现这几个宏的代码变动时必须要在VS中重新编译。",[356,475,476],{"id":476},"为角色添加网格",[11,478,479,480,483],{},"新建一个BlusPrint继承刚刚建立的",[363,481,482],{},"FPSCharater","。通过BluePrint的编辑器将Mesh设置为下载并导入的人物模型。没什么特别的问题。",[11,485,486],{},"需要在VC中将玩家的Chara修改为刚刚新建的BluePrint,看起来有点繁琐，不过也就是复制粘贴一下。",[11,488,489],{},"添加完后会发现视角有点低，通过添加一个UCameraComponent来解决。根据文档描述，个类就是作为摄像机的配置而存在的。",[356,491,492],{"id":492},"为角色添加第一人称网格",[11,494,495],{},"在这个游戏模式的定义中，玩家是看不见自己的身体网格的，只能看见自己的手。似乎和通常遇到的FPS有点不一样，不过Demo就是这么定义的。",[11,497,498],{},"和上一步没啥不同，关键性的部分是调整可见性的语句。",[356,500,501],{"id":501},"子弹和射击",[11,503,504],{},"新建一个继承自Actor的类，创建碰撞形态和移动逻辑的Component，并且设定生命周期为3秒。",[49,506,510],{"className":507,"code":508,"language":509,"meta":58,"style":58},"language-cpp shiki shiki-themes github-light-high-contrast github-dark monokai","\u002F\u002F Use a sphere as a simple collision representation\nCollisionComp = PCIP.CreateDefaultSubobject\u003CUSphereComponent>(this, TEXT(\"SphereComp\"));\nCollisionComp->InitSphereRadius(15.0f);\nCollisionComp->BodyInstance.SetCollisionProfileName(\"Projectile\");\nCollisionComp->OnComponentHit.AddDynamic(this, &AFPSProjectile::OnHit);\nRootComponent = CollisionComp;\n\n\u002F\u002F Use a ProjectileMovementComponent to govern this projectile's movement\nProjectileMovement = PCIP.CreateDefaultSubobject\u003CUProjectileMovementComponent>(this, TEXT(\"ProjectileComp\"));\nProjectileMovement->UpdatedComponent = CollisionComp;\nProjectileMovement->InitialSpeed = 3000.f;\nProjectileMovement->MaxSpeed = 3000.f;\nProjectileMovement->bRotationFollowsVelocity = true;\nProjectileMovement->bShouldBounce = true;\nProjectileMovement->Bounciness = 0.3f;\n\n\u002F\u002F Die after 3 seconds by default\nInitialLifeSpan = 3.0f;\n","cpp",[56,511,512,520,564,584,600,625,636,642,648,680,690,706,720,733,745,760,765,771],{"__ignoreMap":58},[30,513,516],{"class":514,"line":515},"line",1,[30,517,519],{"class":518},"sZdD5","\u002F\u002F Use a sphere as a simple collision representation\n",[30,521,522,526,530,533,536,539,541,544,548,551,555,557,561],{"class":514,"line":252},[30,523,525],{"class":524},"s0idv","CollisionComp ",[30,527,529],{"class":528},"sLXdl","=",[30,531,532],{"class":524}," PCIP.CreateDefaultSubobject",[30,534,535],{"class":528},"\u003C",[30,537,538],{"class":524},"USphereComponent",[30,540,379],{"class":528},[30,542,543],{"class":524},"(",[30,545,547],{"class":546},"s4Wjf","this",[30,549,550],{"class":524},", ",[30,552,554],{"class":553},"scAT4","TEXT",[30,556,543],{"class":524},[30,558,560],{"class":559},"sZnmU","\"SphereComp\"",[30,562,563],{"class":524},"));\n",[30,565,566,569,572,574,578,581],{"class":514,"line":253},[30,567,568],{"class":524},"CollisionComp->",[30,570,571],{"class":553},"InitSphereRadius",[30,573,543],{"class":524},[30,575,577],{"class":576},"stP0Q","15.0",[30,579,580],{"class":528},"f",[30,582,583],{"class":524},");\n",[30,585,587,590,593,595,598],{"class":514,"line":586},4,[30,588,589],{"class":524},"CollisionComp->BodyInstance.",[30,591,592],{"class":553},"SetCollisionProfileName",[30,594,543],{"class":524},[30,596,597],{"class":559},"\"Projectile\"",[30,599,583],{"class":524},[30,601,603,606,609,611,613,615,618,622],{"class":514,"line":602},5,[30,604,605],{"class":524},"CollisionComp->OnComponentHit.",[30,607,608],{"class":553},"AddDynamic",[30,610,543],{"class":524},[30,612,547],{"class":546},[30,614,550],{"class":524},[30,616,617],{"class":528},"&",[30,619,621],{"class":620},"sfUV7","AFPSProjectile",[30,623,624],{"class":524},"::OnHit);\n",[30,626,628,631,633],{"class":514,"line":627},6,[30,629,630],{"class":524},"RootComponent ",[30,632,529],{"class":528},[30,634,635],{"class":524}," CollisionComp;\n",[30,637,639],{"class":514,"line":638},7,[30,640,641],{"emptyLinePlaceholder":260},"\n",[30,643,645],{"class":514,"line":644},8,[30,646,647],{"class":518},"\u002F\u002F Use a ProjectileMovementComponent to govern this projectile's movement\n",[30,649,651,654,656,658,660,663,665,667,669,671,673,675,678],{"class":514,"line":650},9,[30,652,653],{"class":524},"ProjectileMovement ",[30,655,529],{"class":528},[30,657,532],{"class":524},[30,659,535],{"class":528},[30,661,662],{"class":524},"UProjectileMovementComponent",[30,664,379],{"class":528},[30,666,543],{"class":524},[30,668,547],{"class":546},[30,670,550],{"class":524},[30,672,554],{"class":553},[30,674,543],{"class":524},[30,676,677],{"class":559},"\"ProjectileComp\"",[30,679,563],{"class":524},[30,681,683,686,688],{"class":514,"line":682},10,[30,684,685],{"class":524},"ProjectileMovement->UpdatedComponent ",[30,687,529],{"class":528},[30,689,635],{"class":524},[30,691,693,696,698,701,703],{"class":514,"line":692},11,[30,694,695],{"class":524},"ProjectileMovement->InitialSpeed ",[30,697,529],{"class":528},[30,699,700],{"class":576}," 3000.",[30,702,580],{"class":528},[30,704,705],{"class":524},";\n",[30,707,709,712,714,716,718],{"class":514,"line":708},12,[30,710,711],{"class":524},"ProjectileMovement->MaxSpeed ",[30,713,529],{"class":528},[30,715,700],{"class":576},[30,717,580],{"class":528},[30,719,705],{"class":524},[30,721,723,726,728,731],{"class":514,"line":722},13,[30,724,725],{"class":524},"ProjectileMovement->bRotationFollowsVelocity ",[30,727,529],{"class":528},[30,729,730],{"class":576}," true",[30,732,705],{"class":524},[30,734,736,739,741,743],{"class":514,"line":735},14,[30,737,738],{"class":524},"ProjectileMovement->bShouldBounce ",[30,740,529],{"class":528},[30,742,730],{"class":576},[30,744,705],{"class":524},[30,746,748,751,753,756,758],{"class":514,"line":747},15,[30,749,750],{"class":524},"ProjectileMovement->Bounciness ",[30,752,529],{"class":528},[30,754,755],{"class":576}," 0.3",[30,757,580],{"class":528},[30,759,705],{"class":524},[30,761,763],{"class":514,"line":762},16,[30,764,641],{"emptyLinePlaceholder":260},[30,766,768],{"class":514,"line":767},17,[30,769,770],{"class":518},"\u002F\u002F Die after 3 seconds by default\n",[30,772,774,777,779,782,784],{"class":514,"line":773},18,[30,775,776],{"class":524},"InitialLifeSpan ",[30,778,529],{"class":528},[30,780,781],{"class":576}," 3.0",[30,783,580],{"class":528},[30,785,705],{"class":524},[11,787,788],{},"通过BluePrint继承这个类，并且在BluePrint编辑器中添加Component并附上网格，同时要关闭其碰撞。因为基类中已经有了碰撞逻辑的实现。",[11,790,791],{},"关于碰撞方面，不知为何碰撞组的管理是在ini文件中进行配置的，这个留到以后再研究。",[11,793,794],{},"子弹的发射还有一个添加瞄准准星的HUD的过程，大体过程就是绘制，没别的了。是否HUD类能够处理鼠标事件目前不明。",[356,796,797],{"id":797},"角色动画",[11,799,800],{},"角色动画通过状态机来管理，工作在BluePrint中进行。没有用到C++代码，可视化的调整状态机的逻辑，非常的方便。",[11,802,803],{},[41,804],{"alt":43,"src":805,"title":43},"\u002Fwp-content\u002Fuploads\u002F2014\u002F08\u002Fimage_thumb.png",[11,807,808],{},"总体而言算是大致的了解了UE4用C++的方式来搭建游戏的过程，不过详细的API的熟悉还是需要一定的时间过程。作为开头，刚好到此为止。",[810,811,812],"style",{},"html pre.shiki code .sZdD5, html code.shiki .sZdD5{--shiki-default:#66707B;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s4Wjf, html code.shiki .s4Wjf{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sZnmU, html code.shiki .sZnmU{--shiki-default:#032563;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":58,"searchDepth":252,"depth":253,"links":814},[815,816,817,818,819,820,821,822],{"id":358,"depth":252,"text":358},{"id":391,"depth":252,"text":392},{"id":432,"depth":252,"text":432},{"id":445,"depth":252,"text":445},{"id":476,"depth":252,"text":476},{"id":492,"depth":252,"text":492},{"id":501,"depth":252,"text":501},{"id":797,"depth":252,"text":797},"2014-08-09",{"layout":258,"status":259,"published":260,"author":825,"author_login":262,"author_email":263,"author_url":264,"wordpress_id":826,"wordpress_url":827,"date_gmt":828,"excerpt":829},{"display_name":262,"login":262,"email":263,"url":264},950,"\u002F\u002F?p=950","2014-08-09 12:59:00 +0000",{"type":8,"value":830},[831],[11,832,343],{},"\u002F2014-08-09-ue4-official-fps-sample-note",{"title":338,"description":343},"_legacy\u002F2014\u002F2014-08-09-ue4%e5%ae%98%e6%96%b9fps%ef%bc%88c%ef%bc%89%e8%8c%83%e4%be%8b%e5%ae%9e%e7%8e%b0%e8%ae%b0%e5%bd%95",[837,276],"c++","nAEOG3fwndTuulhA-Y-0puqE5TaHgKzX6coCPlzh4yQ",{"id":840,"title":841,"body":842,"date":881,"description":846,"extension":256,"meta":882,"navigation":260,"path":891,"seo":892,"stem":893,"tags":894,"__hash__":897},"blogs\u002F_legacy\u002F2014\u002F2014-08-04-xmpp%e5%ae%a2%e6%88%b7%e7%ab%afc%e5%ba%93gloox%e7%ae%80%e6%98%8e%e6%a6%82%e8%a6%81.md","XMPP客户端C++库Gloox简明概要",{"type":8,"value":843,"toc":879},[844,847,850,853,861,864,870,873,876],[11,845,846],{},"Gloox是Xmpp协议客户端的Lib，使用起来非常简单。官方自带的sample也非常的实用，功能方面恰到好处的没有提供显示之类的。对于开发xmpp的bot而言是非常的合适。",[11,848,849],{},"Xmpp协议虽然不是很流行，但是基于Xmpp的聊天服务还是有很多优点的。使用Xmpp协议来制作bot可以实现很多功能，只要不是网络游戏那样实时大量数据包传递的话，Xmpp是一个很好的避开与网络交互底层接触的解决方案。",[11,851,852],{},"Xmpp的协议详细的可以参照RFC文档，不过既然选择使用库来做的话就是懒得和协议上的东西打交道。基本功能上就是个聊天软件，想要详细接触的童鞋可以下载Pidgin尝试一下，GTalk是可以使用Xmpp协议连接的。",[11,854,855,856],{},"Gloox的设计简单易懂，基于事件驱动。官方有个详细的说明页面，这位前辈的博客上贴出了翻译：",[18,857,860],{"href":858,"rel":859},"http:\u002F\u002Fblog.csdn.net\u002Fkkaxiao\u002Farticle\u002Fdetails\u002F6702298%E3%80%82%E6%9C%89%E5%85%B4%E8%B6%A3%E8%AF%A6%E7%BB%86%E4%BA%86%E8%A7%A3%E7%9A%84%E7%AB%A5%E9%9E%8B%E5%8F%AF%E4%BB%A5%E5%8E%BB%E7%9C%8B%E7%9C%8B%E3%80%82",[66],"http:\u002F\u002Fblog.csdn.net\u002Fkkaxiao\u002Farticle\u002Fdetails\u002F6702298。有兴趣详细了解的童鞋可以去看看。",[11,862,863],{},"如果只是做简单的开发的话，基本上不会需要很深入的了解。等需要的时候再针对性的找找相关说明即可，gloox的文档里面可以找到大多数的答案。Gloox的使用可以简单的分为两个步骤：登陆账号、处理消息。",[49,865,868],{"className":866,"code":867,"language":54},[52],"#include \"gloox\u002Fclient.h\"\n#include \"gloox\u002Fmessagesessionhandler.h\"\n#include \"gloox\u002Fmessageeventhandler.h\"\n#include \"gloox\u002Fmessageeventfilter.h\"\n#include \"gloox\u002Fchatstatehandler.h\"\n#include \"gloox\u002Fchatstatefilter.h\"\n#include \"gloox\u002Fconnectionlistener.h\"\n#include \"gloox\u002Fdisco.h\"\n#include \"gloox\u002Fmessage.h\"\n#include \"gloox\u002Fgloox.h\"\n#include \"gloox\u002Flastactivity.h\"\n#include \"gloox\u002Floghandler.h\"\n#include \"gloox\u002Flogsink.h\"\n#include \"gloox\u002Fconnectiontcpclient.h\"\n#include \"gloox\u002Fconnectionsocks5proxy.h\"\n#include \"gloox\u002Fconnectionhttpproxy.h\"\n#include \"gloox\u002Fmessagehandler.h\"\nusing namespace gloox;\n\n#ifndef _WIN32\n# include \u003Cunistd.h>\n#endif\n\n#include \u003Cstdio.h>\n#include \u003Cstring>\n\n#include \u003Ccstdio> \u002F\u002F [s]print[f]\n\n#if defined( WIN32 ) || defined( _WIN32 )\n# include \u003Cwindows.h>\n#endif\n\nclass MessageTest : public MessageSessionHandler, ConnectionListener, LogHandler,\n    MessageEventHandler, MessageHandler, ChatStateHandler\n{\npublic:\n    MessageTest() : m_session( 0 ), m_messageEventFilter( 0 ), m_chatStateFilter( 0 ) {}\n\n    virtual ~MessageTest() {}\n\n    void start()\n    {\n        \u002F\u002F \u003CID和密码 \n        JID jid( \"username@gmail.com\u002Fgloox\" );  \u002F\u002F \u003C Id后面的\u002Fgloox是资源名称，并不是必须的，Xmpp支持多个客户端同时接入，可以用作区分。\n        j = new Client( jid, \"password\" );\n        \n        \u002F\u002F \u003C注册事件处理\n        j->registerConnectionListener( this );\n        j->registerMessageSessionHandler( this, 0 );\n        j->disco()->setVersion( \"messageTest\", GLOOX_VERSION, \"Win32\" );\n        j->disco()->setIdentity( \"client\", \"bot\" );\n        j->disco()->addFeature( XMLNS_CHAT_STATES );\n        StringList ca;\n        ca.push_back( \"\u002Fpath\u002Fto\u002Fcacert.crt\" );\n        j->setCACerts( ca );\n        j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this );\n\n\n        if( j->connect( false ) )\n        {\n            ConnectionError ce = ConnNoError;\n            while( ce == ConnNoError )\n            {\n                ce = j->recv();\n            }\n            printf( \"ce: %d\\n\", ce );\n        }\n\n        delete( j );\n    }\n\n    virtual void onConnect()\n    {\n        printf( \"connected!!!\\n\" );\n    }\n\n    virtual void onDisconnect( ConnectionError e )\n    {\n        printf( \"message_test: disconnected: %d\\n\", e );\n        if( e == ConnAuthenticationFailed )\n            printf( \"auth failed. reason: %d\\n\", j->authError() );\n    }\n\n    virtual bool onTLSConnect( const CertInfo& info )\n    {\n        time_t from( info.date_from );\n        time_t to( info.date_to );\n\n        printf( \"status: %d\\nissuer: %s\\npeer: %s\\nprotocol: %s\\nmac: %s\\ncipher: %s\\ncompression: %s\\n\"\n            \"from: %s\\nto: %s\\n\",\n            info.status, info.issuer.c_str(), info.server.c_str(),\n            info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(),\n            info.compression.c_str(), ctime( &from ), ctime( &to ) );\n        return true;\n    }\n\n    virtual void handleMessage( const Message& msg, MessageSession * \u002F*session*\u002F )\n    {\n        printf( \"type: %d, subject: %s, message: %s, thread id: %s\\n\", msg.subtype(),\n            msg.subject().c_str(), msg.body().c_str(), msg.thread().c_str() );\n\n        std::string re = \"You said:\\n> \" + msg.body() + \"\\nI like that statement.\";\n        std::string sub;\n        if( !msg.subject().empty() )\n            sub = \"Re: \" +  msg.subject();\n\n        m_messageEventFilter->raiseMessageEvent( MessageEventDisplayed );\n#if defined( WIN32 ) || defined( _WIN32 )\n        Sleep( 1000 );\n#else\n        sleep( 1 );\n#endif\n        m_messageEventFilter->raiseMessageEvent( MessageEventComposing );\n        m_chatStateFilter->setChatState( ChatStateComposing );\n#if defined( WIN32 ) || defined( _WIN32 )\n        Sleep( 2000 );\n#else\n        sleep( 2 );\n#endif\n        m_session->send( re, sub );\n\n        if( msg.body() == \"quit\" )\n            j->disconnect();\n    }\n\n    virtual void handleMessageEvent( const JID& from, MessageEventType event )\n    {\n        printf( \"received event: %d from: %s\\n\", event, from.full().c_str() );\n    }\n\n    virtual void handleChatState( const JID& from, ChatStateType state )\n    {\n        printf( \"received state: %d from: %s\\n\", state, from.full().c_str() );\n    }\n\n    virtual void handleMessageSession( MessageSession *session )\n    {\n        printf( \"got new session\\n\");\n        \u002F\u002F \u003C示例程序只处理一个Session，所以在这里释放掉前一个\n        j->disposeMessageSession( m_session );\n        m_session = session;\n        m_session->registerMessageHandler( this );\n        m_messageEventFilter = new MessageEventFilter( m_session );\n        m_messageEventFilter->registerMessageEventHandler( this );\n        m_chatStateFilter = new ChatStateFilter( m_session );\n        m_chatStateFilter->registerChatStateHandler( this );\n    }\n\n    virtual void handleLog( LogLevel level, LogArea area, const std::string& message )\n    {\n        printf(\"log: level: %d, area: %d, %s\\n\", level, area, message.c_str() );\n    }\n\nprivate:\n    Client *j;\n    MessageSession *m_session;\n    MessageEventFilter *m_messageEventFilter;\n    ChatStateFilter *m_chatStateFilter;\n};\n\nint main( int \u002F*argc*\u002F, char** \u002F*argv*\u002F )\n{\n    MessageTest *r = new MessageTest();\n    r->start();\n    delete( r );\n    getchar();getchar();\n    return 0;\n}\n\n",[56,869,867],{"__ignoreMap":58},[11,871,872],{},"以上代码来自官方的Sample，主要功能是对接到的文字进行复述。在这个基础上进行修改就可以实现常见的需求了。",[11,874,875],{},"在使用gloox的过程中有一点需要注意的是，MessageSession如果保存了其指针的话，不要自行进行Delete操作，而应该交由Client来释放。j->disposeMessageSession( m_session )这样的做法才是正确的。",[11,877,878],{},"由于不是做客户端，实际上做的工作还是比较少的。但是刚上手一个库的时候多少会有些不知所措，希望对有用到的童鞋起到帮助。",{"title":58,"searchDepth":252,"depth":253,"links":880},[],"2014-08-04",{"layout":258,"status":259,"published":260,"author":883,"author_login":262,"author_email":263,"author_url":264,"wordpress_id":884,"wordpress_url":885,"date_gmt":886,"excerpt":887},{"display_name":262,"login":262,"email":263,"url":264},936,"\u002F\u002F?p=936","2014-08-04 12:00:40 +0000",{"type":8,"value":888},[889],[11,890,846],{},"\u002F2014-08-04-xmpp客户端c库gloox简明概要",{"title":841,"description":846},"_legacy\u002F2014\u002F2014-08-04-xmpp%e5%ae%a2%e6%88%b7%e7%ab%afc%e5%ba%93gloox%e7%ae%80%e6%98%8e%e6%a6%82%e8%a6%81",[837,895,896],"XMPP","Gloox","8Pmh-CAzgjTKCb-L_s5XiwTQT1K9fmwQtV1LkzzZA8Q",{"id":899,"title":900,"body":901,"date":1033,"description":905,"extension":256,"meta":1034,"navigation":260,"path":1043,"seo":1044,"stem":1045,"tags":1046,"__hash__":1047},"blogs\u002F_legacy\u002F2014\u002F2014-08-02-%e5%87%a0%e6%ac%be%e7%bd%91%e7%bb%9c%e4%b8%8a%e7%9a%84%e4%ba%a4%e6%98%93%e7%b3%bb%e7%bb%9f%e7%9a%84mt4%e5%ae%9e%e7%8e%b0.md","几款网络上的交易系统的MT4实现",{"type":8,"value":902,"toc":1028},[903,906,909,914,917,944,950,953,957,960,983,989,992,997,1001,1004,1009,1012,1015],[11,904,905],{},"前段研究交易系统的产物，要想快速了解交易系统的构造，最快的方法就是去研究已经成型的交易系统。在此总结和分享一下经验，也为接下来的系统开发理下思路。",[11,907,908],{},"所有系统的代码在文末。需要注意的是，由于系统都没有提供资金管理的思路，统统使用的是海龟的那套资金管理系统。",[910,911,913],"h3",{"id":912},"系统一lema-system","系统一：Lema System",[11,915,916],{},"网上找到的一个系统，似乎不是什么有名的系统的样子。工作在5分钟图上的短线交易系统。",[918,919,920,923,926,929,932,935,938,941],"blockquote",{},[11,921,922],{},"做多规则：",[11,924,925],{},"–价格在EMA16之上",[11,927,928],{},"–EMA16在EMA48之上",[11,930,931],{},"–Laguerre指标从下上穿0.8水平线",[11,933,934],{},"止损设在离开仓价位30点以外",[11,936,937],{},"多头平仓规则:",[11,939,940],{},"当有20pips 利润的时候，平掉一半的仓位，剩下的仓位等到EMA16向下穿越EMA48全部平仓",[11,942,943],{},"空头则与此相反。",[11,945,946],{},[41,947],{"alt":948,"src":949},"Image","\u002Fwp-content\u002Fuploads\u002F2014\u002F07\u002FImage_thumb.png",[11,951,952],{},"测试结果发现无法稳定盈利，主要原因应该是因为使用了均线系统作为入场信号。均线一旦处于纠缠的状态就会频繁的发出买卖信号，导致系统失效。虽然使用了Laguerre指标作为过滤，这一点依然是硬伤。",[910,954,956],{"id":955},"系统二r-breaker","系统二：R-Breaker",[11,958,959],{},"根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位，从大到小依次为：突破买入价（Bbreak)、观察卖出价(Ssetup)、反转卖出价(Senter)、反转买入价(Benter)、观察买入价(Bsetup)、突破卖出价(Sbreak)。以此来形成当前交易日盘中交易的触发条件。这里，通过对计算方式的调整。可以调节六个价格间的距离。",[918,961,962,965,968,971,974,977,980],{},[11,963,964],{},"交易规则：",[11,966,967],{},"反转:",[11,969,970],{},"持多单，当日内最高价超过观察卖出价后，盘中价格出现回落，且进一步跌破反转卖出价构成的支撑线时，采取反转策略，即在该点位反手做空；",[11,972,973],{},"持空单，当日内最低价低于观察买入价后，盘中价格出现反弹，且进一步超过反转买入价构成的阻力线时，采取反转策略，即在该点位反手做多；",[11,975,976],{},"突破:",[11,978,979],{},"在空仓的情况下，如果盘中价格超过突破买入价，则采取趋势策略，即在该点位开仓做多；",[11,981,982],{},"在空仓的情况下，如果盘中价格跌破突破卖出价，则采取趋势策略，即在该点位开仓做空；",[11,984,985],{},[41,986],{"alt":987,"src":988,"title":987},"134728031","\u002Fwp-content\u002Fuploads\u002F2014\u002F07\u002F134728031_thumb.jpg",[11,990,991],{},"使用前一日的波幅来进行当天的波幅划分，在当日结束时清空所有头寸。总体而言似乎没有获得太大的概率优势，感觉上是一个相当微妙的日内交易系统。可能是因为这个交易系统设计上原本不是针对外汇的，故而在外汇上表现平平：",[11,993,994],{},[41,995],{"alt":43,"src":996,"title":43},"\u002Fwp-content\u002Fuploads\u002F2014\u002F07\u002Fimage_thumb3.png",[910,998,1000],{"id":999},"系统三aberration","系统三：Aberration",[11,1002,1003],{},"Aberration系统是一个反向的利用布林带的交易系统，它将价格收在布林带外作为趋势产生的信号入场，并同时在价格报收在布林带中轨的另一边时离场。",[11,1005,1006],{},[41,1007],{"alt":43,"src":1008,"title":43},"\u002Fwp-content\u002Fuploads\u002F2014\u002F07\u002Fimage_thumb4.png",[11,1010,1011],{},"需要注意的是，Aberration和R-Breaker这两个系统并不是完整的，在互联网上公开出来的都是类似于泄露版的规则。由于没有配套的资金管理策略，同时没有详细的规则，所以实现出来的系统表现有些不尽人意。",[11,1013,1014],{},"不过Aberration系统当前的规则作为趋势系统并没有很好的表现，很大的可能性在于并不是所有的趋势启动都会由冲破布林带开始。",[918,1016,1017,1020],{},[11,1018,1019],{},"--- 下载地址 ---",[11,1021,1022,1023,1027],{},"链接: ",[18,1024,1025],{"href":1025,"rel":1026},"http:\u002F\u002Fpan.baidu.com\u002Fs\u002F1gdiSL7X",[66]," 密码: 1wbi",{"title":58,"searchDepth":252,"depth":253,"links":1029},[1030,1031,1032],{"id":912,"depth":253,"text":913},{"id":955,"depth":253,"text":956},{"id":999,"depth":253,"text":1000},"2014-08-02",{"layout":258,"status":259,"published":260,"author":1035,"author_login":262,"author_email":263,"author_url":264,"wordpress_id":1036,"wordpress_url":1037,"date_gmt":1038,"excerpt":1039},{"display_name":262,"login":262,"email":263,"url":264},923,"\u002F\u002F?p=923","2014-08-01 20:10:37 +0000",{"type":8,"value":1040},[1041],[11,1042,905],{},"\u002F2014-08-02-几款网络上的交易系统的mt4实现",{"title":900,"description":905},"_legacy\u002F2014\u002F2014-08-02-%e5%87%a0%e6%ac%be%e7%bd%91%e7%bb%9c%e4%b8%8a%e7%9a%84%e4%ba%a4%e6%98%93%e7%b3%bb%e7%bb%9f%e7%9a%84mt4%e5%ae%9e%e7%8e%b0",[],"XmmHpybTGbLV-KKAq2pR4JIfsrK-wFQufWMsz1DVykg",222,1788763183778]