iCustom的详细解释 - 页 4

 
honest_knave: 我从来不知道这叫骆驼案。谢谢!
看来版主删除了我之前的帖子,因为它有一个WikiPedia 的链接,所以只要在WikiPedia(或谷歌)上搜索一下关于 "骆驼案 "的一些历史和细节。
 
Fernando Carreiro:
看起来版主删除了我之前的帖子,因为它有一个WikiPedia 的链接,所以只要在WikiPedia(或谷歌)上搜索一下关于 "骆驼案 "的一些历史和细节。
你的帖子被删除了,因为它是重复的。同样的链接已经张贴出来了。
 
延续#23,并将其封装在一个函数中#26,我现在展示了一个能在MT4和MT5上运行的结构。(为了方便后期编译,我修改了变量名中无效的点(#29),并将ints 改为标准枚举。)
未编译,未测试。
struct SFX{                            // SFX indicator at #1
   #define  SFX_NAME_PATH   "SFX"       // Indicator filename without extension,
                                       // including blanks if any.
   enum SFXbuffer{SFX_STD, SFX_STDMA};
   string                  PairName;
   ENUM_TIMEFRAMES         tf;
   int                     StdDev_MA_Period;
   int                     StdDev_MA_Shift;
   ENUM_MA_METHOD          StdDev_MA_Method;
   ENUM_APPLIED_PRICE      StdDev_MA_Price;
   int                     MA_Fast_Period;
   ENUM_MA_METHOD          MA_Fast_Method;
   int                     MA_Fast_Shift;
   #define  CheckOncePerBar true;
   void SFX()      : PairName(_Symbol),            tf(PERIOD_CURRENT),
                     StdDev_MA_Period(12),         StdDev_MA_Shift(0),
                     StdDev_MA_Method(MODE_SMA),   StdDev_MA_Price(PRICE_CLOSE),
                     MA_Fast_Period(3),            MA_Fast_Method(MODE_SMMA),
#ifndef __MQL5__
                     MA_Fast_Shift(0){}
   double get(SFXbuffer buf, int iBar = 0){
      return iCustom(PairName, tf, SFX_NAME_PATH,
                     StdDev_MA_Period,             StdDev_MA_Shift,
                     StdDev_MA_Method,             StdDev_MA_Price,
                     MA_Fast_Period,               MA_Fast_Method,
                     MA_Fast_Shift,                CheckOncePerBar,
                     buf, iBar);
   }  // get
#else // MQL5
                     MA_Fast_Shift(0),             Handle(INVALID_HANDLE){}
   void ~SFX(){   if(Handle != INVALID_HANDLE) IndicatorRelease(Handle);   }
   double get(SFXbuffer buf, int iBar = 0){
      if(Handle == INVALID_HANDLE){
         Handle = iCustom(PairName, tf, SFX_NAME_PATH,
                     StdDev_MA_Period,             StdDev_MA_Shift,
                     StdDev_MA_Method,             StdDev_MA_Price,
                     MA_Fast_Period,               MA_Fast_Method,
                     MA_Fast_Shift,                CheckOncePerBar);
         if(Handle == INVALID_HANDLE){
            PrintFormat("%s: iCustom(%s) Failed: %i",
                        __FUNCTION__, SFX_NAME_PATH, _LastError);
            return 0;
         }
      }
      double  value[1]; CopyBuffer(Handle, buf, iBar, 1, value);
      return  value[0];
   }  // get
 Private:
   int                  Handle;     // MT5 only
#endif   // __MQL5__
}; // SFX
///////////////////////////////////////////////////////////////////////////////
SFX   SFXindicator;
// SFXindicator.StdDev_MA_Period = ...;   // modification of default parameters.
:
double     STDBuffer = SFXindicator.get(SFX_STD,   0);   // example calls
double     stddevma  = SFXindicator.get(SFX_STDMA, 0);
未编译,未测试。
 

你好,我有一个关于iCustom的快速(我希望是无痛的)问题:假设我有3个指标叫Ind_A、Ind_B和Ind_C,我有一个叫EA的专家顾问。

EA使用icustom调用所有3个指标,传递它们的参数,并通过索引它们的反应缓冲区获得结果。

我在欧元兑美元图表 上附加了3个指标,并运行我的EA;让我们关注指标Ind_A,他作为指标运行,但同时被EA执行:实例是相同的,还是我们有两个ind_A的实例在运行?(我的意思是,一个实例是自己运行的,另一个实例是在EA内的)。

在这种情况下,每个实例都有自己的缓冲区? 还是指标的所有实例之间共享缓冲区?

谢谢

 

很抱歉再次唤醒这个主题。但我认为我的问题属于这个主题。

我试图从一个自定义指标trend-target中访问2个缓冲区,该指标有一个输入=60,和两个缓冲区Band UP和Band LO

使用

double Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,1,0);



double Value2 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,0,1);double Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,1,0);



Comment("iCustom returned v1= "+Value1+ " and value2= ",Value2);

我为这个iCustom设置参数的方式是否正确? 因为我似乎没有得到Band Up和Band LO的值,与数据观察面板中的缓冲区不一致,请查看附图。只有小数点后的2或3位数字或3e是正确的,但对于外汇报价来说,所有4位数字都必须是正确的,对吗?

我希望MQL5的编码员和有经验的用户能帮助我迅速纠正这个问题?提前感谢

-----------------------------------------------------------------------------------------------------
Apropos what is your indicator has 5 inputs and 4 buffers,

double Value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0);

