//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 06.03.2008 |//| Описание : Возвращает флаг существования позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| ot - время открытия ( 0 - любое время открытия) |//+----------------------------------------------------------------------------+boolExistPositions(stringsy="", intop=-1, intmn=-1, datetimeot=0){inti, k=OrdersTotal();
if(sy=="0")sy=Symbol();
for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){if(OrderSymbol()==sy || sy==""){if(OrderType()==OP_BUY || OrderType()==OP_SELL){if(op<0 || OrderType()==op){if(mn<0 || OrderMagicNumber()==mn){if(ot<=OrderOpenTime())return(True);
}}}}}}return(False);
}
更多关于如何使用SetOrder()函数的例子。
为了清楚起见,我们应该选择一个具有较大的最低允许止损/止盈水平的符号,单位为点。我选择了AUDCAD,在我选择的经纪公司里,这个水平的测试是10点。
1.设置一个买入限价订单,手数为0.1,比当前价格低5点。我特意选择了比最低允许水平更低的订单设置水平,以获得错误130(不正确的止损),并展示SetOrder函数将如何解决它。
协议的内容(从下到上阅读)。
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: 删除
2008.03.17 09:06:24 stdlib AUDCAD,M5: 删除
2008.03.17 09:06:24 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: open #21616412 buy limit 0.10 AUDCAD at 0.9180 ok
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: SetOrder(): 纠正了价格水平
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=Buy Limit pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:06:15 stdlib AUDCAD,M5: 载入成功
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5: 载入成功
协议显示,该函数曾试图下一个0.9185的订单(pp=0.9185),但交易服务器不接受这样的订单,并返回错误130。然后,该功能根据最小允许水平修正订单设置水平,并进行下一次交易尝试,成功结束。该订单被设定在0.9180。
2.设置一个买入止损单,手数为0.3,高于当前价格6点,止损为9点。
议定书的内容(从下往上读)。
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: 删除
2008.03.17 09:27:36 stdlib AUDCAD,M5: 删除
2008.03.17 09:27:36 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: open #21617419 buy stop 0.30 AUDCAD at 0.9209 sl: 0.9195 ok
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: SetOrder(): 纠正了价格水平
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Ask=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Buy Stop pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:27:26 stdlib AUDCAD,M5: 载入成功
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5: 载入成功
这个例子显示了订单设置水平如何从0.9204变为0.9209。同时,止损水平保持在sl=0.9195不变。也就是说,以点为单位的止损从9个增加到14个。
3.设置一个0.5手的SellLimit订单,价格高于当前价格8点,止损9点,接单7点。
议定书的内容。
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: 删除
2008.03.17 10:38:50 stdlib AUDCAD,M5: 删除
2008.03.17 10:38:50 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5: open #21620553sell limit 0.50 AUDCAD at 0.9190 sl: 0.9201 tp: 0.9179 ok
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: SetOrder(): 纠正了价格水平
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Sell Limit pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 10:38:40 stdlib AUDCAD,M5:加载成功
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5: 载入成功
这个例子再次试图设置一个离市场太近的限价单。订单设置水平已经从0.9188上调了2个点到0.9190。止损位也进行了调整,但从0.9197到0.9201调整了4个点。只有Take水平保持不变,从9个点增加到11个点。
我想这是足够的例子。它们已经相当难以理解。可以得出什么结论?
1.该函数将尽力完成其任务,即它将尝试设置一个订单。它将根据不断变化的市场调整水平,并试图一次又一次地完成其工作。
2.止损单设置水平的调整会导致止损水平相对于设置价格的点数增加。这是由于止损单的止损位仍在原地,而订单设定位被移离止损位的缘故。买入止损单的水平被上移,卖出止损单的水平被下移。这些对订单设置水平的操作,以订单设置水平的调整值为单位,增加了以点为单位的止损大小。
3.限价单设置水平的调整导致获利水平相对于设置价格的点数增加。这是以下列方式实现的。三角形保持原位,而止损和设置水平在买入限价时向上移动,在卖出限价时向下移动。摄取点的大小通过订单设置水平修正值增加。
警告!我 改变了SetOrder 函数的代码,交换了几行。旧的帖子不能编辑,所以我在这里粘贴更正后的功能。此外,还附上了一个用于在线测试SetOrder函数的脚本。
为了加快ModifyOrder 函数的发布速度,我决定暂时转到position函数上,然后再回到order函数上,用它们完成。
注意!
我把头寸 定义为OP_BUY 和OP_SELL 交易操作。岗位的开设和关闭。
我把交易操作OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT 和OP_SELLSTOP作为订单。下订单和删除订单。如果一个订单被触发,它就成为一个头寸。
ExistPositions()函数。
这个功能是为了检查是否有买入或卖出的敞口头寸。类似于ExistOrders 函数。默认情况下,它检查所有位置:当前和其他位置。你可以用过滤器的组合来细化选择--功能参数。
如何使用ExistPositions()函数的例子。
1.检查任何位置的存在
2.检查当前图表符号上任何位置是否存在
3.检查任何文书上是否存在购买行为
4.检查欧元兑美元是否有一个神奇数字123456的交易
5.检查是否存在开仓时间 不早于15分钟的任何职位
该预告片包含一个测试ExistPositions函数的脚本。前四个例子被注释掉了。
对不起,OrderSet_1和OrderSet_2都不能工作!它产生了错误--无法编译!我应该怎么做?
处理日期 和时间 的功能和方法会很方便...
比如说。
- 从当前时间中减去2小时
- 还有X天就到期了...
另外......我不知道这是否相关......:(
统计的功能。比如说。
- 每周一21:00有多少个小时的蜡烛图?
- 其中。215个看涨,245个看跌
- 看涨的烛台:最小。12点,最大54点
- 等...
或
- 当天第一根15H蜡烛的低点比第二根高/低X倍。
重要的不是函数本身,而是如何创建它们,实现自己的函数更容易。
在学习如何编程的同时...
我又一次抱怨了:)))有时候很多事情不是很清楚,关于C的书可能会有帮助。
你当然可以阅读它们,但你真的需要用不必要的信息填满你的脑袋,只关注µl4吗?
比如说这个:||||。
处理日期 和时间 的功能和方法将派上用场...
比如说。
- 从当前时间中减去2小时
- 离期满还有X天...
...
你不需要写这样一个函数--有一个非常简单的解决方案
int gHour = 2;
数据时间gTwoHour。
gTwoHourTime = TimeCorrent() - ((86400)/24)* gHour ); // 2小时
gTwoHourTime = TimeCorrent() - 7200; // 相同的,但没有负载计算。
也就是说,我们在一天内有86400次抽查。
所以2小时=7200次,即86400/24*2=7200。
1小时=3600;等等。
职能和处理日期 和时间 的方法将是有用的。
统计的功能。比如说。
- 每周一21:00有多少个烛台
- 其中。215个看涨,245个看跌
- 看涨的烛台:最小。12点,最大54点
- 等...
或
- 当天第一根15H蜡烛的低点比第二根高/低X倍。
重要的不是函数本身,而是如何创建它们,实现自己的函数更容易。
在学习如何编程的同时...
适当地注意到...:-)
,我又要抱怨了:))有时候很多东西不是很清楚,他们说C类书会有帮助。
他们指出,大量的C语言书籍会有帮助。 当然,你可以阅读它们,但你真的需要用不必要的信息填满你的脑袋,只关注μl4吗?
比如说这个:||||。
这是一个逻辑上的OR。让我用例子来解释。MQL4中的 "如果x>2或x<-3,那么x=5 "表达式将有以下形式