KimIV的有用功能 - 页 7

 

好吧,既然没有问题,我们继续......。

ModifyOrder()函数。

函数ModifyOrder 是为了改变一个预选订单的一个或多个价格水平。在这里,挂单被理解为限价 单或止损 单,以及市场买入卖出 单,即一个头寸。使用ModifyOrder 函数,你可以修改仓位的StopLossTakeProfit 两个价格水平,而对于挂单,OpenPrice 的设置价格也可以改变。修改后的价格水平被作为参数传递给ModifyOrder 函数。如果任何一个参数为负数,相应的价格水平将不会被改变。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}
 

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

我决定举出以前被问过很多次的最开始的例子。这是在市场 订单执行 方面的开仓行为市场观察。它是指我们不能同时下达以市场价格开仓的订单,并将挂单附在上面。在Market Watch 上的这种开仓应该分两个阶段进行:首先,我们开一个头寸,然后给它附加一个挂单,即我们设置StopLossTakeProfit 价格水平。

1.买入当前符号的0.1手并设定30点的止损。

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2.卖出当前工具的0.15手,设置SL=45,TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
预告片中包括一个带有实例的工作脚本。
附加的文件:
 
伊戈尔,你是否有一个关闭订单的功能(包括只关闭和CloseBy)?
 
Lukyanov:
伊戈尔,你是否有关闭订单的功能(包括只关闭和关闭)?
Close在那里,CloseBy不在。
 
按字母顺序关闭应该在ModifyOrder之前;-)
 
Lukyanov:
按字母顺序关闭应该在ModifyOrder之前;-)
是的,这是正确的...首先是打开,然后是修改,最后是关闭;-)
 

有道理...;)

你是否认为就 "传输功能 "这一主题做一个小小的、单一的帖子,是厚颜无耻的行为?
到目前为止,对我来说,这是一个黑暗的逻辑-意识形态森林......
(不,不是的......)。

 
kombat писал (а):
你是否认为就 "传输功能 "这一主题进行一点单帖教育是厚颜无耻的?
不,我不会。就我的职能而言,任何问题在任何时候都可以接受。我将尝试回答所有的问题...
 

谢谢你...
当然也不着急......不着急。
市场不会离我们而去......:)))

 
kombat писал (а):
谢谢你...
当然也不着急......不着急。
市场不会离我们而去......:)))
我实际上是在期待你的问题。具体问题,直接指出你在使用我的功能方面需要澄清的问题。