谁想要一个战略?很多,而且是免费的) - 页 58

 
1.我可以重写指标,以便用double代替float。
2.受保护的静态浮点数 fMicron = 0.000075f; // 当我们比较两个浮点数时使用的系数。
3.指示器基础构造器。

/// <summary>
/// The default constructor
/// </summary>
public Indicator()
{
    sIndicatorName  = string. Empty;
    bSeparatedChart = false;
    bIsDescreteValues = false;
    afSpecValue     = new float[] { };
    fMinValue       = float. MaxValue;
    fMaxValue       = float. MinValue;
    bIsCalculated   = false;
    parameters      = new IndicatorParam();
    component       = new IndicatorComp[] { };
}




4.基本价格。



/// <summary>
/// Calculates the base price.
/// </summary>
/// <param name="price">The base price type.</param>
/// <returns>Base price.</returns>
protected static float[] Price( BasePrice price)
{
    float[] afPrice = new float[Bars];

    switch( price)
    {
        case BasePrice.Open:
            afPrice = Open;
            break;
        case BasePrice.High:
            afPrice = High;
            break;
        case BasePrice.Low:
            afPrice = Low;
            break;
        case BasePrice.Close:
            afPrice = Close;
            break;
        case BasePrice. Median:
            for (int iBar = 0; iBar < Bars; iBar++)
                afPrice[ iBar] = (Low[ iBar] + High[ iBar]) / 2;
            break;
        case BasePrice. Typical:
            for (int iBar = 0; iBar < Bars; iBar++)
                afPrice[ iBar] = (Low[ iBar] + High[ iBar] + Close[ iBar]) / 3;
            break;
        case BasePrice. Weighted:
            for (int iBar = 0; iBar < Bars; iBar++)
                afPrice[ iBar] = (Low[ iBar] + High[ iBar] + 2 * Close[ iBar]) / 4;
            break;
        default:
            break;
    }
    return afPrice;
}

6.我已经得到了工作的NET <-> MT桥。通过MT进行FSB交易需要一定的时间。当然,在变得 "坚如磐石 "之前,它将只用于模拟账户

 

因为我认为Aroon指标只使用:bIsDescreteValues = true。


关于RSI,我记得我在想这个公式。这是5-6年前的事了。我想我使用了一本流行的TA书中的这个公式。不记得具体是哪一个了。

 

"使用以前的酒吧价值"

我个人认为,这是FSB最重要的 功能之一。


        /// <summary>
        /// Sets the "Use previous bar value" checkbox
        /// </summary>
        /// <returns>Is any Changes</returns>
        public bool SetUsePrevBarValueCheckBox(int iSlot)
        {
            bool isChanged = false;

            for (int iParam = 0; iParam < Slot[ iSlot]. IndParam. CheckParam. Length; iParam++)
            {
                if ( Slot[ iSlot]. IndParam. CheckParam[ iParam]. Caption == "Use previous bar value")
                {
                    bool bOrigChecked = Slot[ iSlot]. IndParam. CheckParam[ iParam]. Checked;
                    bool bChecked = true;

                    // Entry slot
                    if ( Slot[ iSlot]. SlotType == SlotTypes.Open)
                    {
                        bChecked = true;
                    }

                    // Open filter slot
                    else if ( Slot[ iSlot]. SlotType == SlotTypes. OpenFilter)
                    {
                        bChecked = EntryExecutionTime != TimeExecution. Closing;
                    }

                    // Close slot
                    else if ( Slot[ iSlot]. SlotType == SlotTypes.Close)
                    {
                        bChecked = true;
                    }

                    // Close filter slot
                    else if ( Slot[ iSlot]. SlotType == SlotTypes. CloseFilter)
                    {
                        bChecked = false;
                    }

                    if ( bChecked)
                    {
                        for (int iPar = 0; iPar < Slot[ iSlot]. IndParam. ListParam. Length; iPar++)
                        {
                            if ( Slot[ iSlot]. IndParam. ListParam[ iPar]. Caption == "Base price" &&
                                Slot[ iSlot]. IndParam. ListParam[ iPar]. Text    == "Open")
                            {
                                bChecked = false;
                            }
                        }
                    }

                    if ( bChecked != bOrigChecked)
                    {
                        isChanged = true;
                        Slot[ iSlot]. IndParam. CheckParam[ iParam]. Checked = bChecked;
                    }
                }
            }

            return isChanged;
        }
 

