KimIV的有用功能 - 页 114

 

下午好。

我还是个编程新手,如果有人能给我点提示。

问题。我们有一个或多个未结订单,我们知道它们将以20美元的利润收盘。

我们需要知道订单在什么价格下会以20美元的利润关闭。

我们计算出开放地段的总体积,然后!

请告知如何做到这一点。

也许有一个现成的功能?

提前感谢。

 
KimIV:

使用DistMarketAndPos()的例子。

为什么需要一个函数来确定市场离最近的位置有多远?我看到至少有四个基本选择。

  1. 买过或卖过。市场已经朝着我们的方向发展了。而一旦它通过了一些距离,现有的头寸获得了一些利润,我们立即进行存款--在同一方向再次进入。
  2. 我们购买或出售。市场朝着我们的方向发展。一旦它走过了一定的距离,而现有的头寸也赚取了一定的利润,我们就会立即意识到,就是这样了!"。逆转就在眼前!是时候翻转了。我们关闭目前的头寸,并在相反的方向开仓。
  3. 我们购买或出售。市场已经转向对我们不利。但出于某种原因,我们确信自己是对的,在离最近的进场点有一定距离时,也就是在某种程度的亏损时,我们的平均水平和开盘方向是一致的。
  4. 我们购买或出售。市场已经对我们不利。而且我们已经意识到,我们进入市场的方式不正确。因此,我们固定在某一水平的损失上,并在另一方向打开。

如果你想具体实现这些选项中的任何一个,请在这里写下你的请求。我将在我所列举的框架内满足所有要求。

附上一个实验DistMarketAndPos()函数的模板。


你好,KimIV,功能很好,能用,我翻转它,也能用,但我不能连接两半

     int start()

{

      if (DistMarketAndPos()>150)

{                                     

      OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,Ask+150*Point);

   }     

      return(0);

   }

int DistMarketAndPos(string sy="", int op=OP_BUY, int mn=-1) {

  double d, p;

  int i, k=OrdersTotal(), r=1000000;


  if (sy=="" || sy=="0") sy=Symbol();

  p=MarketInfo(sy, MODE_POINT);

  if (p==0) if (StringFind(sy, "")<0) p=0.00001; else p=0.01;

  for (i=0; i<k; i++) {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {

        if (mn<0 || OrderMagicNumber()==mn) {

          if (OrderType()==OP_BUY) {

            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;

            if (r>d) r=NormalizeDouble(d, 0);

          }

          if (OrderType()==OP_SELL) {

            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;

            if (r>d) r=NormalizeDouble(d, 0);

          }

        }

      }

    }

  }

return (r);

}  


 

请为我翻开它,每个人都说它不对,但它很有效。
 
新来的人,请 专门的主题 中提出你的问题。
 

新版本的Message()函数。


本文 发表以来,Message() 函数已经经历了两次修改。第一个变化是增加了通过Print() 禁止向专家日志输出的可能性,以及只输出一系列类似信息中的第一个信息的可能性。第二个变化是增加了输出方向,即除了现有的Comment()Print() 函数之外,还使用了Alert()SendMail()SendNotification()。我所发表的是后一种变化。

Message() 函数被设计用来在不同方向上输出文本信息。它既可用于调试目的,也可用于现成的应用程序,用于解释当前的交易情况,记录程序运行情况,及时通知交易者重要的变化,等等。该函数接受三个参数,其中最后两个是可选的。
  • ms- 字符串,要输出的文本信息,传送。
  • nv- 一串标志,指定信息输出的方向。五面旗帜是五个重要的地方。每个带零的标志面打开,一个关闭一个特定的输出方向。从左到右依次是警报、评论、打印、SendMail和SendNotification。默认值是 "01100",即评论和打印被启用,其他被禁用。
  • am- 逻辑的,True- 输出所有的信息,False- 从一系列相同的信息中只输出第一条。默认值为"假"。

