对MT5的祝愿 - 页 58

 
Urain:

不再有意义,除了作为一个方便的问题。

int scale =(int)ChartGetInteger(chart_id,CHART_SCALE);
int pointer_per_bar=pow(2,scale);// количество пикселей на бар
// остальное можно высчитать из первого видимого бара, и ширины графика в пикселях.

О!谢谢你,尼古拉!你能把它完成到最后吗?我的意思是,对4个具体功能的实施。

int  ChartGetX(datetime T);

int  ChartGetY(double P);

datetime ChartGetTime(int X);

double ChartGetPrice(int Y);

看来你已经把难题解决了,而我还要摆弄很久。如果你能做到这一点,我将非常感激。

 

Renat:

在一个符号上交易几个专家顾问是无稽之谈。

这并不比在一个图表上放置几个指标的可能性更有妄想性。

在MT4中,只要点击一下,就能从EA中创建任何复杂的结构,从它们中创建任何投资组合,这种能力的存在是非常伟大的。

要想在五种情况下拥有这一功能,请制作一个交易类,支持将交易账户虚拟划分为子账户

或者在终端创建一个机会,在现有的基础上增加自己的虚拟符号。

 

也许我落后于MT5的新功能,但我希望能够按X和Y坐标显示图表,而不是按条形和价格显示,如果这种可能性已经存在,请告知,如果没有,我认为使用OBJ_CHART 图形对象 与某种符号/工具XY_Symbol很容易实现。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов - Документация по MQL5
 
MetaDriver:

О!谢谢你,尼古拉!你能完成到最后吗?我指的是4个具体功能的实施。

看来你已经把难题解决了,而我还要摆弄很久。如果你能做到这一点,我将非常感激。

像这样的地方。如果你需要一个不同的角度,这可以从窗口的像素尺寸重新计算出来。

//+------------------------------------------------------------------+
//| Преобразование координат. Верхний левый угол привязки            |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| time to X                                                        |
//+------------------------------------------------------------------+
int WindowGetX(long chart_id,datetime T)
  {
   datetime temp[]; int bar=(int)ChartGetInteger(chart_id,CHART_FIRST_VISIBLE_BAR);
   CopyTime(ChartSymbol(chart_id),ChartPeriod(chart_id),bar,1,temp);
   return((int)NormalizeDouble(
          ((T-temp[0])/(double)PeriodSeconds(ChartPeriod(chart_id)))*
          pow(2,ChartGetInteger(chart_id,CHART_SCALE)),0));
  };
//+------------------------------------------------------------------+
//| price to Y                                                       |
//+------------------------------------------------------------------+
int WindowGetY(long chart_id,double P)
  {
   return((int)((ChartGetDouble(chart_id,CHART_PRICE_MAX)-P)*
          (ChartGetInteger(chart_id,CHART_HEIGHT_IN_PIXELS)/
          (ChartGetDouble(chart_id,CHART_PRICE_MAX)-ChartGetDouble(chart_id,CHART_PRICE_MIN)))));
  };
//+------------------------------------------------------------------+
//| X to time                                                        |
//+------------------------------------------------------------------+
datetime WindowGetTime(long chart_id,int X)
  {
   datetime temp[]; int bar=(int)ChartGetInteger(chart_id,CHART_FIRST_VISIBLE_BAR);
   CopyTime(ChartSymbol(chart_id),ChartPeriod(chart_id),bar,1,temp);
   return((datetime)(temp[0]+
          (X/(double)pow(2,ChartGetInteger(chart_id,CHART_SCALE)))*
          PeriodSeconds(ChartPeriod(chart_id))));
  };
//+------------------------------------------------------------------+
//| Y to price                                                       |
//+------------------------------------------------------------------+
double WindowGetPrice(long chart_id,int Y)
  {
   return(ChartGetDouble(chart_id,CHART_PRICE_MAX)-Y/
          (ChartGetInteger(chart_id,CHART_HEIGHT_IN_PIXELS)/
          ChartGetDouble(chart_id,CHART_PRICE_MAX)-ChartGetDouble(chart_id,CHART_PRICE_MIN)));
  };

呼叫实例。

void OnStart()
  {
   datetime T=StringToTime("2011.02.25 18:12");
   double P=1.37831;
   Object(ChartID(),T,P);
  }
//+------------------------------------------------------------------+
void Object(long chart_id,datetime T,double P)
  {
   int x=WindowGetX(chart_id,T);
   int y=WindowGetY(chart_id,P);
   string name="Button";
   if(ObjectCreate(chart_id,name,OBJ_BUTTON,0,0,0,0,0))
     {//---
      ObjectSetInteger(chart_id,name,OBJPROP_BACK,1);
      ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(chart_id,name,OBJPROP_STATE,false);
      //--- привяжем кнопку к правому верхнему углу графика
      ObjectSetInteger(chart_id,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      //--- теперь настроим свойства объекта      
      ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,40);
      ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,40);
      ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,Silver);
      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x);
      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y);
     }
  }
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Угол привязки
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Угол привязки
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Угол привязки - Документация по MQL5
 
虽然同样,最好是把这些功能作为标准配置。那么所有的语言使用者都会知道他们,而不仅仅是那些阅读这个主题的人。
 
纠正了代码帖,描述为独立的函数(没有类),并改变了绑定角度
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Угол привязки
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Угол привязки
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Угол привязки - Документация по MQL5
 
Urain:
不过,还是那句话,最好把这些功能作为标准配置。那么所有的语言使用者都会知道他们,而不仅仅是那些阅读这个主题的人。

谢谢你!
 
MetaDriver:
谢谢你!
把检查放进去,因为有时没有数据,你会得到一个除以0的结果
 

我希望看到一个标准的函数实现 ,在给定的时间内搜索一个酒吧的号码。

现在我正在用CArrayLong 实现它。但在这种情况下,我必须加载大量已经存在于图表本身的数据。这意味着它本质上是复制了内存。我认为它在标准的形式下会工作得更快。

 
Urain:
把检查放进去,因为有时没有数据,你会得到一个除以0的结果。
好的。