要看到指标值的全部精度,在图表窗口中按F12。


另一个选择是使用 "命令控制台"。 ind xxxx 显示的是bar xxxx的指标。




我不深究MT的公式。可能他们没有太大的区别。这里是默认的FSB RSI和MT RSI。







___________________--

编辑。

我试着在没有这种额外平滑的情况下计算RSI。

            for (int iBar = 1; iBar < Bars; iBar++)
            {
                if ( afBasePrice[ iBar] > afBasePrice[ iBar - 1]) afPos[ iBar] = afBasePrice[ iBar] - afBasePrice[ iBar - 1];
                if ( afBasePrice[ iBar] < afBasePrice[ iBar - 1]) afNeg[ iBar] = afBasePrice[ iBar - 1] - afBasePrice[ iBar];
            }

            float[] afPosMA = MovingAverage( iPeriod, 0, maMethod, afPos);
            float[] afNegMA = MovingAverage( iPeriod, 0, maMethod, afNeg);

            //for (int iBar = iFirstBar; iBar < Bars; iBar++)
            //{
            //    afPosMA[iBar] = (afPosMA[iBar - 1] * (iPeriod - 1) + afPos[iBar]) / iPeriod;
            //    afNegMA[iBar] = (afNegMA[iBar - 1] * (iPeriod - 1) + afNeg[iBar]) / iPeriod;
            //}

            for (int iBar = iFirstBar; iBar < Bars; iBar++)
            {
                if ( afNegMA[ iBar] == 0)
                    afRSI[ iBar] = 100;
                else
                    afRSI[ iBar] = 100 - (100 / (1 + afPosMA[ iBar] / afNegMA[ iBar]));
            }


但在这种情况下,2009.3.24的RSI值跳升至74.800。



----------------------


谢谢Stellarator的好话!

我不会放弃外汇策略生成器,而且只是因为像你这样的人。即使在相反的情况下,我也愿意进行讨论,以便使FSb更加强大和用户友好。

在这个方向上,我想我可以在FSB中添加MT指标。类似于MT兼容模式 的东西 :)

mt_macd, mt_rsi, ...这些将与MT标准的参数相同。


我们必须找到解决酒吧开盘和收盘的入口/出口。它们对FSB->MT的整合至关重要。


 
Stellarator >> :

.........将它们(两个缓冲区)合并成一个(我在想...可能不仅有1/0(可以变成比特掩码),而且还有价格标签)。最有可能的是,我必须对指标值本身做一些处理......我们会看到...当我去...

为什么不能工作(?)。

长期以来,我一直使用一个icustom调用从不同的指标缓冲区获得几个值,在代码中多次使用这个函数太浪费了,特别是在优化过程中,甚至在 "重 "指标中。事实上,我们所需要的(最多)是获得交易方向和SL & TP的水平.....,问题通过简单的算术就可以解决。

下面是一个只有一个额外缓冲区(Signal)的指标代码片段。

// в самом кончике start такой фрагмент

      
   if ( Direction[0] !=0)
      {
      if ( Direction[0] > 0) Signal[0]= Set_TP[0]/Point*1000000 + Set_SL[0]/Point;
      if ( Direction[0] < 0) Signal[0]=-( Set_TP[0]/Point*1000000 + Set_SL[0]/Point);
      }
   return(0);

而这里是专家顾问代码中的反向转换。

int start()
  {
   // Получение значений из буфера индикатора в последней фазе формирования бара
   if (TimeCurrent() > (Time[0]+ CP60)
      {
      Signal=iCustom(NULL, 0, "_iK_tay_v01M1", Discret,6,0)
      }     

   if(Time[0] != prevtime)
      { 
      Calcul();
      //if (Tral !=0) CalcLevel();
      prevtime = Time[0];
      }
   else return;

.........

void Calcul()
  {
   OpenSell=0; OpenBuy=0; CloseBuy=0; CloseSell=0;
   
   if( Signal > 0) 
      {
      OpenBuy=1; CloseSell=1;
      TP=NormalizeDouble ( Signal*Point/1000000, Digits-1);      
      SL=( Signal- TP/Point*1000000)*Point;   
      }
   if( Signal < 0) 
      {
      CloseBuy=1; OpenSell=1;
      TP=NormalizeDouble (MathAbs( Signal)*Point/1000000, Digits-1);      
      SL=(MathAbs( Signal)- TP/Point*1000000)*Point;   
      }   
   return;
  }

因此,我们只需调用一次指标就能得到3个指标值(方向、TP和SL)。获得的结果可以按照你的要求进一步操作 :)

我希望你能理解这个原则。

 

大家早上好!


Miroslav_Popov писал(а) >>

1.我可以重写指标,以便用double代替float。

米罗斯拉夫--这很重要!我已经在我的帖子中给出了一些原因。但我也很清楚所涉及的劳动......。而现在(很可能)你正在为你所寻找的桥梁或实质性的东西而努力。


但必须要找到时间。我的预测是不超过一些小时(一天之内)。因为这不仅仅是在声明变量时用一个替换另一个的问题(这也将至少需要进行视觉检查和视觉纠正,"为了美观"(例如,变量用标签描述,等等):)- 尽管这不是一个原则问题)。

