以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  请大神帮把ASCTREND系MT4代码改成金字塔  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=159367)

--  作者:单刀赴会
--  发布时间:2017/11/9 15:30:15
--  请大神帮把ASCTREND系MT4代码改成金字塔

下边是需要改的代码,有需要调用的函数和模版在附件中

//+------------------------------------------------------------------+
//|                                                    AscTrend2.mq4 |
//|                                     Copyright ?2006, Nick Bilak |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2006, Nick Bilak"

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Aqua
#property  indicator_color2  Magenta
//---- indicator parameters
extern int Risk=5;
extern double MONYRISK=2.0;
//---- indicator buffers
double e1[];
double e2[];

int i,value2=1,Counter,DCounter,TrueCount=0,MRO1=0,MRO2=0,MRO3=0,MRO4=0;
double  value3=18,value4=0,value5=0,value6=0,value7=0,value8=0,value9=0,
   value10=10,value11=10000,value12=0,value13=0,value14=0,value19=0,
   value4_1=0,value4_2=0,value9_1=0,value10_1=0,value11_1=0,value12_1=0,
   Range=0,AvgRange=0,AvgRange_1=0,AvgRange_2=0,
   val1=0,val2=0,NumBars=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(0,159);
   SetIndexArrow(1,159);
   SetIndexEmptyValue(0,0);
   SetIndexEmptyValue(1,0);
   if(
    !SetIndexBuffer(0,e1) ||
      !SetIndexBuffer(1,e2)
      )
      Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("AscT2("+Risk+")");
//---- initialization done
   return(0);
  
  }