double Value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,2,0,0);

double Value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,3,0);

double Value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,4);


像上面这样吗?

 
ntk2017: 对不起,再次唤醒这个主题。但是

编辑 您的(原始)帖子,并使用代码按钮(Alt-S)!(对于大量的代码,请附上)。(对于大量的代码,请附上它。)
论坛的一般规则和最佳做法。-一般 - MQL5编程论坛
信息编辑

 
ntk2017: 你的指标有5个输入4个缓冲器
double Value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0);
double Value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,2,0,0);
double Value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,3,0);
double Value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,4);

像上面这个?

绝对不是。

iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,BufferIndex,BarIndex);
 
William Roeder:

绝对不是。

我应该像这样使用
double value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0,0); //with BarIndex=0, when only check on close or 1= when check on every tick;
 double value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,1,0,0,0);
double value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,1,0,0);
double value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,1,0);

谢谢你的纠正,我刚刚在mql5中找到了一个例子 "Combined Use of Programs"(https://book.mql4.com/samples/shared),我想codig中的例子就是我需要的。我将研究这部分,如果我的程序有问题,我希望你能帮助我让它运行得更稳定,更有利。

Combined Use of Programs - Simple Programs in MQL4 - MQL4 Tutorial
Combined Use of Programs - Simple Programs in MQL4 - MQL4 Tutorial
  • book.mql4.com
It was said earlier that according to MQL4 rules trade functions cannot be used in custom indicators, that is why for automated trading Expert Advisors or scripts should be used. However, the resource-saving technology used for calculations in indicators (see Creation of Custom Indicators) is widely used when creating trading programs. In most...
 
William Roeder:

当然不是。

我的代码是这样的,现在我可以看到TrendTarget的1、2号缓冲区(但仍然不是所有的4位数都正确!!),我把每根棍子上的BarsIndex值设置为1,因为我喜欢重新检查TrendTarget。

   double shortSma, longSma, ShortSL, ShortTP, LongSL, LongTP,Band_UP,Band_LO;

   double Value1,Value2 ;





   Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,1,1);

   Value2 = iCustom(Symbol(),0,"TrendTarget.ex4",60,2,1);

   Band_UP = Value1;

   Band_LO = Value2;

   Comment(" !!!!!!! ICUSTOM returned Value1= "+Value1+ " and value2= ",Value2+"\n");

但我仍然有问题。我把TrendTarget作为一个过滤器
if(tik <= 5 && Ask>Band_UP) ///////////////ONLY can open SELL////////////////
        {
         ////////////////////// TP1 SL1 ///////////////////////////////////
         openOrder(Symbol(), OP_SELLSTOP,LotSize,sellPrice,sellPrice+SL1*point(), sellPrice-TP1*point(),"_Sell_1",MagicNumber,exp,Crimson);
        }

      if(tik <= 5 && Bid<Band_LO)   ///////////////ONLY can open BUY////////////////

        {
         ////////////////////// TP1 SL1 ///////////////////////////////
         openOrder(Symbol(), OP_BUYSTOP,LotSize,buyPrice,buyPrice-SL1*point(), buyPrice+TP1*point(),"_Buy_1",MagicNumber,exp,Navy);
        }
但在其运行后,我附加了TrendTarget指标,我看到EA仍然在通道之间开了许多交易!!!!!。

在图片中,我在启动后添加了TrendTarget。当我创建一个包含TrendTarget(参数 TF=60)的测试模板时,通道只显示前X条,然后我只能看到价格曲线,这是为什么?
我怎样才能简单地添加趋势目标指标,以便直观地检查订单打开的位置?

,我想在代码中使用过去的value_UP,类似于使用close:昨天之前Close[2],昨天Close[1],当前close[0]?这可能吗?
附加的文件:
 
我对scap测试EA仍有以下问题:

第一个问题:
我可以看到TrendTarget的缓冲区1、2(但仍然不是所有4位数都正确!!),这很重要吗?对于欧元兑美元报价1.0907,我认为当价格值应该与TrendTarget上行通道或下行通道进行比较时,TrendTarget的这些值应该是准确的,至少有4位小数位。
我把每根棍子上的BarsIndex值设置为1,因为我喜欢重新检查TrendTarget

第二个问题:
但我仍然有问题。我把TrendTarget当作过滤器使用。

,但运行后,我把TrendTarget指标附在上面,然后我看到EA仍然在通道之间开了很多交易!!!!!。

第三个问题:
附图 中,我必须在启动后添加TrendTarget。当我创建一个包含TrendTarget(参数TF=60)的测试模板时,TrendTarget通道只显示前X条,可能是100条,然后我只能看到价格曲线,这是为什么?

第4个问题:
我怎样才能简单地添加趋势目标指标,以便在运行时直观地检查订单的开仓情况?

第5个问题:
我想在代码中使用过去的value_UP,类似于使用close:昨天之前Close[2],昨天Close[1],当前close[0]?这可能吗?因为可能会有超过几个柱子的突破,在这种情况下,我想把策略改为突破交易,而不是,只是一个理论,我仍然不知道如何在编码中做到

第六个问题:
当条件被触及时,例如我想只开一个订单,这里因为价格保持在上行通道上方很多柱子,所以条件总是正确的,它开到我的账户耗尽为止如何做到只发送一个订单,然后等待条件改变?

第7个问题:
有谁知道趋势目标是什么,在我看来,它是一条趋势线或价格的MA(x),每边加上+/- 1xATR(14),这是否正确。有谁知道它的代码吗?