首先,很可能有故意使用浮动 的情况(强迫降低精确度)。你需要在这里看到整个代码。

其次,有一个比较这种("新")数字及其与FSB的映射的问题(关于这一点,见下文第2节)。

更短--我们需要仔细捋顺所有的代码,至少要考虑与实数向双数过渡有关的可能弊端。


Miroslav_Popov 写道(a)>>。

2.受保护的静态浮点数 fMicron = 0.000075f; // 当我们比较两个浮点数时使用的系数。


(及以下)。

要看到指标值的全部精度,在图表窗口中按F12。

而这正是问题之一!为 什么是0.000075?而不是0.00005?还是0.000001?(正如我所做的那样)。

一个扩展的问题(对于那些感兴趣的人)和一个问题。

如你所知,两个实数的平等比较决不应该通过这种结构来完成。

double Value1, Value2;

if (Value1 == Value2) {
  // Some useful code there
}

这是因为在一些计算结果(特别是乘/除法的变化)之后,这些变量的值可能在视觉上相似(例如1.0和1.0),但实际上不相同。(事实上是1.000001和1.000000)。这一属性源于计算机中实数表示的某种离散性,并带有计算的某种(有限的)离散性(准确性)。一般来说,平等的比较是通过经典主题的变奏来完成的(顺便说一下,米罗斯拉夫使用的是这个主题)。

if (Math.Abs(afIndValue[iCurrBar] - afIndValue[iBaseBar]) < fMicron) {
  // Some code there
}

这是两个实数的 "经典 "比较,以某种有限的精度实现相等,在这种情况下,由fMicron定义。


这也是潜在的问题之一。如何、谁、在什么情况下应该决定这个非常fMicron的价值?它是否总是一个好的常数,就像米罗斯拉夫的(哪个值的问题也还在讨论中)?


一般来说,如果不是为了增加好奇心--我赞成以下理论。

1.一般来说,这类变量的比较有两种类型,平等不平等(<,>)。

2.变量本身有两种类型:有保证的固定精度 的变量(价格、手数等),以及没有任何明确精度 的抽象值(如指标值)。

对于不等式,变量(任何类型)都是 "头对头 "的比较(如果(Value1 < Value2) { ...})。如果有必要限制精度(这是很罕见的),你可以使用像Miroslav那样的结构。

if (afIndValue[iBaseBar] < afIndValue[iCurrBar] - fMicron) {
  // Some code there
}

4.然而,对于平等问题,(通常)是以不同的方式处理的,这取决于有关的数据。

4.1 如果我们需要比较两个有固定精度的数字(例如,两个价格值来决定是否修改订单(避免得到 "无结果")),我们通常会这样做(也是 "经典")。

int ComparePriceInt(double Value1, double Value2) {
   Value1 -= Value2;
   Value2 = Point / 2.0;
   if ( Value1 > Value2)
      return(1);
   if ( Value1 < - Value2)
      return(-1);
   return(0);
}

在我们的案例中,这个函数是多余的,但这不是重点。其中的关键结构是 / 2.0 正是这个fMicron给了我们所需的、正确的和足够的计算精度......在这种特殊情况下!当两个价格被比较时(具有相同的数字,因此 ),即在(点=0.0001)的情况下,例如

fMicron = 0.00005

比较1.2345(订单价格)和1.23451(指标值)--我们得到平等,1.2345和1.23456--不平等......猜猜在最后一种情况下,当fMicron=0.000075时会发生什么?;)当然,你可以预先将变量规范化为一个(较低)精度。但这不是我们的方法 :D...