int start()  {

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int limit=Bars-20-counted_bars;
   double spread=Ask-Bid;
   for(i=limit; i>=0; i--) {
    Range=0;
    AvgRange=0;
    for (Counter=i; Counter<=i+9; Counter++) {
      AvgRange=AvgRange+MathAbs(spread+High[Counter]-Low[Counter]);
    }
    Range=AvgRange/10.0;
      if (i==Bars-20)  {
            value2=1; value3=18; value10=10000; value10_1=0;
        value19=MONYRISK*Range*Point;
        value2=Risk;
        value3=18+3*value2;
        value9=0;
      }
    Counter=i;
    AvgRange=0;
    for (Counter=i; Counter<=i+9-1; Counter++) {
     AvgRange=AvgRange+Close[Counter];
  }
    value11=AvgRange/9.0;
    // -----
    //value12=UserFunction("AverageClose",value3,i);
    Counter=i;
    AvgRange=0;
    for (Counter=i; Counter<=i+value3-1; Counter++) {
     AvgRange=AvgRange+Close[Counter];
  }
    value12=AvgRange/value3;
    // -----
    value13=Range;
    // -----
    //value4=UserFunction("JESSD",High[i],Low[i],High[i+value2],Low[i+value2],Close[i+value2]);
    AvgRange=(spread+High[i]+Low[i])/2.0;
    if (Close[i+value2]<AvgRange) {
      value4=2*AvgRange-Low[i+value2];
    } else {
     value4=2*AvgRange-spread+High[i+value2];
  }
    // -----
    Counter=i;
    TrueCount=0;
    while (Counter<i+2 && TrueCount<1) {
     //value4=UserFunction("JESSD",High[Counter],Low[Counter],High[Counter+value2],Low[Counter+value2],Close[Counter+value2]);
      AvgRange=(spread+High[Counter]+Low[Counter])/2.0;
      if (Close[Counter+value2]<AvgRange) {
       value4=2*AvgRange-Low[Counter+value2];
     } else {
       value4=2*AvgRange-spread+High[Counter+value2];
     }
      value4=NormalizeDouble(value4,2);
      //value4_1=UserFunction("JESSD",High[Counter+1],Low[Counter+1],High[Counter+value2],Low[Counter+value2],Close[Counter+value2]);
      AvgRange_1=(spread+High[Counter+1]+Low[Counter+1])/2.0;
      if (Close[Counter+1+value2]<AvgRange_1) {
       value4_1=2*AvgRange_1-Low[Counter+1+value2];
     } else {
       value4_1=2*AvgRange_1-spread+High[Counter+1+value2];
     }
      value4_1=NormalizeDouble(value4_1,2);
      //value4_2=UserFunction("JESSD",High[Counter+2],Low[Counter+2],High[Counter+value2],Low[Counter+value2],Close[Counter+value2]);
      AvgRange_2=(spread+High[Counter+2]+Low[Counter+2])/2.0;
      if (Close[Counter+2+value2]<AvgRange_2) {
       value4_2=2*AvgRange_2-Low[Counter+2+value2];
     } else {
       value4_2=2*AvgRange_2-spread+High[Counter+2+value2];
     }
      value4_2=NormalizeDouble(value4_2,2);
      if (value4>value4_1 && value4_1<value4_2) TrueCount=TrueCount+1;
      Counter=Counter+1;
  }
    if (TrueCount>=1) MRO1=Counter-i-1; else MRO1=-1;
    // -----
    Counter=i;
    TrueCount=0;
    while (Counter<i+2 && TrueCount<1) {
     //value4=UserFunction("JESSD",High[Counter],Low[Counter],High[Counter+value2],Low[Counter+value2],Close[Counter+value2]);
      AvgRange=(spread+High[Counter]+Low[Counter])/2.0;
      if (Close[Counter+value2]<AvgRange) {
       value4=2*AvgRange-Low[Counter+value2];
     } else {
       value4=2*AvgRange-spread+High[Counter+value2];
     }
      value4=NormalizeDouble(value4,2);
      //value4_1=UserFunction("JESSD",High[Counter+1],Low[Counter+1],High[Counter+value2],Low[Counter+value2],Close[Counter+value2]);
      AvgRange_1=(spread+High[Counter+1]+Low[Counter+1])/2.0;
      if (Close[Counter+1+value2]<AvgRange_1) {
       value4_1=2*AvgRange_1-Low[Counter+1+value2];
     } else {
       value4_1=2*AvgRange_1-spread+High[Counter+1+value2];
     }
      value4_1=NormalizeDouble(value4_1,2);
      //value4_2=UserFunction("JESSD",High[Counter+2],Low[Counter+2],High[Counter+value2],Low[Counter+value2],Close[Counter+value2]);
      AvgRange_2=(spread+High[Counter+2]+Low[Counter+2])/2.0;
      if (Close[Counter+2+value2]<AvgRange_2) {
       value4_2=2*AvgRange_2-Low[Counter+2+value2];
     } else {
       value4_2=2*AvgRange_2-spread+High[Counter+2+value2];
     }
      value4_2=NormalizeDouble(value4_2,2);
      if (value4<value4_1 && value4_1>value4_2) TrueCount=TrueCount+1;
      Counter=Counter+1;
  }
    if (TrueCount>=1) MRO2=Counter-i-1; else MRO2=-1;
    // -----
    //value4_1=UserFunction("JESSD",High[i+1],Low[i+1],High[i+1+value2],Low[i+1+value2],Close[i+1+value2]);
    AvgRange_1=(spread+High[i+1]+Low[i+1])/2.0;
    if (Close[i+1+value2]<AvgRange_1) {
     value4_1=2*AvgRange_1-Low[i+1+value2];
  } else {
     value4_1=2*AvgRange_1-spread+High[i+1+value2];
  }
    // -----
    if (MRO1>-1 && Low[i+1]>value4_1) value5=value4_1-value13;
    if (MRO2>-1 && spread+High[i+1]<value4_1) value6=value4_1+value13;
    // -----
    //value11_1=UserFunction("AverageClose",9,i+1);
    Counter=i;
    AvgRange=0;
    for (Counter=i+1; Counter<=i+1+9-1; Counter++) {
     AvgRange=AvgRange+Close[Counter];
  }
    value11_1=AvgRange/9.0;
    // -----
    //value12_1=UserFunction("AverageClose",value3,i+1);
    Counter=i;
    AvgRange=0;
    for (Counter=i+1; Counter<=i+1+value3-1; Counter++) {
     AvgRange=AvgRange+Close[Counter];
  }
    value12_1=AvgRange/value3;
    // -----
    if (value11_1<value12_1 && value11>value12) {
     //value5=UserFunction("TrueLow",i)-value13;
     if (Close[i+1]<Low[i]) {
      value5=Close[i+1]-value13;
   } else {
      value5=Low[i]-value13;
   }
  }
    if (value11_1>value12_1 && value11<value12) {
     //value5=UserFunction("TrueHigh",i)+value13;
     if (Close[i+1]>spread+High[i]) {
      value5=Close[i+1]+value13;
   } else {
      value5=spread+High[i]+value13;
   }
  }
    // -----
    if (MathAbs(Open[i]-Close[i+1])>=1.618*value13) {
      if (value11>value12) value5=Low[i]-value13;
      if (value11<value12) value14=spread+High[i]+value13;
  }
    // -----
    //value7=UserFunction("BS105",Low[i],2.40,value13,value9);
    if (Low[i]-2.40*value13<value9) {
     value7=value9;
  } else {
     value7=Low[i]-2.40*value13;
  }
    // -----
    //value8=UserFunction("SS105",High[i],2.40,value13,value10);
    if (spread+High[i]+2.40*value13>value10) {
     value8=value10;
  } else {
     value8=spread+High[i]+2.40*value13;
  }
    // -----
    //value9=UserFunction("BS0",Low[i],60,value7,RISK,value19);
    value9=value7;
    // -----
    //value10=UserFunction("SS0",High[i],60,value8,RISK,value19);
    value10=value8;
    // -----
    if (Low[i]-value9>value19/Point) value9=Low[i]-(1.50+0.1*Risk)*value13;
    if (value10-spread+High[i]>value19/Point) value10=spread+High[i]+(1.50+0.1*Risk)*value13;
    if (value11>=value12 && value5>=value9) value9=value5;
    if (value11<=value12 && value6<=value10) value10=value6;
    if (value11<=value12 && value5<=value9) value9=value5;
    if (value11>=value12 && value6>=value10) value10=value6;
    // -----
    Counter=i;
    TrueCount=0;
    while (Counter<i+2 && TrueCount<2) {
     //value11=UserFunction("AverageClose",9,Counter);
     DCounter=Counter;
     AvgRange=0;
     for (DCounter=Counter; DCounter<=Counter+9-1; DCounter++) {
      AvgRange=AvgRange+Close[DCounter];
   }
     value11=AvgRange/9.0;
     //value12=UserFunction("AverageClose",value3,Counter);
     DCounter=Counter;
     AvgRange=0;
     for (DCounter=Counter; DCounter<=Counter+value3-1; DCounter++) {
      AvgRange=AvgRange+Close[DCounter];
   }
     value12=AvgRange/value3;
     if (value11>=value12) TrueCount=TrueCount+1;
     Counter=Counter+1;
  }
    if (TrueCount>=2) MRO3=Counter-i-1; else MRO3=-1;
    // -----
    Counter=i;
    TrueCount=0;
    while (Counter<i+2 && TrueCount<2) {
     //value11=UserFunction("AverageClose",9,Counter);
     DCounter=Counter;
     AvgRange=0;
     for (DCounter=Counter; DCounter<=Counter+9-1; DCounter++) {
      AvgRange=AvgRange+Close[DCounter];
   }
     value11=AvgRange/9.0;
     //value12=UserFunction("AverageClose",value3,Counter);
     DCounter=Counter;
     AvgRange=0;
     for (DCounter=Counter; DCounter<=Counter+value3-1; DCounter++) {
      AvgRange=AvgRange+Close[DCounter];
   }
     value12=AvgRange/value3;
     if (value11<=value12) TrueCount=TrueCount+1;
     Counter=Counter+1;
  }
    if (TrueCount>=2) MRO4=Counter-i-1; else MRO4=-1;
    // -----
    if (MRO3>-1 && value9<=value9_1) value9=value9_1;
    if (MRO4>-1 && value10>=value10_1) value10=value10_1;
    // -----
    //value11=UserFunction("AverageClose",9,i);
    Counter=i;
    AvgRange=0;
      for (Counter=i; Counter<=i+9-1; Counter++) {
     AvgRange=AvgRange+Close[Counter];
  }
    value11=AvgRange/9.0;
    // -----
    //value12=UserFunction("AverageClose",value3,i);
    Counter=i;
    AvgRange=0;
      for (Counter=i; Counter<=i+value3-1; Counter++) {
     AvgRange=AvgRange+Close[Counter];
  }
    value12=AvgRange/value3;
    // -----
    val1=0;
    val2=0;
    if (value9>0 && value11>=value12 && value9<=spread+High[i]) {
     val1=value9;
  }
    if (value10>0 && value10<1000000000 && value11<=value12 && value10>=Low[i]) {
     val2=value10;
  }
    // -----
    value9_1=value9;
    value10_1=value10;
    e1[i]=val1; //SetIndexValue(i,val1);
    e2[i]=val2; //SetIndexValue2(i,val2);
    // -----
   }
}

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:asctrend.zip

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:asctrend_template.zip


--  作者:FireScript
--  发布时间:2017/11/9 15:54:15
--  

1.MT4的软件语言和机制,我们这边基本不怎么了解。时间和精力上也不允许我们去单独深入研究MT4。希望您能理解。

2.一般这种转换,需要你自行理清其中的策略思想,也就是把上面的策略描述成自然语言,然后再转化到金字塔的语言。这中间还需要你对那个软件的机制有了解。  打个比方 一条语句  C[1];金字塔里的含义是使用的当前图表下的第一个K的收盘价,TB里面则是当前K线位置的上一个K的的收盘价。这个很小的细节,如果对2个软件的机制不了解,就会出很多错。所以MT4也是一样的道理。

[此贴子已经被作者于2017/11/9 15:54:58编辑过]