关闭的问题,请帮助 - 页 5

 

你好,艾斯
你的答复很令人满意。听到你能帮助我理解复杂性,然后帮助减少复杂性,这比我的要求还要高。在你的慷慨面前,我很谦虚。谢谢你。
我确实有关于你的程序中的评论结构的问题。并不是说我想脱离已经取得进展的思路,而是一个关于格式的问题,我不熟悉。

例子。

// < 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
有些功能是增加的,可以很容易地被改变或删除
程序的改进是一个永恒的过程。
暂时再见
:)

 
Ais wrote>>

你好,Huckleberry
有些功能是增加的,可以很容易地改变或删除。
程序的改进是一个永恒的过程。
暂时再见
:)


你好,艾斯
感谢你所做的一切。
昨晚我在复制你的程序时终于发现了我的错误。
目前,我正试图了解一些变量的用途,以及它们是如何工作的。
iSignalClose是我插入其他程序的一部分,以建立OrderClosePrice。有了
你的建议。

dDelta = OrderOpenPrice () - OrderClosePrice

该程序具有更大的灵活性。
有更多的问题请回来。和评论。
谢谢
 

你好,爱思网
,问题出现了。你的程序在..... iTryOpen()中指出

else if     ( iCommand       == OP_BUY )
   {          
string        sType           = "Buy"   ;   
int           iColor          =  Blue   ;               }
else         
   {          sType           = "Sell"  ;    
              iColor          =  Red    ;           

出于我的好奇心,是否应该有

else if     ( iCommand       == OP_BUY  )
   {          
string        sType           = "Buy"   ;   
int           iColor          =  Blue   ;               }
else if     ( iCommand       == OP_SELL )   // Was this ommitted     
   {          sType           = "Sell"  ;    
              iColor          =  Red    ;               }
下面是另一个问题,以便更好地理解
// < 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 ) ; } //<          >
//                                                  
如果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