再次强调--这个参数的选择很重要,而且对每一种情况都 "有一点独特":)1


我建议采用以下范 式。

1.固定精度的变量与计算出的fMicron值进行比较(点/2,例如对于价格情况)。

2.指标和其他类似的 "无限精确的小事":)的值与fMicron常数相比较,该常数等于点的最小值,使用的仪器,除以10。即在数字不超过4的仪器中,fMicron=0.00001,如果数字=5,fMicron=0.000001,类似的情况。

Miroslav - 需要专家意见:)?


现在向公众提出一个问题。

在各种数据窗口(MT或FSB(指标图))中的WHY- 指标值总是以固定的精度显示(数字=4)?为什么不是小数点后3位?还是5、6、7......?:)?!不,真的吗?

米罗斯拉夫有一个 "隐藏的功能? ;))- 我是说F12!而在MT中按什么呢?

而一般来说,嗯,谁定义了这个常数?(小数点后4位)。

我的猜测是,它几乎与传入报价的维度(1.2345)直接相关,对大多数工具来说(有人刚填上)。但许多经纪公司传到更大的数值(例如5),这并不是一个秘密。那么,为什么不在维度上显示指标值,与工具报价维度(数字)相吻合?

或者,也许我没有 "理解 "这个主题中的一些原则性的东西(请--谁来解释一下,也许这是 "必要的",因为......)!我不知道。


Miroslav_Popov 写道(a)>>。

3.指示器基础构造器。

4.基本价格。

Miroslav,我已经很好地 理解了源代码页面上的代码:)。 我很明白 受保护的静态 float[] Price( BasePrice price) 有什么作用。 如果这是对我的代码不流畅的暗示--我回答说,我有意拒绝使用额外的缓冲区来存储(在一般情况下--要么是价格缓冲区的副本,要么是计算出来的副本(典型的,等等))。而且节省了空间,在有各种Typicals的地方,总是需要计算!


在这里,我们需要提到FSB和MT在计算指标值的方法上的关键区别

1.首先,至少在目前 - 在FSB中加载的报价是静态的,它已经加载了它们,计算了整个条形范围内所需的指标值,然后只是通过它们 "驱动",模仿交易机器人的行为。再一次,指标值 计算一次,在运行交易机器人的虚拟化之前。这特别说明了交易的仿真速度。但MT中的报价一直都在,而原生的策略测试器却看不到未来,也就是说,我们必须每次都计算出指标值。而如果我只是使用Miroslav的方法(整个缓冲区的计算)...我会被扔到臭鸡蛋里的:)。因此,要特别注意使用IndicatorCounted()!在每种情况下,指标的计算速度几乎是最大的(如果需要计算所有的条形图,或者只计算一条)。在某个地方,有些东西仍然可以被优化,但在你的闲暇时间...

2.因此,每次(当一个新的tick出现时),在额外的缓冲区生成价格值是多余的。反正你都要计算它们,所以让函数(同样的MovingAverage,等等)自己来做。它节省了空间,简化了逻辑(不需要每次都分析哪些条形应该在这些缓冲区中重新计算),并节省了速度(在一般情况下,甚至在某个地方更高)。"在我看来是这样的" (c) 小熊维尼


如果我们要再次讨论我的指标转换,也许重要的是,我完全保留了函数(和指标本身)的逻辑,但为MT的特定使用情况稍作修改。我还保存了用于控制指标本身的参数的顺序和名称。

伙计们,看一下源代码,虽然。我试图做到 "好":)。


我转换的最终想法如下。例如,我们有一个开仓点的位置和三个指标的附加逻辑。下面是下订单的代码是怎样的(当然,大致是这样)。

if ( IsSignal(iCustom(NULL, 0, "fsbIndicator1", SLOT_TYPE_LC, Param2, Param3, ..., 0, 0))
    && IsSignal(iCustom(NULL, 0, "fsbIndicator2", SLOT_TYPE_LC, Param2, Param3, ..., 0, 0))
    && IsSignal(iCustom(NULL, 0, "fsbIndicator3", SLOT_TYPE_LC, Param2, Param3, ..., 0, 0)) )
{    
// Открываем длинную позицию (предпоследний 0 в значениях индикаторов - указатель на буфер логики длинных позиций (1, соотв. - на буфер логики коротких))
    // Если у нас значение POP берется из еще одного индикатора, то это значение берется аналогично, только меняется логика поведения индикатора:
    // iCustom(NULL, 0, "fsbIndicator", SLOT_TYPE_POP, Param2, Param3, ..., 0, 0)
}

