新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1533

 
Алексей КоКоКо:

你能告诉我如何理解一般的文件吗?我真的很担心,即使是像文本这样简单的图形对象的例子,他们在你面前抛出一个带有一堆代码的样本,但没有任何地方写出哪些参数是必须的,哪些不是。 因此,为了写一些文本或设置一个趋势,甚至理解一个指标的缓冲区,你不明白应该输入哪些最低参数,你不得不复制和粘贴你的代码。

你好,文本的必要参数是窗口索引、坐标参考和文本本身,其他的是可选的。

你需要记住,有两种类型的对象,OBJ_LABEL和OBJ_TEXT。 第一个对象与窗口像素绑定,第二个对象与图表上的时间和价格绑定。

比方说,我们需要一个链接到像素的文本标签,那么就这样做。

   ObjectCreate(0,name,OBJ_LABEL,0,0,0); // создаём объект в текущем (нулевом окне)
   ObjectSetString(0,name,OBJPROP_TEXT,text); // указываем какой текст должен в нём отображаться
   ObjectSetString(0,name,OBJPROP_FONT,fontname); // назначаем шрифт например Verdana или Tahoma
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontsize); // назначаем размер шрифта
   ObjectSetInteger(0,name,OBJPROP_COLOR, text_color); // назначаем цвет шрифта
   ObjectSetInteger(0,name,OBJPROP_CORNER,text_corner); // указываем от какого угла окна отсчитывать пиксели
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,text_anchor); // указываем как должен быть выровнен текст по центру или какому-то краю
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,XOFFSET); // указываем координату по горизонтали
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,YOFFSET); // указываем координату по вертикали
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false); // указываем можно ли выделять и двигать метку мышкой или нельзя

这几乎是绘制文本标签的最小代码。

OBJ_TEXT对象也是如此,但你还需要指定价格和时间属性。

   ObjectSetDouble(0,name,OBJPROP_PRICE,0,price);
   ObjectSetInteger(0,name,OBJPROP_TIME,0,time);



text_corner应该是其中一个常量值。

身份证

描述

左上角_上角

图表左上角的坐标中心

左下角

图表左下角的坐标中心

右下角

图表右下角的坐标中心

右上角

图表右上角的坐标中心


更多详情请见:https://www.mql5.com/ru/docs/constants/objectconstants/enum_basecorner#enum_base_corner




text_corner应该是其中一个常量值。

识别器

描述

锚定左上角

锚点在左上角

锚杆_LEFT

锚点在中间的左边

锚定左下角

锚点在左下角

锚杆_低位

中心以下的锚点

锚定右下角

锚点在右下角

锚杆_RIGHT

锚点在中央的右边

锚点_右上角

锚点在右上角

锚杆_上端

锚点在上部中心

锚点中心

锚点正好在物体的中心位置


更多详情请见:https://www.mql5.com/ru/docs/constants/objectconstants/enum_basecorner



你也可以连接标准库#include <ChartObjects\ChartObject.mqh>并使用它的类,但在我看来这只会让你的生活更加复杂。

 
transcendreamer:

问候语,文本的强制性参数是窗口索引、坐标绑定和文本本身,其他参数是可选的。

请记住,有两种类型的对象:OBJ_LABEL和OBJ_TEXT。 第一个对象与窗口像素绑定,第二个对象与图表上的时间和价格绑定。

比方说,我们需要一个链接到像素的文本标签,那么就这样做。

这几乎是绘制文本标签的最小代码。

OBJ_TEXT对象也是如此,但你只需要设置价格和时间属性。


上帝保佑你 )不只是文字,还有很多东西,甚至是指示器缓冲器。车里的东西被移走了?)

 
Алексей КоКоКо:

上帝保佑你 )不只是文字,还有很多东西,甚至是指示器的缓冲器。为什么你被从手推车上删除了?)

我像往常一样从手推车中删除,因为我很偏执,作弊者没有发现我😀。

 
Artyom Trishkin:

而正确的选择是,嗯,非常简单......。

那它是什么呢?你为什么不把它写下来?

 
大家好,我在一个EA中插入了 "starhour和stophour",以便在某个时间开仓,但我没有考虑到,例如在22:00开仓的订单不会在stophour(23:00)关闭。
我没有指标信号,在23:00之前和之后,禁止 做出任何决定。

请告知如何使EA能够在停止时间(23:00)后关闭已开仓位。
或者干脆在23:00关闭所有头寸,这样就不会让他们整晚都在这里。


预先感谢
 
Eugen8519:
大家好,我在一个EA中插入了 "starhour和stophour",以便在某个时间打开订单,但我没有考虑到,例如在22:00打开的订单不会在stophour(23:00)关闭。
因为之前没有平仓 的信号指标,23点后甚至禁止做任何决定。

请告知如何使EA能够在停止时间(23:00)后关闭已开仓位。
或者干脆在23:00关闭所有头寸,这样就不会让他们整晚都在这里。


预先感谢

只在未平仓订单上设置 "星时和停时"。

 
MakarFX:

只在开仓指令中设置 "星时和停时"。

这就是问题所在--它只打开和关闭starthour->stophour订单
而未平仓的订单在停盘后不会被平仓。

你不可以在停止时间后进行交易



全局参数的设置

bool           UseTimeLimit = true;
int            startHour    = 15;
int            stopHour     = 23;
bool           YesStop=false;
input          ENUM_TIMEFRAMES Timeframe = PERIOD_CURRENT;



而在OnTick

if(UseTimeLimit)
  {
    YesStop=true;
    MqlDateTime str1;
    TimeToStruct(TimeCurrent() , str1);
    if(str1.hour > startHour && str1.hour < stopHour)
       YesStop=false;
       if (YesStop)
       return;
  }
 
Eugen8519:
这就是问题所在,它只打开和关闭了starthour->stophour订单
而未平仓的订单在停盘后不会平仓。
显示关闭订单功能
 
Eugen8519:
这就是问题所在,它只打开和关闭了starthour->stophour订单
而未平仓的订单在停盘后不会平仓。

类似这样的事情

if(UseTimeLimit)
  {
    YesStop=true;
    MqlDateTime str1;
    TimeToStruct(TimeCurrent() , str1);
    if(str1.hour > startHour && str1.hour < stopHour)
       YesStop=false;
       if (YesStop)
       return;
  }
....
if(YesStop==false)
  {
   условие для открытия ордеров
  }
 
MakarFX:

类似这样的事情

这就是订单的结束方式



(EMA0[m_bar_current]<WMA0[m_bar_current] && EMA0[m_bar_current+1]>WMA0[m_bar_current+1]) //Buy
     {
      if(!RefreshRates())
         return;
      TimeBar=time_0;
      CLOSEORDER("Sell");
     }
//if(color_buffer[m_bar_current+1]<color_buffer[m_bar_current]) //Sell
   if(EMA0[m_bar_current]>WMA0[m_bar_current] && EMA0[m_bar_current+1]<WMA0[m_bar_current+1]) //Sell
     {
      if(!RefreshRates())
         return;
      TimeBar=time_0;
      CLOSEORDER("Buy");
     }


void CLOSEORDER(string ord)
  {
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY && ord=="Buy")
               m_trade.PositionClose(m_position.Ticket());  // Close Buy
            if(m_position.PositionType()==POSITION_TYPE_SELL && ord=="Sell")
               m_trade.PositionClose(m_position.Ticket()); // Close Sell
           }
  }
原因: