文章 "创建一个在若干工具上交易的 EA 交易程序" - 页 4

 
Interesting:

如果我理解正确的话,一个缓冲区就足够了(只需正确计算并绘制在图表上)。

PS

对于当前的变体,我的印象是诱导器显示的是 "左 "数据(历史的开端),而不是 "右 "数据(当前)....。

或者说我完全不理解这个指标的逻辑....。


如果您输出欧元兑美元(EURUSD)到欧元兑美元(EURUSD)或欧元兑日元(EURJPY)到欧元兑日元(EURJPY),则一切正常。

因此,输出方向似乎是正确的。

我在这里尝试了很多变体,甚至像这样:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,Counted_bars,Buf_0);

还是什么也显示不出来。

是否有人有在一个屏幕上显示两个不同工具的示例?

 
gisip:

我做错了什么?为什么我不能正常显示另一个工具的图表?

在 MQL4 中一切正常,而在这里只有在同一工具上显示时才能正常,而且不会出错。


它在裁剪形式下工作。添加检查和经济。

#property indicator_separate_window    // 指示器在单独窗口中绘制
#property indicator_buffers 1

#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName="EURJPY";

//-- 指标数组
double ScreenBuffer[];

//-- 动态缓冲区 --
double ArrayBuffer[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // 特殊的 init() 函数
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ArrayBuffer,true);
   ArraySetAsSeries(ScreenBuffer,true);
   return 0;                          // 退出
  }
//--------------------------------------------------------------------
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int Counted_bars;   // 运行的条数 
   int copied;

//--------------------------------------------------------------------
   copied=(int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   copied=CopyClose(InstrumentName,PERIOD_M1,0,copied,ArrayBuffer);//-- 将数据写入内存缓冲区 --

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }

//--------------------------------------------------------------------
   return(rates_total);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,0,-1);             // 图表中的所有对象都会被删除。
  }
[删除]  
gisip:

如果输出欧元兑美元(EURUSD)至欧元兑美元(EURUSD)或欧元兑日元(EURJPY)至欧元兑日元(EURJPY),则一切正常。

所以输出方向是正确的。

我在这里尝试了很多变体,甚至像这样:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,0,Counted_bars,Buf_0);

还是什么也显示不出来。

是否有人有在一个屏幕上显示两个不同工具的示例?

您有 MQL4 的源代码吗?


我已经提出了一个替代方案,即为当前工具创建一个索引,并对其进行 100% 的调试。之后,您可以在 Expert Advisor 或其他指标中使用必要的参数轻松调用它。

采用这种方法时,您需要更改指标的基本逻辑,因为传给计算器的参数对于其他工具来说并不完全正确(条数 和其他事项可能不匹配)....。

总的来说,这个概念不是很 "正确"(说得轻一点)。


PS

简而言之,这里有两种选择:

1.使用 iCustom();

2.重写诱导器的逻辑,使其在计算器中接收参数中指定的仪器上的所有数据(代价高昂且不太正确的方法)。

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
gisip:
改了,还是不行,图表不真实。

在指标中这样做

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit() // 特殊 init() 函数
  {
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ScreenBuffer,true);
   
   return 0;                          // 退出
  }

并阅读 "数组和时间序列中的索引方向"部分

[删除]  
DC2008:

裁剪后的表格有效。增加检查和经济性。

这里不需要这两样东西。

//1

//-- 动态缓冲区 --
double ArrayBuffer[];
...............
ArraySetAsSeries(ArrayBuffer,true);

//2

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }
 
Interesting:

这两样东西是你不需要的。

事实上,是的
 

是的,我觉得成功了!

非常感谢大家

我会进一步测试的。

 

需要可视化交易。Expert Advisor 支持多种货币。比方说,它挂在欧元兑美元上,在其他货币对上打开交易。结果有差异,我知道这是我的错,但我无法检查(当 Expert Advisor 挂在 EURUSD 上时,我无法打开 带有 AUDUSD 交易的图表)。

如果 Expert Advisor 挂在澳元兑美元上,我打开后会看到它按照我的程序运行,但如果挂在欧元兑美元上,结果就不同了,我不明白为什么。可视化交易将非常有帮助。

Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
Операции с графиками / ChartOpen - Документация по MQL5
 

7.测试 Exp_TEMA.mq5 时,Told[] Tnew[1]expression 得到以下值:
Told[] Expression could not be evaluated
Tnew[1] Invalid array range.
这些值是什么意思,对 Expert Advisor 的工作结果有什么影响?

8.在测试过程中,Exp_TEMA.mq5 为什么会在一栏内打开交易?

9.如果我们不平仓,而是反向开仓,即以双倍交易量反向开仓,是否会减少代码、减少交易执行时间、减少滑点、减少成本(佣金等)?

栏内交易。

[删除]  
ias:

7.Exp_TEMA.mq5 测试时,表达式 Told[] Tnew[1]得到以下值:
Told[] Expression couldn't be evaluated
Tnew[1] Invalid array range.
这些值是什么意思,对 Expert Advisor 的工作有什么影响?

至于Tnew[1] 数组范围无效,似乎是范围超限。不要忘记数组项 的编号是从 0 开始的!