KimIV的有用功能 - 页 118

 
borilunad:
这个和那个,很多不必要的对其他函数的调用,导致了错误!

嗯,你已经犯了错误...

它简单明了:你可以根据你的需要编辑它。

 
KimIV:


你能不能画一些类似于这个 的东西...

更新...

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

做了,不知道是否正确。

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    op - торговая операция               (    -1      - любая операция)     |
//|    mn - MagicNumber                     (    -1      - любой магик)        |
//|    price - заданная цена                (    -1 - текущая цена рынка       |  
//|    ds - расстояние в пунктах от цены    (  1000000   - по умолчанию)       |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarkets(string sy="", int op=-1, int mn=-1, double price = -1, int ds=1000000) {
  int i, k=OrdersTotal(), ot;

  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.00001; else p=0.001;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (OrderSymbol()==sy) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (op==OP_BUY && (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP)) {
            if ((price<0 && MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) ||
                (price>0 && MathAbs(price-OrderOpenPrice())<ds*p)) 
               {
                return(True);
               }
          }
          if (op==OP_SELL && (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)) {
            if ((price<0 && MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) ||
                (price>0 && MathAbs(OrderOpenPrice()-price)<ds*p)) 
               {
                return(True);
               }
          }
        }
      }
    }
  }
  return(False);
}
 
artmedia70:

嗯,你已经犯了错误...

这很简单明了:根据你的需要进行调整。

谢谢你。是的,我已经用其他招数做了。
 
khorosh:

做了,我不知道这是否正确。

这似乎是正确的...它是普遍的)))。
 

CorrectingPrice()。


在我的一个EA中,我曾经需要大幅减少130个 "无效止损 " 错误的数量。我认为不应该使用小的止损点,而且交易服务器的设置 "STOPLEVEL"对它们的最小值有限制,但我的论点没有说服客户。他说,毕竟,我们可以在向服务器发送交易请求之前以某种方式处理这个错误。我比划了一下,如果没有错误,怎么可能处理。但一个想法进入了我的大脑,它开始工作并诞生了这个功能。

函数CorrectingPrice() 用于在向服务器发送交易请求之前,即在准备初始数据之前,修正订单和头寸的主要价格水平,以满足STOPLEVEL 要求。

该函数的所有参数都是强制性的,没有默认值。此外,最后三个参数是通过引用传递的,也就是说,它们将包含函数的工作结果。该函数接受以下参数。
  • sy- 一个贸易工具的名称。空值""或NULL将意味着当前交易工具(符号)。
  • op- 贸易操作。允许以下值:OP_BUY,OP_SELL,OP_BUYLIMIT,OP_SELLLIMIT,OP_BUYSTOP和OP_SELLSTOP。
  • pp- 头寸/订单的开仓/设定价格。
  • sl- 止损价位。
  • tp- TakeProfit价格水平。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2013                                                     |
