以下是MT4公式,请帮忙改编为金字塔格式(超过16240字符,请看一二楼)
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 White
#property indicator_color2 Red
#property indicator_color3 White
double Bi[],Highxiu[],Lowxiu[];
int i=0,j=0;//j为上一拐点以后的包含合并次数
int mark=0,xiangbao=0;//mark 为分笔方向变量,xiangbao 为K线包含关系方向变量
int Suo,Bisuo;//Suo为上一拐点的索引,Bisuo为上一线段端点的索引
int Shift,last;
double HighMid,LowMid;//HighMid为上溯第一个高点暂存,LowMid为上溯第一个低点暂存
int init()
{
SetIndexBuffer(0,Bi);
SetIndexBuffer(1,Highxiu);
SetIndexBuffer(2,Lowxiu);
SetIndexStyle(0,DRAW_SECTION);
SetIndexStyle(1,DRAW_NONE);
SetIndexStyle(2,DRAW_NONE);
SetIndexEmptyValue(0,0.0);
IndicatorDigits(Digits);
SetIndexLabel(0,"笔");
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int counted_bars=IndicatorCounted();
int Limit=Bars-counted_bars;
if(counted_bars==0 )
{
ArrayInitialize(Bi,0.0);
}
for(Shift=Limit;Shift>=0;Shift--)
{
Highxiu[Shift]=High[Shift];
Lowxiu[Shift]=Low[Shift];
switch(xiangbao)
{
case 0:
if(Highxiu[Shift]>Highxiu[Shift+1] && Lowxiu[Shift]>Lowxiu[Shift+1])
{
xiangbao=1;
}
if(Highxiu[Shift]<Highxiu[Shift+1] && Lowxiu[Shift]<Lowxiu[Shift+1])
{
xiangbao=-1;
}
break;
case 1:
if(Highxiu[Shift]<Highxiu[Shift+1] && Lowxiu[Shift]>=Lowxiu[Shift+1])
{
Highxiu[Shift]=Highxiu[Shift+1];
}
if(Highxiu[Shift]<Highxiu[Shift+1] && Lowxiu[Shift]<Lowxiu[Shift+1])
{
xiangbao=-1;
}
break;
case -1:
if(Highxiu[Shift]<=Highxiu[Shift+1] && Lowxiu[Shift]>Lowxiu[Shift+1])
{
Lowxiu[Shift]=Lowxiu[Shift+1];
}
if(Highxiu[Shift]>Highxiu[Shift+1] && Lowxiu[Shift]>Lowxiu[Shift+1])
{
xiangbao=1;
}
break;
default: return;
}
}
for(Shift=Limit;Shift>=0;Shift--)
{
switch(mark)
{
case 0:
j=0;
int x=iHighest(NULL,0,MODE_HIGH,counted_bars,Shift);
int y=iLowest(NULL,0,MODE_LOW,counted_bars,Shift);
if(x-y>=4) //如果高点在前且比低点超前4根K线
{
for(i=x-1;i>=y;i--)
{
if((High[i]!=Highxiu[i])|| (Low[i]!=Lowxiu[i])) j++;//累计合并包含K线的次数
}
if(x-y-j>=4) //如果高点在前且合并包含K线后比低点超前4根K线
{
Bi[x]=High[x]; //登记第一个顶的价格并传递给指标
HighMid=High[x]; //记录第一个顶的价格
Suo=x; //记录第一个顶的索引
mark=-1; //向上的笔结束,向下的一笔确认出现,把分笔的目标改为寻找底
}
}
if(y-x>4) //如果低点在前且比高点超前4根K线
{
for(i=y-1;i>=x;i--)
{
if((High[i]!=Highxiu[i])|| (Low[i]!=Lowxiu[i])) j++;//累计合并包含K线的次数
}
if(y-x-j>=4) //如果低点在前且合并K线后比高点超前4根K线
{
Bi[y]=Low[y]; //登记第一个底的价格并传递给指标
LowMid=Low[y]; //记录第一个底的价格
Suo=y; //记录第一个底的索引
mark=1; //向下的笔结束,向上的笔确认出现,把分笔的目标改为寻找顶
}
}
break;
case 1:
j=0;
x=iHighest(NULL,0,MODE_HIGH,Suo-Shift,Shift); //计算上一个底以来最高价所在K线的索引
y=iLowest(NULL,0,MODE_LOW,x-Shift,Shift); //计算上一个高点以来最低价所在K线的索引
if(x-y>=4)
{
for(i=x-1;i>=y;i--)
{
if((High[i]!=Highxiu[i])|| (Low[i]!=Lowxiu[i])) j++;//累计合并包含K线的次数
}
if(x-y-j>=4 && High[y]<Low[x])
{
Bi[x]=High[x]; //登记新一个顶的价格并传递给指标
HighMid=High[x]; //记录新一个顶的价格
Suo=x; //记录新一个顶的索引
mark=-1; //向上的笔结束,向下的一笔确认出现,把分笔的目标改为寻找底
last=y;
}
}
if(y-x>=4)
{
for(i=y-1;i>=x;i--)
{
if((High[i]!=Highxiu[i])|| (Low[i]!=Lowxiu[i])) j++;//累计合并包含K线的次数
}
if(y-x-j>=4 && High[y]<Low[x])
{
Bi[y]=Low[y]; //登记新一个底的价格并传递给指标
LowMid=Low[y]; //记录新一个底的价格
Suo=y; //记录新一个底的索引
mark=1; //向下的笔结束,向上的一笔确认出现,把分笔的目标改为寻找顶
last=x;
}
}
if(y-x>=3 && High[x]>HighMid) //至少第4根K线后过顶
{
Bi[y]=Low[y]; //登记新一个底的价格并传递给指标
LowMid=Low[y]; //记录新一个底的价格
Suo=y; //记录新一个底的索引
mark=1; //向下的笔结束,向上的一笔确认出现,把分笔的目标改为寻找顶
last=x;
}
if(Shift==0 && mark==-1)
{
Bi[y]=Low[y];
if(last!=y)
{
Bi[last]=0;
last=y;
}
}
break;
default: return;
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
{以上1、2楼为一个完整的公式源码}
神啊 楼主你这么长的代码 恐怕很难让人免费给你写出来啊
如果你会一些金字塔代码,来询问某个功能模块怎么实现 这样比较好
一点点都不会。那说出你的代码思路总可以吧
你的代码看不懂,亲