关于警报和打印输出方向(空格1和3),应该注意的是,它们能够逐行输出信息。也就是说,如果信息文本中有一个换行符--控制字符"\n",那么每一行都将被独立打印。试试附件中的测试脚本,我想你会喜欢的:-)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message(string ms, string nv="01100", bool am=False) {
  static string prevMessage="";
  string as[];
  int    i, k;

  if (StrToInteger(StringSubstr(nv, 1, 1))==1) Comment(ms);
  if ((StringLen(ms)>0) && (am || prevMessage!=ms)) {
    if (StrToInteger(StringSubstr(nv, 0, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Alert(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 2, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Print(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 3, 1))==1) SendMail(WindowExpertName(), ms);
    if (StrToInteger(StringSubstr(nv, 4, 1))==1) SendNotification(ms);
    prevMessage=ms;
  }
}

附上一个测试Message()函数的脚本。

附加的文件:
 
KimIV:

新版本的Message()函数。


本文 发表以来,Message() 函数已经经历了两次修改。第一个变化是增加了通过Print() 禁止向专家日志输出的可能性,以及只输出一系列类似信息中的第一个信息的可能性。第二个变化是增加了输出方向,即除了现有的Comment()Print() 函数之外,还使用了Alert()SendMail()SendNotification()。我所发表的是后一种变化。

Message() 函数被设计用来在不同方向上输出文本信息。它既可用于调试目的,也可用于现成的应用程序,用于解释当前的交易情况,记录程序运行情况,及时通知交易者重要的变化,等等。该函数接受三个参数,其中最后两个是可选的。
  • ms- 字符串,要输出的文本信息,传送。
  • nv- 一串标志,指定信息输出的方向。五面旗帜是五个重要的地方。每个带零的标志面打开,一个关闭一个特定的输出方向。从左到右依次是警报、评论、打印、SendMail和SendNotification。默认值是 "01100",即评论和打印被启用,其他被禁用。
  • am- 逻辑的,True- 输出所有的信息,False- 从一系列相同的信息中只输出第一条。默认值为"假"。

关于警报和打印输出方向(位置1和3),应该注意的是,它们能够逐行输出信息。换句话说,如果信息文本中有一个换行符--控制字符"/n",那么每一行将被独立打印。试试附件中的测试脚本,我想你会喜欢的:-)


附上一个测试Message()函数的脚本。

你是否在你的OpenPosition函数中加入了停止播放检查?
 
sv.:
你是否在你的OpenPosition函数中加入了对停止平移的检查?


不......你指的是什么样的检查?好吧,让我们说,停止和采取的检查失败,该怎么办?有一些选择。

  1. 请勿打开。
  2. 调整停止和撤离。

 
KimIV:


不......你指的是什么样的检查?好吧,让我们说拦截和拍摄没有通过检查,你会怎么做?有一些选择。

  1. 请勿打开。
  2. 调整停止和采取。

你可以在第1项和第2项之间引入一个自定义开关。 按照这个模式。
 int           modeSetOrders = 1;      // Способ установки ордеров:
                                       //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
 

测试脚本中的OpenPosition() 函数的新版本。

有什么新鲜事?

1.当错误130无效止损和NumberOfTry>1变量的值被设置时,该函数将尝试把止损和止盈的价格水平调整到相对于OP_SELL的Bid和OP_BUY的Ask的MODE_STOPLEVEL+MODE_SPREAD的值。

请注意。

NumberOfTry 全局变量 必须大于1 才能触发价格水平的修正。 这是由于第一次尝试开仓会发现错误130并修正价格水平,而第二次及以后的尝试开仓则是修正后的水平

附加的文件:
 
KimIV,很高兴看到你带着新功能回到这里。
 

下午好。

是否有可能用一些简单的函数来补充KimIV的有用函数库,如.NET和.NET。

1.开盘价,通过一些标准位置(符号、类型、手数、神奇数字)选择。这个价格可以存储在全局变量中,并作为一定的价格水平,从中可以建立专家顾问的算法。

返回根据头寸或订单的某些标准(符号、类型、手数、神奇数字)选择的票据。票据是一个重要的标识符,它可以在任何地方使用,甚至作为存在的标志。

这样的简单功能越多,就越容易找到最适合你的功能,而不用担心在修改现有功能时犯错。

谢谢你的职能。