类似这样的事情。你向iCustom提供你的参数值,并等待它们全部发出信号。这就是全部。没有对指标值本身进行分析...为了什么?

看起来不错...还是没有 :)?

 

关于这些指标。

关于(Aroon和bIsDescreteValues = true;)考虑到了。


关于RSI...

米罗斯拉夫--你要找的结构让你困惑了:)。不要偷懒,再一次在它周围加上注释,并使用CORRECTLY WORKED 指标来获得 "匹配 "的值:)。让我提醒你--计算RSI的经典公式是基于MA的指数 品种(特别是平滑的)。因此, 在指标参数中指定 这种平滑模式(平滑的)...你会对结果感到 "惊喜 "的 :)(我提醒你,默认情况下,使用的是 "简单"(Simple),这就造成了与经典的不一致)!我自己无法完成上述程序--但我对自己的说法有100%的把握。说服我 :)?

作为测试的结果,我们有以下建议,删除所需的代码,并 在所有使用RSI(和RSI本身)的指标中,将maMethod参数的默认值改为Smoothed。默认情况下,用户不会有这样的问题。但通过这样做,我们将使指标中的这一参数的选择是可行的!(例如,我已经转换了RSI MA振荡器,它基于RSI计算的结果,同时,与RSI本身的当前行为 - 在适当的参数中指定什么并不重要)

 
Miroslav_Popov >> :

"使用以前的酒吧价值"

我个人认为,这是FSB最重要的功能之一。

哦,是的!

这确实是FSB最重要的功能之一。而且,考虑到这一特点,我已经努力适当注意测试指标逻辑的正确性。

谢谢你提供显示 "默认 "值计算的代码!将考虑到这一点...

 
rider >> :

为什么它不能工作(?)

长期以来,我一直使用一个icustom调用从不同的指标缓冲区获得几个值,在代码中多次使用这个函数太浪费了,特别是在优化过程中,甚至在 "重 "指数下。事实上,我们所需要的(最多)是得到一个交易方向和SL & TP..... 水平,问题通过简单的算术就能解决。

...

我希望,这个原则是明确的。




:),你会明白的(我故意使我的陈述更粗略),我知道关于将数值折叠成一个参数的问题 :)。并感谢所引用的代码(快速的问题--在原始值和 "随后扩展 "中是否有差异? 所有相同的双......)。

关键问题是...在这个特定的情况下,是否有必要这样做。

可能有两个原因。

1.1......额外缓冲区利用的目的(对我来说很重要)--指标没有那么多。我已经有了足够的证据,但就目前而言(看来我已经需要使用石木了--一切都会变得清晰起来:))。

2.从其代码中调用该指标的速度(你的例子)。我的答案是:不是必须的!我的答案是:不是必须的我负责任地宣布。动机。

每一个新的刻度线--无论如何,你都要(不得不)研究一下指标。对吗?(例如--拿价格或其他东西)即使不是每次打勾,而是在你需要时。主要的提示也许是,在EA的一次迭代中多次调用iCustom,会导致指标的多次重新计算?我不得不劝阻你!关键点是 "专家顾问的一次迭代限制"。因此,在这个范围内,该指标只计算一次(在其第一次调用时)!在这个范围内,该指标只计算一次。我以100%的信心宣布这一点。所有后续的调用根本不启动()它,而只是从必要的缓冲区获取必要的值。如果输入参数保持不变(除了缓冲区和偏移量),该条件为100%。该规则对一个工具范围内的计算有效。但我认为,即使iCustom指的是其他TF和工具,这个原则也是成立的。


无论如何,我今晚会看一下石牧,并确定我是否会使用两个缓冲器进行逻辑运算......或一个 :)

 

总之,今晚见(去上班了)。

关于这个问题。

We have to find solution to Bar Opening and Bar closing entry/exit points. They are vital for FSB -> MT integration.

我会考虑的。


但最有可能的是(鉴于MT在这个问题上缺乏信号)--上面的代码(上一页的模板)或多或少是最佳的(可能需要一点微调......我将在晚上尝试 "深化 "这个问题)