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

 
Ais:

你好,Cameofx,
谢谢你的回复。
这个编码系统非常简单易行。
所有的工作都是在MetaEditor中手动完成的。
事实上,这个系统的设计是为了方便和高速地开发大型程序。
这个系统也应该是灵活和可靠的。
最好的问候!

Ais,谢谢你的回答。我从你的帖子里学到了很多东西 :)

凸显

 

朋友们好!

过去的一件事日复一日地笼罩着我。
这是AIS5贸易机的文件。
只要上帝决定,我就会回来。

暂时再见!

 

你好,艾斯
我们将非常想念你的缺席。照顾好自己。
我们欢迎你回来。
你的朋友,干杯

 

你好,Ais
你回来后,我很抱歉立即给你带来更多的问题。这不是你的系统的问题,我对大多数程序都有这个问题。它与用户定义的函数 有关。用户定义的函数是如何得到它的定义的。
比如说。

int       iSignalOpen ()     //       - i      17 l       1 o     //< This is what iSignalOpen function will do.....
{                                                                 //< When the chart is opened, first pass..
if    ( ( iTradeBarTime    == iTime   ( 0 , 0 , 0 ) )   //< false input, EMPTY == (0,0,0)------|
      &&         //                                         &&                                 |--(return)EMPTY
      ( iTradeBarOnce    == 1 ))                        //< true  input, 1 == 1 ---------------|
      return ( EMPTY);
      
// This proves, 'EMPTY' will always be returned when the chart first opens. At the next tick...       
// ... 'iTime' will have parameters, example: (EUR/USD,HOUR_1,1) it is a predefined function so that...
// ... these parameters will be collected so that an expression can be calculated. Where as the... 
// ... 'iTradeBarTime' is not predefined. 'iTradeBarTime' was assigned 'EMPTY' at declaration earlier in the program.
// 'iTradeBarTime' knows that it is 'EMPTY'and nothing else. 
// When and how did 'iTradeBarTime' get deifined to collect data so that it's value can be other than 'EMPTY'? 
// The 'iTradeBarTime' has to have the same values as the 'iTime', or the input will never be 'true'?
// If it is never 'true', the return is always 'EMPTY'? 
我在书中或论坛上似乎找不到任何确定的答案。在继电器逻辑原理图中,AND门的工作原理与上述例子相同。只有当有两个 "真 "输入时,才会有一个 "真 "输出。只有这样,控制才会继续。
等待您的答复。谢谢你。
欢呼声
 

你好,Huckleberry

让我们澄清这部分代码。

1.可能的主要困难:
1.1. 所有人类的思维和行为都是不同的;
1.2.我喜欢使用严格限制的数据类型;
1.3.我只喜欢使用 "标准 "数据类型:
1.3.1. "int",
1.3.2. "double",
1.3.3. "string";
1.4.我只在特殊情况下使用其他数据类型;
1.5.我在名字的第一个位置用小字母表示我的程序元素的类型:
1.5.1. "i "表示 "int "数据类型,
1.5.2. "d "表示 "double "数据类型,
1.5.3. "s "表示 "string "数据类型,
1.5.4."r "表示 "未定义 "数据类型;
1.6. 这种编程技术帮助我控制类型转换;
1.7. 预定义函数和常量也可以有以下数据类型:
1.7.1. "bool",
1.7.2. "color",
1.7.3. "dateetime";
1.8.我总是试图将这些类型转换为 "int "类型;
1.9. 今天,我的数据转换通常是隐式的;
1.10. 我的编程技术的一些要点:
1.10.1.我喜欢使用一对常数 "TRUE "和 "EMPTY",而不是一对常数 "TRUE "和 "FALSE";
1.10.2.10.2. 在 "if "语句中,有时我使用 "1 "和 "0",而不是 "TRUE "和 "FALSE";
1.10.3.我使用负值"-1 "的常数 "EMPTY "来表示无符号数据元素的无效结果;
1.10.4. 今后我将使用名称中带有 "b "前缀的 "bool "类型。

2.我们必须了解以下MQL4数据类型:
2.1. "int "是一个<!>无符号</!>长4字节的整数,值从-2147483648到2147483647;
2.2. "datetime "是一个<!>无符号</!>长4
字节的整数。>无符号</!>长4字节整数,值从0到4294967295;
2.3. 将 "datetime "的值分配给 "int "变量,我们得到正确的结果,大约到2038.01.01。

3.我们必须了解 "iTime ( symbol, timeframe, shift ) "函数:
3.1. 这个函数总是返回一个 "datetime "类型的值;
3.2. 有两种不同的返回情况:
3.2.1. 如果本地历史是空的,则返回 "0";
3.2.2. 在所有其他情况下,用 "shift "表示酒吧的打开时间
3.3."iTime ( 0, 0, 0 ) "返回当前图表中零条的开放时间;
3.4. 如果零条是相同的,"iTime ( 0, 0, 0 ) "返回相同的值;
3.5.当当前的零条完成后,该条成为第1条,新的零条开始形成;
3.6. "iTime ( 0, 0, 0 ) "返回新的值;
3.7. 因此,当零条变化时,"iTime ( 0, 0, 0 ) "的值也在变化。

4.我们防止在程序块 "2.2.3.1.历史数据检查"。

5.当订单在 "iTryClose "函数中被成功关闭时,我们指定 "iTradeBarTime = iTime ( 0, 0, 0 ) ;"。

6
.在 "iSignalOpen "函数中我们检查是否 "iTradeBarTime == iTime ( 0, 0, 0 ) )"。

7.如果是真的,并且通过 "iTradeBarOnce = 1 ; "禁止重复交易,那么我们通过 "EMPTY "值禁止信号打开。

干杯

 

你好,艾斯
谢谢你的答复。我将在这方面进行研究,并很快回来。
谢谢

 

你好,艾斯。
对不起,我的回复很慢。我周一开始回到我的正常工作岗位上。这些天的时间有点短。学习时间也更短。
正如我早些时候在这个主题中提到的,我喜欢把事情分解成螺母和螺栓。一个链轮是如何向另一个链轮提供动力的,等等。所以我发现,程序内的控制是很有吸引力的。请理解,我对你提供的耐心和知识给予了应有的尊重,但我有疑问,为什么2.2.3.1块是必要的?
iBaseLag + iBaseBar怎么可能是一个表达式?
我理解iBaseLag和iBaseBar是在iHighest和iLowest的参数范围内。除非它们是明确的数字。
iBaseLag是20,代表用于计算平均数的20个条形。
iBaseBar代表平均数应该从哪个条开始计算。从第1条到第20条,在这种情况下,第0条不被考虑。
我擅自将程序缩短为/*2.2.3.1*/。测试了该程序,发现结果相同。在真实交易条件下运行程序时,这可能不是一个好主意。
请问您的看法是什么?
另外,你对2.1.2块的解释也澄清了我的困惑。iTime返回零条的开放时间
iTradeBarTime也是一种类型的数据时间。程序知道交易发生在哪个柱子上,因此每个柱子只有一个交易。.iTradeBarOnce == 1
谢谢你
我在接下来的日子里会多加研究。但是 reservered block 2.1.1 能否用于为现有头寸提供额外头寸的功能。例如:一个现有的多头,然后增加三个或更多的多头?
对于程序中已有的功能,是否会与附加仓位发生冲突?
再次感谢您所做的一切。保持良好状态
谢谢

 

你好,Huckleberry。

让我们仔细看一下程序的主要部分,包括2.2.3.1块。

////////////////////////////////////////////////////////////////////<        14>
// < 2.2.3. Code : Special : Start >                              //<          >
int       start   ()         //       - i       9 l       - o     //<          >
{                                                                 //<          >
// < 2.2.3.1. History data inspection 4 >`````````````````````````//<          >
static    int       iTrigger   = 0       ; if ( iTrigger == 0 ) { //<          >
  if  ( ( iTime ( 0 , 0 , 0 ) == 0                          )     //<          >
  ||    ( iBars ( 0 , 0     )  < iBaseLag     + iBaseBar    ) )   //<          >
          return                         ; else iTrigger  = 1 ; } //<          >
// </2.2.3.1. History data inspection 4 >`````````````````````````//<          >
//                                                                //<          >
// < 2.2.3.2. Main routine 3 >````````````````````````````````````//<          >
int       iTicket           = iGetTicket ()                     ; //<          >
//                                                                //<          >
if      ( iTicket < 0 )       iTryOpen   ()                     ; //<          >
else                          iTryClose  ()                     ; //<          >
// </2.2.3.2. Main routine 3 >````````````````````````````````````//<          >
//                                                                //<          >
// < 2.2.3.3. Exception handler 2 >```````````````````````````````//<          >
int       iTrap   =           GetLastError ()                   ; //<          >
if      ( iTrap   > 0 )       Alert  ( "Exception " , iTrap   ) ; //<          >
// </2.2.3.3. Exception handler 2 >```````````````````````````````//<          >
}                                                                 //<          >
// </2.2.3. Code : Special : Start >                              //<          >
////////////////////////////////////////////////////////////////////<         0>

这段代码以下列方式工作

1. 2.2.3.1.区块,即程序的第一个区块,是一个简单的触发器:
1.1. "static int iTrigger "在程序的整个生命周期内存储自己的值,这是 "静态的";
1.2. 最初 "iTrigger == 0";
1.3. 语句 "if ( iTrigger == 0 ) "在每个 tick 上执行;
1.4. 第一次,当 "iTrigger == 0 "时,在{...}块内执行历史数据检查;
1.5. 如果历史数据不正确,语句 "return; "被执行;
1.6. 这意味着主函数"start() "的执行结束;
1.6.
如果历史数据正确,语句 "iTrigger = 1; "被执行;
1.9. 然后主函数 "start () "继续执行;
1.10.在下一次打勾时,语句 "if ( iTrigger == 0 ) "再次被执行;
1.11. "iTrigger "的值现在和将来总是"== 1",因为它是静态的;
1.12. 所以在将来历史数据检查总是被跳过;
1.13. 这就是简单的触发。

2.历史数据检查包括两部分:
2.1.检查本地历史是否为空 "iTime ( 0, 0, 0 ) == 0";
2.2.检查本地历史的大小是否足以计算 "iATR ( 0, 0, iBaseLag, iBaseBar )",其中。
2.2.1. "iBaseBar "是 "iATR "的起始条;
2.2.2. "iBaseLag "是 "iATR "的平均条数;
2.2.3."iBaseLag + iBaseBar "是一个通常的表达式,结果总是 "iBaseLag "和 "iBaseBar "之和;
2.2.4. 换句话说,表达式 "iBaseLag + iBaseBar "等同于 "iBaseLag "和 "iBaseBar "之和;
2.2.5.我们可以在1.1.1块的程序输入中为 "iBaseLag "和 "iBaseBar "指定任何数值;
2.2.6. 让我们指定 "iBaseLag = 100; "和 "iBaseBar = 7;";
2.2.7.如果本地历史的大小等于107或更大,那么 "iATR ( 0, 0, iBaseLag, iBaseBar ) "的正确计算将是可能的,因为计算的最后一个条数是
#106,条数0总是被考虑。

在任何程序中都可以添加任何数量的函数,2.1.1块只是演示了可能的实现示例。
提供额外的位置将需要比函数2.1.4更复杂的位置分析和管理代码。
但一切皆有可能。

欢呼声

 

你好,Ais
谢谢你的快速回复。我可以理解你所说的大部分内容。特别是关于iATR功能。你说使用iBaseLag+iBasebar的表达式,本身就是公式的一个可接受部分。我的印象是,它们必须与在一个定义的函数的参数中,否则不允许。这是为了检查本地历史记录的大小,如果实际上有足够的条形图来进行。这就是你所指出的吗?这么多的步骤,但却是完成目标的必要步骤。会被忽视的步骤,或被认为是理所当然的步骤。
我会在其他方面多加咀嚼的。谢谢你的时间。
谢谢

 

你好,Huckleberry
MQL4是一个非常友好的环境,特别是与C或汇编程序等相比。
对各种检查和 其他技巧的要求明显减少。
但是,在开发环境中实现最大可能的检查总是会降低性能。
无论如何,程序员总是要对程序的不良行为负责。
所以对我来说,多余的重新检查比,例如,边界的基本损坏要好。
欢呼声

原因: