KimIV的有用功能 - 页 4

 

更多关于如何使用SetOrder()函数的例子。

为了清楚起见,我们应该选择一个具有较大的最低允许止损/止盈水平的符号,单位为点。我选择了AUDCAD,在我选择的经纪公司里,这个水平的测试是10点。

1.设置一个买入限价订单,手数为0.1,比当前价格低5点。我特意选择了比最低允许水平更低的订单设置水平,以获得错误130(不正确的止损),并展示SetOrder函数将如何解决它。

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-5*Point);

协议的内容(从下到上阅读)。
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点。

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+6*Point, Ask+(6-9)*Point);

议定书的内容(从下往上读)。
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点。

SetOrder(NULL, OP_SELLLIMIT, 0.5, Bid+8*Point, Bid+(8-9)*Point, Bid-(8+7)*Point);

议定书的内容。
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_BUYOP_SELL 交易操作。岗位的开设和关闭。
我把交易操作OP_BUYLIMITOP_BUYSTOPOP_SELLLIMITOP_SELLSTOP作为订单。下订单和删除订单。如果一个订单被触发,它就成为一个头寸。

ExistPositions()函数。

这个功能是为了检查是否有买入或卖出的敞口头寸。类似于ExistOrders 函数。默认情况下,它检查所有位置:当前和其他位置。你可以用过滤器的组合来细化选择--功能参数。

  • sy- 对文书的名称施加限制。默认参数是"" - 不受限制,即任何乐器。如果你通过NULL,位置选择将被限制在当前仪器上。
  • op- 对头寸类型(买入/卖出)进行限制。默认情况下,没有任何约束,也就是说,任何位置类型都可以检查。这个参数的有效值是-1,OP_BUY和OP_SELL。
  • mn- 对职位的识别("魔法")号码施加限制。默认情况下,没有任何约束,也就是说,具有任何神奇数字的位置都被检查。
  • ot- 对职位开放时间进行限制。如果该位置的开启时间晚于该参数的值,则进行检查。默认情况下没有约束,也就是说,有任何开放时间的位置都被选中。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, 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);
}
 

如何使用ExistPositions()函数的例子。

1.检查任何位置的存在

ExistPositions();

2.检查当前图表符号上任何位置是否存在

ExistPositions(NULL);

3.检查任何文书上是否存在购买行为

ExistPositions("", OP_BUY);

4.检查欧元兑美元是否有一个神奇数字123456的交易

ExistPositions("EURUSD", OP_SELL, 123456);

5.检查是否存在开仓时间 不早于15分钟的任何职位

ExistPositions("", -1, -1, TimeCurrent()-15*60);

该预告片包含一个测试ExistPositions函数的脚本。前四个例子被注释掉了。

附加的文件:
 
对不起,OrderSet_1和OrderSet_2都不能工作!它产生了错误--无法编译!我应该怎么做?
 
SoloEgoist:
对不起,OrderSet_1和OrderSet_2都不能工作!它产生了错误--无法编译!我应该怎么做?
OrderSet_1或OrderSet_2文件是不同版本的OrderSet 函数的源代码。只有源代码,仅此而已。它们不会编译或正确执行(没有错误)。为了至少得到一些结果,你还必须创建一个使用OrderSet 函数的工作环境。我已经在test_SetOrder 中创建了一个这样的工作环境的例子。
 
谢谢你,我明白了--我会努力的,只是我不太懂这些语言。
 

处理日期时间 的功能和方法会很方便...

比如说。
- 从当前时间中减去2小时
- 还有X天就到期了...

另外......我不知道这是否相关......:(

统计的功能。比如说。
- 每周一21:00有多少个小时的蜡烛图?
- 其中。215个看涨,245个看跌
- 看涨的烛台:最小。12点,最大54点
- 等...


- 当天第一根15H蜡烛的低点比第二根高/低X倍。

重要的不是函数本身,而是如何创建它们,实现自己的函数更容易。
在学习如何编程的同时...
我又一次抱怨了:)))有时候很多事情不是很清楚,关于C的书可能会有帮助。
你当然可以阅读它们,但你真的需要用不必要的信息填满你的脑袋,只关注µl4吗?
比如说这个:||||。

 
kombat:

处理日期时间 的功能和方法将派上用场...

比如说。
- 从当前时间中减去2小时
- 离期满还有X天...

...


你不需要写这样一个函数--有一个非常简单的解决方案


int gHour = 2;
数据时间gTwoHour。


gTwoHourTime = TimeCorrent() - ((86400)/24)* gHour ); // 2小时
gTwoHourTime = TimeCorrent() - 7200; // 相同的,但没有负载计算。

也就是说,我们在一天内有86400次抽查。

所以2小时=7200次,即86400/24*2=7200。
1小时=3600;等等。
 
kombat:

职能和处理日期时间 的方法将是有用的。

统计的功能。比如说。
- 每周一21:00有多少个烛台
- 其中。215个看涨,245个看跌
- 看涨的烛台:最小。12点,最大54点
- 等...


- 当天第一根15H蜡烛的低点比第二根高/低X倍。

重要的不是函数本身,而是如何创建它们,实现自己的函数更容易。
在学习如何编程的同时...

适当地注意到...:-)

kombat 写道(a):
,我又要抱怨了:))有时候很多东西不是很清楚,他们说C类书会有帮助。
他们指出,大量的C语言书籍会有帮助。 当然,你可以阅读它们,但你真的需要用不必要的信息填满你的脑袋,只关注μl4吗?
比如说这个:||||。

这是一个逻辑上的OR。让我用例子来解释。MQL4中的 "如果x>2或x<-3,那么x=5 "表达式将有以下形式

if (х>2 || х<-3) х=5;