//|  Описание : Выполняет корректирование ценовых уровней под STOPLEVEL.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование торгового инструмента                                 |
//|    op - торговая операция                                                  |
//|    pp - цена открытия/установки                                            |
//|    sl - ценовой уровень StopLoss                                           |
//|    tp - ценовой уровень TakeProfit                                         |
//+----------------------------------------------------------------------------+
void CorrectingPrice(string sy, int op, double& pp, double& sl, double& tp) {
  if (sy=="" || sy=="0") sy=Symbol();
  RefreshRates();
  int    di=MarketInfo(sy, MODE_DIGITS);
  int   msl=MarketInfo(sy, MODE_STOPLEVEL);
  int    sp=MarketInfo(sy, MODE_SPREAD);
  double mp=MarketInfo(sy, MODE_POINT);
  double pa=MarketInfo(sy, MODE_ASK);
  double pb=MarketInfo(sy, MODE_BID);
  double ds=NormalizeDouble(pp-sl, di);
  double dp=NormalizeDouble(pp-tp, di);

  if (msl==0) msl=2*sp;
  switch (op) {
    case OP_BUY:
      pp=pa;
      sl=pp-ds;
      tp=NormalizeDouble(pp-dp, di);
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELL:
      pp=pb;
      sl=NormalizeDouble(pp-ds, di);
      tp=pp-dp;
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_BUYLIMIT:
      if (pp>pa-msl*mp) {
        pp=pa-msl*mp;
        sl=pp-ds;
        tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_BUYSTOP:
      if (pp<pa+msl*mp) {
        pp=pa+msl*mp;
        if (sl>0) sl=pp-ds;
        if (tp>0) tp=NormalizeDouble(pp-dp, di);
      }
      if (sl>pp-msl*mp) sl=pp-msl*mp;
      if (tp>0 && tp<pp+msl*mp) tp=pp+msl*mp;
      break;
    case OP_SELLLIMIT:
      if (pp<pb+msl*mp) {
        pp=pb+msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    case OP_SELLSTOP:
      if (pp>pb-msl*mp) {
        pp=pb-msl*mp;
        sl=NormalizeDouble(pp-ds, di);
        tp=pp-dp;
      }
      if (sl>0 && sl<pp+msl*mp) sl=pp+msl*mp;
      if (tp>pp-msl*mp) tp=pp-msl*mp;
      break;
    default:
      Message("CorrectingPrice(): Неизвестная торговая операция!");
      break;
  }
}

 
KimIV:

CorrectingPrice()。


在我的一个EA中,我曾经需要大幅减少130个 "无效止损 " 错误的数量。我认为不应该使用小的止损点,它们的最小值有一个限制,是由交易服务器的设置STOPLEVEL 设置的,但我的论点没有说服客户。他说,毕竟,我们可以在向服务器发送交易请求之前以某种方式处理这个错误。我比划了一下,如果没有错误,怎么可能处理。但一个想法进入了我的大脑,它开始工作并诞生了这个功能。

函数CorrectingPrice() 用于在向服务器发送交易请求之前,即在准备初始数据之前,修正订单和头寸的主要价格水平,以满足STOPLEVEL 要求。

该函数的所有参数都是强制性的,没有默认值。此外,最后三个参数是通过引用传递的,也就是说,它们将包含函数的工作结果。该函数接受以下参数。
  • sy- 一个贸易工具的名称。空值""或NULL将表示当前交易工具(符号)。
  • op- 贸易操作。允许以下值:OP_BUY,OP_SELL,OP_BUYLIMIT,OP_SELLLIMIT,OP_BUYSTOP和OP_SELLSTOP。
  • pp- 头寸/订单的开仓/设定价格。
  • sl- 止损价位。
  • tp- TakeProfit价格水平。

Igor,一些经纪公司使用Spread*2而不是StopLevel,StopLevel的价值为零。简单地回顾了一下代码,我没有注意到对这种情况的检查。最好能纠正代码以检查这种情况,否则会出现同样的130个错误
 
artmedia70:
伊戈尔,一些经纪公司使用Spread*2代替StopLevel,而StopLevel的值为零。粗略地看了一下代码,我没有看到对这种情况的任何检查。如果能调整代码以检查这种情况就好了,否则就会出现同样的130个错误。


Artem,我没有遇到这样的DC......你能在你的私人信息中给我发几个吗?我将阅读交易条例...

还是有一个更简单的方法?你能告诉我,使用这样的修正是否足够正确?

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

更新:我已经纠正了CorrectingPrice() 函数。

 

CorrectTF()函数的一个新版本。

前段时间,有人批评我的CorrectTF() 函数,声称它的功能与它的名字不相符。事实上,它将时间框架调整到最近的最小值,而不是仅仅调整到最近的一个。我计算了标准时间段之间的算术平均值,并根据其描述重写了该函数。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.05.2013                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество минут).                               |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame) {
  if (TimeFrame>     1 && TimeFrame<    3) return(PERIOD_M1);
  if (TimeFrame>=    3 && TimeFrame<   10) return(PERIOD_M5);
  if (TimeFrame>=   10 && TimeFrame<   23) return(PERIOD_M15);
  if (TimeFrame>=   23 && TimeFrame<   45) return(PERIOD_M30);
  if (TimeFrame>=   45 && TimeFrame<  150) return(PERIOD_H1);
  if (TimeFrame>=  150 && TimeFrame<  840) return(PERIOD_H4);
  if (TimeFrame>=  840 && TimeFrame< 5760) return(PERIOD_D1);
  if (TimeFrame>= 5760 && TimeFrame<26640) return(PERIOD_W1);
  if (TimeFrame>=26640                   ) return(PERIOD_MN1);
}
 
KimIV:


Artem,我没有遇到这样的DC......你能在你的私人信息中给我发几个吗?我将阅读交易条例...

辍学

或者你可以做一些更简单的事情。你能告诉我,使用这样的修正是否足够正确?

int   msl=MarketInfo(sy, MODE_STOPLEVEL);
int    sp=MarketInfo(sy, MODE_SPREAD);
if (msl==0) msl=2*sp;

当然,一切是正确的。

更新:我纠正了CorrectingPrice() 函数。

伊戈尔,我在EA中实际上也是这样做的,我总是先读取数据,并将所需的值分配给变量级别,然后用它来检查计算结果。
 
KimIV:


Artyom,我还没有遇到过这样的DC...你能在你的私人信息中给我发几个吗?我将阅读交易条例...

或者你可以用更简单的方法来做。你自己告诉我,使用这样的修正案是否足够正确?

更新:我对CorrectingPrice() 函数做了一个修正。

同事们好,我还在研究代码,我不能很好地理解其中的奥妙,有点为难。

按照我的理解,在下订单之前,我们必须调用这个函数来纠正参数。

有这样一条线来打开一个订单。

如果(buy == true && Open[0]>UpTr && Trade) {

buy=OrderSend(Symbol(),OP_BUYSTOP,LOT(),NormalizeDouble(op,Digits),slipage,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits), "T",Magic,0,MediumBlue)。

这是应该解决的地方吗?以及如何正确地做到这一点。或者这个命令不需要CorrectingPrice()?

预先感谢你。