// //< >
// < 1. Data 7 = 4 i 3 d - s > //< >
// < 1.1. Input 7 = 4 i 3 d - s /> //< >
// < 1.2. Buffer - = - i - d - s /> //< >
// </1. Data 7 = 4 i 3 d - s > //< >
// //< >
// < 2. Code 9 / - i 82 l 4 o > //< >
// < 2.1. Interface 6 / - i 71 l 4 o /> //< >
// < 2.2. Special 3 / - i 11 l - o /> //< >
// </2. Code 9 / - i 82 l 4 o > //< >
// //< >
////////////////////////////////////////////////////////////////////< 2>
// < 1.1. Data : Input > //< >
// //< >
// < 1.1. Input 7 = 4 i 3 d - s > //< >
// < 1. Strategy 4 = 2 i 2 d - s /> //< >
// < 2. Trading 3 = 2 i 1 d - s /> //< >
// </1.1. Input 7 = 4 i 3 d - s > //< >
// //< >
////////////////////////////////////////////////////////////////////< 3>
// < 1.2. Data : Buffer > //< >
// //< >
// < 1.2. Buffer - = - i - d - s > //< >
// </1.2. Buffer - = - i - d - s > //< >
// //< >
////////////////////////////////////////////////////////////////////< 4>
// < 2.1. Code : Interface > //< >
// //< >
// < 2.1. Interface 6 / - i 71 l 4 o > //< >
// < 1. iNewBar - i 4 l 1 o /> //< >
// < 2. iSignalOpen - i 15 l 1 o /> //< >
// < 3. iSignalClose - i 15 l 1 o /> //< >
// < 4. iGetTicket - i 7 l 1 o /> //< >
// < 5. iTryOpen - i 15 l - o /> //< >
// < 6. iTryClose - i 15 l - o /> //< >
// </2.1. Interface 6 / - i 71 l 4 o > //< >
// //< >
////////////////////////////////////////////////////////////////////< 11>
// < 2.2. Code : Special > //< >
// //< >
// < 2.2. Special 3 / - i 11 l - o > //< >
// < 1. init - i 1 l - o /> //< >
// < 2. deinit - i 1 l - o /> //< >
// < 3. start - i 9 l - o /> //< >
// </2.2. Special 3 / - i 11 l - o > //< >
// //< >
你好,艾斯
你的答复很令人满意。听到你能帮助我理解复杂性,然后帮助减少复杂性,这比我的要求还要高。在你的慷慨面前,我很谦虚。谢谢你。
我确实有关于你的程序中的评论结构的问题。并不是说我想脱离已经取得进展的思路,而是一个关于格式的问题,我不熟悉。
例子。
// < Structure 17 elements in 4 domains > //<> < 1.
</> <1.数据 2个域中的8个元素 /> //< >
<2.代码 9个元素在2个领域 /> //< >。
// <结构 4个领域中的17个元素 > //< >
// //< >
</> <1.数据 8 = 5 i 3 d - s > //<> <1.1.
// < 1.1.输入 7 = 4 i 3 d - s /> //< >。
// < 1.2.缓冲区1 = 1 i - d - s /> //< >。
// </1.数据8 = 5 i 3 d - s > //< >。
// //< >
评论的结构是如此的清晰。有了标题和次级评论,将是我描述我所读到的内容的最好方式。仿佛这些评论是由一台代码机开发和形成的,或者说是结构化的?这是令人印象深刻的。不是说我理解所有的评论。你的组织能力让我觉得很新鲜。
再次感谢你。我将研究这个程序,并在不久的将来提出更多问题。
干杯
你好,Huckleberry
很高兴听到你的消息。
1.结构
该结构是由我自己开发和格式化的。
// //< > // < Structure 16 elements in 4 domains > //< > // < 1. Data 7 elements in 2 domains /> //< > // < 2. Code 9 elements in 2 domains /> //< > // </Structure 16 elements in 4 domains > //< > // //< >
第一个意图是将全局数据和代码严格分开。
计算机程序对我来说是现实世界的模型。
全局数据是这个世界的东西。
代码是一系列的行动。
我把它们分开,是为了强调我理解它们之间的区别。
计算元素的数量有助于我检查和控制程序中的一切。
2.格式化
格式化是一个简单的HTML。
下面的标签打开程序的一部分。
// < > //< >
后面的标签关闭程序的一部分。
// </ > //< >
下面的标签用于单行的程序部分。
// < /> //< >
标签的结尾部分现在用于页面计数。
在未来,这部分标签的使用可能会扩展。
//< >
页面结构有助于在程序中轻松导航。
使用<Page Up>和<Page Down>,我总是在相同的地方看到相同类型的标签。
3.元素
数据的元素是一个单一的全局变量。
我看到数组也是单一元素。
本地变量只是代码元素的临时实体。
代码的元素是一个单一的函数。
我也可以使用 "方法 "这个词。
我使用 "接口 "这个词来表示联合的函数集。
为了减少复杂性,我把数据和代码划分在逻辑域中。
域的数量取决于程序的结构。
通常的数据域:"输入"、"设置"、"控制"、"缓冲区"...
通常的代码域:"特殊 "用于特殊功能集,"接口 "用于其他功能集。
如果是大型程序,我可以创建具有不同 "接口 "的 "对象"。
为了控制数据元素和代码元素的完整性,采用了计数法。
// //< > // < 1. Data 7 = 4 i 3 d - s > //< > // < 1.1. Input 7 = 4 i 3 d - s /> //< > // < 1.2. Buffer - = - i - d - s /> //< > // </1. Data 7 = 4 i 3 d - s > //< > // //< > // < 2. Code 9 / - i 82 l 4 o > //< > // < 2.1. Interface 6 / - i 71 l 4 o /> //< > // < 2.2. Special 3 / - i 11 l - o /> //< > // </2. Code 9 / - i 82 l 4 o > //< > // //< >
开头和结尾标签包含相同的总和。
通常情况下,我在开头标签中计算总和。
然后,我只是复制并插入开头标签,而不是结尾标签,然后加上结尾斜线"/"。
为了控制数据的完整性,使用了以下符号。
整数 "的数据元素的数量被记为 "i"。
双数 "的数据元素的数量被记为 "d"。
字符串 "的数据元素的数量被记为 "s"。
左栏包含 "i "+"d "+"s "这一行的总和。
为了控制代码的完整性,使用了以下符号。
函数输入的数量,也就是函数参数的数量,被记为 "i"。
代码的开放行数被记为 "l"。
函数输出的数量被记为 "o"。
对于返回任何数值的单个函数,总是 "1",而在所有其他情况下则是"-"。
左列包含域中的函数数量。
4.域
这些是域的标题。
////////////////////////////////////////////////////////////////////< 2> // < 1.1. Data : Input > //< > // //< > // < 1.1. Input 7 = 4 i 3 d - s > //< > // < 1. Strategy 4 = 2 i 2 d - s /> //< > // < 2. Trading 3 = 2 i 1 d - s /> //< > // </1.1. Input 7 = 4 i 3 d - s > //< > // //< >
////////////////////////////////////////////////////////////////////< 3> // < 1.2. Data : Buffer > //< > // //< > // < 1.2. Buffer - = - i - d - s > //< > // </1.2. Buffer - = - i - d - s > //< > // //< >
////////////////////////////////////////////////////////////////////< 4> // < 2.1. Code : Interface > //< > // //< > // < 2.1. Interface 6 / - i 71 l 4 o > //< > // < 1. iNewBar - i 4 l 1 o /> //< > // < 2. iSignalOpen - i 15 l 1 o /> //< > // < 3. iSignalClose - i 15 l 1 o /> //< > // < 4. iGetTicket - i 7 l 1 o /> //< > // < 5. iTryOpen - i 15 l - o /> //< > // < 6. iTryClose - i 15 l - o /> //< > // </2.1. Interface 6 / - i 71 l 4 o > //< > // //< >
////////////////////////////////////////////////////////////////////< 11> // < 2.2. Code : Special > //< > // //< > // < 2.2. Special 3 / - i 11 l - o > //< > // < 1. init - i 1 l - o /> //< > // < 2. deinit - i 1 l - o /> //< > // < 3. start - i 9 l - o /> //< > // </2.2. Special 3 / - i 11 l - o > //< > // //< >
计数的规则和符号与程序头的规则和符号是一样的。我只是把域的标题的开头标签复制到程序的标题中。域名中的每一页都有开头和结尾标签。比如说。
////////////////////////////////////////////////////////////////////< 12> // < 2.2.1. Code : Special : Init > //< > .. // </2.2.1. Code : Special : Init > //< >
前导数字用于结构部分的计数和导航。
然后是程序中 "数据 "或 "代码 "部分的符号。
然后是域的名称。
然后是域内元素的名称。
希望这能对你有所帮助。
再见,等待你的答复
嗨,艾斯
你的组织意识是......,怎么说呢.....,实用而合理。
融入HTML可以方便导航,尽管我现在还不能理解。
非常好。
在这个时候,我正在分析你发给我的程序,一个一个的陈述。 你的概念
你关于变量的概念,是可以理解的。再次感谢你。
我相信我一定会回复你的问题。
再见
你好,Ais,,<本文已被编辑>。
该方案还没有被吸收。很抱歉,它占用了你这么多时间。有一个地方我一定是错过了。
因为我有一个错误需要解决。
我现在必须走了,但明天会回来。
暂时再见
你好,Huckleberry
有些功能是增加的,可以很容易地被改变或删除。
程序的改进是一个永恒的过程。
暂时再见
:)
你好,Huckleberry
有些功能是增加的,可以很容易地改变或删除。
程序的改进是一个永恒的过程。
暂时再见
:)
你好,艾斯感谢你所做的一切。
昨晚我在复制你的程序时终于发现了我的错误。
目前,我正试图了解一些变量的用途,以及它们是如何工作的。
iSignalClose是我插入其他程序的一部分,以建立OrderClosePrice。有了
你的建议。
dDelta = OrderOpenPrice () - OrderClosePrice
该程序具有更大的灵活性。
有更多的问题请回来。和评论。
谢谢
你好,爱思网
,问题出现了。你的程序在..... iTryOpen()中指出
出于我的好奇心,是否应该有
下面是另一个问题,以便更好地理解 如果iNewBar是TRUE,控制权将传递给iSignalOpen。如果iNewBar是TRUE(等于当前的bar??),或者iFirstRun ==1,那么iFirstBar = 0。这令人困惑,只是因为我不明白iNewBar()的定义和/或iFirstRun的定义。我可以看到iFirstRun在哪里被清除和初始化,但它是什么意思。我很抱歉为这么简单的问题给你带来负担。我无法计算或看到这两者在函数 中是如何工作的。当你有时间的时候,你能不能把这个问题弄清楚。
再次感谢您的努力。)
谢谢
你好,哈克贝利
这两个问题都很重要!
答案1.
两个条件都是真的,但是如果:
1.1.我们知道
int iCommand = iSignalOpen () ; //< >
1.2. 我们知道 "iSignalOpen() "只能返回3个可能的值:"EMPTY"、"OP_BUY "和 "OP_SELL"。
1.3. 第一个值已经被检查过了
if ( iCommand == EMPTY ) return ; //< >
1.4. 第二个值也被检查
if ( iCommand == OP_BUY ) //< >
那么可以省略最后一个检查 "如果",以稍微加快计算速度。
else if ( iCommand == OP_SELL ) //< >
答案2.
2.1.
"iTime ( 0, 0, 0 ) "返回当前未完成栏位的开盘时间。
当前栏位的索引总是0,它是 "iTime ( 0, 0, 0 ) "中的第三个值。
将变量 "int iTime_0 "声明为 "静态",意味着该变量的值在函数调用之间被保存。
每次当开盘时间改变时,我们:
2.1.1. 赋值 "iTime_0 = iTime ( 0, 0, 0 ); "以保存当前小节的开盘时间;
2.1.2. 返回 "TRUE",表示当前小节是一个新小节,上一个小节编号0成为小节编号1。
////////////////////////////////////////////////////////////////////< 5> // < 2.1.1. Code : Interface : iNewBar > //< > int iNewBar () // - i 4 l 1 o //< > { //< > static int iTime_0 = 0 ; //< > // //< > if ( iTime_0 < iTime ( 0 , 0 , 0 ) ) //< > { iTime_0 = iTime ( 0 , 0 , 0 ) ; return ( TRUE ) ; } //< > else { return ( EMPTY ) ; } //< > } //< > // </2.1.1. Code : Interface : iNewBar > //< >
2.2.我们在 "iSignalOpen() "中计算 "dHigh "和 "dLow "以及在 "iSignalClose() "中计算 "dATR "的起始条是 "iBaseBar=1"。
虽然条数1是相同的,但这些值是相同的。
这是一个只在新条形上计算这些值的理由。
这可以加快程序的速度。
变量 "static int iFirstRun "是一个简单的触发器。
初始值 "1 "强制计算 "dHigh"、"dLow "和 "dATR",在程序第一次运行时,不管任何条件如何。
这提高了程序的可靠性。
<后来添加的
确切地说,在第一个程序运行时,"iSignalOpen() "中的 "iNewBar() "返回 "TRUE",而 "iSignalClose "中返回 "EMPTY"!
这是因为在第一次调用 "iNewBar() "时,也就是在第一次运行 "iSignalOpen() "时,"iTime_0 = 0"而在第二次调用 "iNewBar () "时,也就是在第一次运行 "iSignalClose () "时,"iTime_0 = iTime ( 0, 0, 0 )"!
由于没有第一次运行控制的结果可能是 "dATR = 0"。
这就是第一次运行。
</后加>
紧接着,我们指定 "iFirstRun = 0",下面的条件将只在新的条形图上为真。
if ( ( iNewBar () == TRUE ) || ( iFirstRun == 1 ) ) //< >
但是!
iSignalOpen() "和 "iSignalClose() "的剩余代码在每个tick 上执行!
只有不变的值的计算被跳过。
////////////////////////////////////////////////////////////////////< 6> // < 2.1.2. Code : Interface : iSignalOpen > //< > int iSignalOpen () // - i 15 l 1 o //< > { //< > static int iFirstRun = 1 ; //< > if ( ( iNewBar () == TRUE ) || ( iFirstRun == 1 ) ) //< > { iFirstRun = 0 ; //< > int iIndexH = iHighest ( 0 , 0 , MODE_HIGH , //< > iBaseLag , iBaseBar ) ; //< > int iIndexL = iLowest ( 0 , 0 , MODE_LOW , //< > iBaseLag , iBaseBar ) ; //< > static double dHigh ; dHigh = High [ iIndexH ] ; //< > static double dLow ; dLow = Low [ iIndexL ] ; //< > } // if //< > // //< > double dAsk = MarketInfo ( Symbol () , MODE_ASK ) ; //< > if ( dAsk > dHigh ) return ( OP_BUY ) ; //< > // //< > double dBid = MarketInfo ( Symbol () , MODE_BID ) ; //< > if ( dBid < dLow ) return ( OP_SELL ) ; //< > // //< > return ( EMPTY ) ; //< > } //< > // </2.1.2. Code : Interface : iSignalOpen > //< >
希望这可能会有所帮助。
干杯!
:)
P.S.后来添加了一些评论。
,看了这些评论,显然 "iNewBar() "必须得到纠正。
这是因为这个函数调用了两次来检查一个事件。
现在,对于同一个事件,第一次调用 "iNewBar() "返回正确值,而第二次返回错误值。
将得到纠正。
Hi Ais
谢谢你的澄清。我将跟进更多的阅读。我对代码还没有完全掌握。
但你提到有一些东西必须要纠正,至于iNewBar吗?我不确定iNewBar在回测 中所显示的问题中是否有错。可能有两个问题?
这是我在回测后打开图表时看到的情况。我们知道,当卖出价高于过去20个柱子的最高点时,就可以买入。卖出则正好相反。然而,这些条目并不一致。这是你看到的那个区域吗?
还发现了一件事。硬止损的计算是Atr*2。这是正确的,但我没有看到这是在哪里计算的。但真正的问题是,止盈的计算方式也是Atr*2。如果我知道硬止损是在哪里计算的,我可能会纠正止盈。在这种情况下,TakeProfit只应该是Atr*1。
保重,我明天会回来。
谢谢
嗨,Huckleberry
TakeProfit条件是我自己为测试目的而发明的。
现在它被改变了。
我使用 "dATR * dFactorTP "和 "dATR * dFactorSL "代替 "Atr*2 "和 "Atr*1"。
初始值 "dFactorTP = 1.0 "和 "dFactorSL = 2.0 "是在第2页 "数据 :
这样的解决方案可以很容易地优化 这些值。
我改变了 "iSignalOpen() "和 "iSignalClose() "函数。
现在在这些函数中实现了对新条目的检查。
"iSignalOpen() "中 "买 "和 "卖 "的条件似乎是正确的。
完整程序见下页附件。
Cheers