KimIV的有用功能 - 页 116

 

SetChannel()函数。

此函数将OBJ_CHANNEL 对象设置为当前图表上的一个等距通道。

  • cl- 对象的颜色。义务性参数。
  • t[]- 时间轴上三个数值的数组。 必备参数
  • p[]- 价格轴上三个数值的数组。必备 参数。
  • nm- 对象名称当传递默认值--"" 时,当前的酒吧开放时间被用作名称
  • ry-BOW 属性的标志。 默认值为False
  • st- 线条风格。有效值是STYLE_SOLID(默认)、STYLE_DASHSTYLE_DOTSTYLE_DASHDOT
  • wd- 线条厚度。默认为1
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2013                                                     |
//|  Описание : Установка объекта OBJ_CHANNEL Равноудаленный канал.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl  - цвет линии                                                        |
//|    t[] - время открытия бара                                               |
//|    p[] - ценовой уровень                                                   |
//|    nm  - наименование              (  ""  - время открытия текущего бара)  |
//|    ry  - луч                       (False - по умолчанию)                  |
//|    st  - стиль линии               (  0   - простая линия)                 |
//|    wd  - ширина линии              (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetChannel(color cl, datetime& t[], double& p[],
                string nm="", bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t[0]<=0) t[0]=Time[20];
  if (p[0]<=0) p[0]=High[20];
  if (t[1]<=0) t[1]=Time[0];
  if (p[1]<=0) p[1]=High[0];
  if (t[2]<=0) t[2]=Time[15];
  if (p[2]<=0) p[2]=Low[15];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_CHANNEL, 0, 0,0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t[0]);
  ObjectSet(nm, OBJPROP_PRICE1, p[0]);
  ObjectSet(nm, OBJPROP_TIME2 , t[1]);
  ObjectSet(nm, OBJPROP_PRICE2, p[1]);
  ObjectSet(nm, OBJPROP_TIME3 , t[2]);
  ObjectSet(nm, OBJPROP_PRICE3, p[2]);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
附上一个测试SetChannel()函数的脚本。
附加的文件:
 

下午好。

我正在使用KimIV https://forum.mql4.com/ru/38949/page6#434255 中的SetTLine()函数。问题是我需要两行(顶部和底部),但这对我来说并不可行。又做了一个带有其他变量的函数SetTLine1(),但还是不能工作。如何做到这一点?

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
datetime d1=TimeCurrent()-24*60*60;
while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
d1=StrToTime(TimeToStr(d1, TIME_DATE));
datetime d2=d1-24*60*60;
while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
d2=StrToTime(TimeToStr(d2, TIME_DATE));
int b2=iBarShift(NULL, 0, d2);     // номер бара начала второго дня
int b1=iBarShift(NULL, 0, d1);     // номер бара начала первого дня
int b0=iBarShift(NULL, 0, d0);     // номер бара начала текущего дня
int n2=iLowest(NULL, 0, MODE_LOW, b2-b1-1, b1);
int n1=iLowest(NULL, 0, MODE_LOW, b1-b0-1, b0);
datetime t1=Time[n2];
double   p1=Low[n2];
datetime t2=Time[n1];
double   p2=Low[n1];
SetTLine(Magenta, "", t1, p1, t2, p2, True, STYLE_SOLID, 3);   


datetime di0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
datetime di1=TimeCurrent()-24*60*60;
while (TimeDayOfWeek(di1)==0 || TimeDayOfWeek(di1)==6) di1-=24*60*60;
di1=StrToTime(TimeToStr(di1, TIME_DATE));
datetime di2=di1-24*60*60;
while (TimeDayOfWeek(di2)==0 || TimeDayOfWeek(di2)==6) di2-=24*60*60;
di2=StrToTime(TimeToStr(di2, TIME_DATE));
int bi2=iBarShift(NULL, 0, di2);     // номер бара начала второго дня
int bi1=iBarShift(NULL, 0, di1);     // номер бара начала первого дня
int bi0=iBarShift(NULL, 0, di0);     // номер бара начала текущего дня
int ni2=iHighest(NULL, 0, MODE_HIGH, bi2-bi1-1, bi1);
int ni1=iHighest(NULL, 0, MODE_HIGH, bi1-bi0-1, bi0);
datetime t1i=Time[ni2];
double   p1i=High[ni2];
datetime t2i=Time[ni1];
double   p2i=High[ni1];
SetTLine1(Magenta, "", t1i, p1i, t2i, p2i, True, STYLE_SOLID, 3);
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}


