您现在的位置:程序化交易>> 期货公式>> 文华财经>> 文华财经知识>>正文内容

请老师改写一个指标 [文华财经]

  • 咨询内容: 请老师把这段代码改成文华版本的

    //+------------------------------------------------------------------+  

    //|                                                    Parabolic.mq4 |  

    //|                   Copyright 2005-2014, MetaQuotes Software Corp. |  

    //|                                              http://www.mql4.com |  

    //+------------------------------------------------------------------+  

    #property copyright   "2005-2014, MetaQuotes Software Corp."  

    #property link        "http://www.mql4.com"  

    #property description "Parabolic Stop-And-Reversal system"  

    #property strict  

     

    //--- indicator settings  

    #property indicator_chart_window  

    #property indicator_buffers 1  

    #property indicator_color1  Lime  

    //--- input parameters  

    input double InpSARStep=0.02;    // Step  

    input double InpSARMaximum=0.2;  // Maximum  

    //---- buffers  

    double       ExtSARBuffer[];  

    //--- global variables  

    double       ExtSarStep;  

    double       ExtSarMaximum;  

    int          ExtLastReverse;  

    bool         ExtDirectionLong;  

    double       ExtLastStep,ExtLastEP,ExtLastSAR;  

    double       ExtLastHigh,ExtLastLow;  

    //+------------------------------------------------------------------+  

    //| Custom indicator initialization function                         |  

    //+------------------------------------------------------------------+  

    void OnInit()  

      {  

    //--- checking input data  

       if(InpSARStep<0.0)  

         {  

          ExtSarStep=0.02;  

          Print("Input parametr InpSARStep has incorrect value. Indicator will use value ",  

                ExtSarStep," for calculations.");  

         }  

       else  

          ExtSarStep=InpSARStep;  

       if(InpSARMaximum<0.0)  

         {  

          ExtSarMaximum=0.2;  

          Print("Input parametr InpSARMaximum has incorrect value. Indicator will use value ",  

                ExtSarMaximum," for calculations.");  

         }  

       else  

          ExtSarMaximum=InpSARMaximum;  

    //--- drawing settings  

       IndicatorDigits(Digits);  

       SetIndexStyle(0,DRAW_ARROW);  

       SetIndexArrow(0,159);  

    //---- indicator buffers  

       SetIndexBuffer(0,ExtSARBuffer);  

    //--- set short name  

       IndicatorShortName("SAR("+DoubleToString(ExtSarStep,2)+","+DoubleToString(ExtSarMaximum,2)+")");  

    //--- set global variables  

       ExtLastReverse=0;  

       ExtDirectionLong=false;  

       ExtLastStep=ExtLastEP=ExtLastSAR=0.0;  

       ExtLastHigh=ExtLastLow=0.0;  

    //----  

      }  

    //+------------------------------------------------------------------+  

    //| Parabolic SAR                                                    |  

    //+------------------------------------------------------------------+  

    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[])  

      {  

       bool   dir_long;  

       double last_high,last_low,ep,sar,step;  

       int    i;  

    //--- check for minimum rates count  

       if(rates_total<3)  

          return(0);  

    //--- counting from 0 to rates_total  

       ArraySetAsSeries(ExtSARBuffer,false);  

       ArraySetAsSeries(high,false);  

       ArraySetAsSeries(low,false);  

    //--- detect current position for calculations   

       i=prev_calculated-1;  

    //--- calculations from start?  

       if(i<1)  

         {  

          ExtLastReverse=0;  

          dir_long=true;  

          step=ExtSarStep;  

          last_high=-10000000.0;  

          last_low=10000000.0;  

          sar=0;  

          i=1;  

          while(i<rates_total-1)  

            {  

             ExtLastReverse=i;  

             if(last_low>low[i])  

                last_low=low[i];  

             if(last_high<high[i])  

                last_high=high[i];  

             if(high[i]>high[i-1] && low[i]>low[i-1])  

                break;  

             if(high[i]<high[i-1] && low[i]<low[i-1])  

               {  

                dir_long=false;  

                break;  

               }  

             i++;  

            }  

          //--- initialize with zero  

          ArrayInitialize(ExtSARBuffer,0.0);  

          //--- go check  

          if(dir_long)  

            {  

             ExtSARBuffer[i]=low[i-1];  

             ep=high[i];  

            }  

          else  

            {  

             ExtSARBuffer[i]=high[i-1];  

             ep=low[i];  

            }  

          i++;  

         }  

       else  

         {  

          //--- calculations to be continued. restore last values  

          i=ExtLastReverse;  

          step=ExtLastStep;  

          dir_long=ExtDirectionLong;  

          last_high=ExtLastHigh;  

          last_low=ExtLastLow;  

          ep=ExtLastEP;  

          sar=ExtLastSAR;  

         }  

    //---main cycle  

       while(i<rates_total)  

         {  

          //--- check for reverse  

          if(dir_long && low[i]<ExtSARBuffer[i-1])  

            {  

             SaveLastReverse(i,true,step,low[i],last_high,ep,sar);  

             step=ExtSarStep;  

             dir_long=false;  

             ep=low[i];  

             last_low=low[i];  

             ExtSARBuffer[i++]=last_high;  

             continue;  

            }  

          if(!dir_long && high[i]>ExtSARBuffer[i-1])  

            {  

             SaveLastReverse(i,false,step,last_low,high[i],ep,sar);  

             step=ExtSarStep;  

             dir_long=true;  

             ep=high[i];  

             last_high=high[i];  

             ExtSARBuffer[i++]=last_low;  

             continue;  

            }  

          //---  

          sar=ExtSARBuffer[i-1]+step*(ep-ExtSARBuffer[i-1]);  

          //--- LONG?  

          if(dir_long)  

            {  

             if(ep<high[i])  

               {  

                if((step+ExtSarStep)<=ExtSarMaximum)  

                   step+=ExtSarStep;  

               }  

             if(high[i]<high[i-1] && i==2)  

                sar=ExtSARBuffer[i-1];  

             if(sar>low[i-1])  

                sar=low[i-1];  

             if(sar>low[i-2])  

                sar=low[i-2];  

             if(sar>low[i])  

               {  

                SaveLastReverse(i,true,step,low[i],last_high,ep,sar);  

                step=ExtSarStep; dir_long=false; ep=low[i];  

                last_low=low[i];  

                ExtSARBuffer[i++]=last_high;  

                continue;  

               }  

             if(ep<high[i])  

                ep=last_high=high[i];  

            }  

          else // SHORT  

            {  

             if(ep>low[i])  

               {  

                if((step+ExtSarStep)<=ExtSarMaximum)  

                   step+=ExtSarStep;  

               }  

             if(low[i]<low[i-1] && i==2)  

                sar=ExtSARBuffer[i-1];  

             if(sar<high[i-1])  

                sar=high[i-1];  

             if(sar<high[i-2])  

                sar=high[i-2];  

             if(sar<high[i])  

               {  

                SaveLastReverse(i,false,step,last_low,high[i],ep,sar);  

                step=ExtSarStep;  

                dir_long=true;  

                ep=high[i];  

                last_high=high[i];  

                ExtSARBuffer[i++]=last_low;  

                continue;  

               }  

             if(ep>low[i])  

                ep=last_low=low[i];  

            }  

          ExtSARBuffer[i++]=sar;  

         }  

    //---- OnCalculate done. Return new prev_calculated.  

       return(rates_total);  

      }  

    //+------------------------------------------------------------------+  

    //|  save last values to continue further calculations               |  

    //+------------------------------------------------------------------+  

    void SaveLastReverse(int reverse,bool dir,double step,double last_low,double last_high,double ep,double sar)  

      {  

       ExtLastReverse=reverse;  

       if(ExtLastReverse<2)  

          ExtLastReverse=2;  

       ExtDirectionLong=dir;  

       ExtLastStep=step;  

       ExtLastLow=last_low;  

       ExtLastHigh=last_high;  

       ExtLastEP=ep;  

       ExtLastSAR=sar;  

      }  

    //+------------------------------------------------------------------+  

     

     

     来源:程序化99

  • 文华技术人员:  语言差异过大,我们分析一下是否可以修改,预计周五前回复

     

     来源: WWW.CXH99.COM

  • 文华客服: 好的,谢谢

     

  • 网友回复:  我们分析了一下就是sar指标的
    您在k线界面右键》技术指标》趋势分析》sar止损点就可以了

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 511411198  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容