void SetTLine1(color cli, string nmi="",
              datetime t1i=0, double p1i=0, datetime t2i=0, double p2i=0,
              bool ryi=False, int sti=0, int wdi=1) {
  if (nmi=="") nmi=DoubleToStr(Time[0], 0);
  if (t1i<=0) t1i=Time[10];
  if (p1i<=0) p1i=Low[10];
  if (t2i<=0) t2i=Time[0];
  if (p2i<=0) p2i=Bid;
  if (ObjectFind(nmi)<0) ObjectCreate(nmi, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nmi, OBJPROP_TIME1 , t1i);
  ObjectSet(nmi, OBJPROP_PRICE1, p1i);
  ObjectSet(nmi, OBJPROP_TIME2 , t2i);
  ObjectSet(nmi, OBJPROP_PRICE2, p2i);
  ObjectSet(nmi, OBJPROP_COLOR , cli);
  ObjectSet(nmi, OBJPROP_RAY   , ryi);
  ObjectSet(nmi, OBJPROP_STYLE , sti);
  ObjectSet(nmi, OBJPROP_WIDTH , wdi);
}
 

你不需要做两个函数。你需要用不同的参数来调用一个。你调用了两个函数,但你给这两个函数都传递了一个空的对象名称LINE。默认情况下,SetTLine()函数将当前条形图的打开时间 作为名称。在你的例子中,这将导致无论你调用SetTLine() 多少次,每次都会创建一个同名的对象,也就是一个LINE对象

我已经重新编写了你的代码。见附件。为了说明你的代码所画的内容,举个例子,一张图片

附加的文件:
 
KimIV:

你不需要做两个函数。你需要用不同的参数来调用一个。你调用了两个函数,但你给这两个函数都传递了一个空的对象名称LINE。默认情况下,SetTLine()函数将当前条形图的打开时间作为名称。在你的例子中,这将导致无论你调用SetTLine() 多少次,每次都会创建一个同名的对象,也就是一个LINE对象

我已经重新编写了你的代码。见附件。为了说明你的代码所画的内容,举个例子,一张图片


我明白了,谢谢你。

 

你好!

我想对你的工作说一声大大的感谢。我已经从你们的网站上下载了2个文件(ByMarketBuy(Sell)+e-SARTrailing)来建立我的交易系统。 1个屏幕 上发送欧元/美元对的 ByMarketBuy(Sell) 脚本,为一个订单规定MAGIC 30,为另一个订单规定MAGIC 60(分别为M30和H1),在2和 3个 屏幕上发送e-SARTrailing 顾问分别设置SAR.TF=30和60由于两个订单是在同一货币对上打开的,所以它们会共同旋转,事实证明,如果没有MagicNumber Advisorse-SARTrailing 在两个屏幕上会相互冲突。 我有一个伟大的请求,如果你能修改顾问(写)这样一个功能,因为MagicNumber 可能是这样一个补充将感谢很多而这将在所有的时间框架上 同时发挥作用,无论方向性如何,都不会相互冲突。

事先非常感谢!

 
tim-time:

我有一个伟大的请求,如果你能MagicNumber功能调整你的专家顾问

谢谢你的提示。我为魔术师添加了一个过滤器...
 

GetTimeOpenBar()函数。

该函数返回任意符号和任意时间框架条的打开时间。一般来说,它只是基本函数iBarShift()iTime() 的组合。因此,这里没有什么新东西,使用特定的变体是一个方便的问题。你可以向函数传递以下可选参数

  • sy- 交易工具的名称(符号)。值""NULL 表示当前符号。默认值为""
  • tf- 时间框架。默认值--0--当前的时间框架。
  • dt- 日期和时间。默认值--0--当前时间。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.01.2012                                                     |
//|  Описание : Возвращает время открытия бара.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий)                 |
//|    dt - дата/время                 (    0       - текущее)                 |
//+----------------------------------------------------------------------------+
datetime GetTimeOpenBar(string sy="", int tf=0, int dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf==0) tf=Period();
  if (dt==0) dt=TimeCurrent();
  
  int sh=iBarShift(sy, tf, dt, False);

  return(iTime(sy, tf, sh));
}

 
KimIV:
谢谢你的提示。我为魔术师添加了一个过滤器...

HELLO!

( 我自己做,或者我说不!)

对专业人员的极大尊重!(专业人员必须知道所有最小的细节+在其领域的努力工作,当然还有多年来 积累的经验)。

我从事内置家具已经有45年了,15年完成了外汇交易(努力工作+交易中成功和不成功的经验,还需要学习最小的细节)。

我的目标是成为一名专业的交易人员。

我感谢你的帮助!

带着敬意!

 

我把ErrorRU() 函数放在一起,它通过代码返回一个错误的简短或详细的俄语 描述。交易服务器返回的错误和MQL-程序执行的错误都会被检测出来。然而,并非所有的错误都有详细的描述和 "怎么办 "的建议,但事实就是如此。

我正在发布脚本中的函数,以测试它。

如果有人需要MQH-文件形式的变体,你可以从我的网站上 得到它。

附加的文件:
 

你好!

是否可以在你的e-SignalOfTrade EA中加入PUSH通知

https://www.mql5.com/ru/forum/6960

https://www.mql5.com/ru/docs/common/sendnotification

(租用的VPS 服务器拒绝提供数据SMTP-服务器,这应该在MT4邮件设置中为顾问的工作指定UseSendMail=True-电子邮件。)

预先感谢!