指标: 傅立叶价格外推 - 页 4 12345678 新评论 Jacob Funk 2011.01.19 18:43 #31 嘿,有趣的指标。我喜欢在图表上使用预测 模型的数学方面。我对代码还不是很有经验,所以我想知道你如何设置模型 "回溯 "到一定数量(比如 100)之前的预测曲线。这样就可以将它应用到各种图表中,并了解实际情况与模型之间的差异有多大,也许还可以利用它来确定模型运行良好的市场的某些特征,等等。 investeo 2011.01.19 22:10 #32 Saidar: 是的,我用的是 Windows 7,我会看看的您可能需要在便携模式下运行 mt5:terminal.exe /portable你将在当前的 mt5 目录下获得指示器 - 这对安装挂盘很有用 okx 2011.06.16 20:20 #33 修改,使其及时后移,以测试其预测能力: 在第 32 行插入: input int TimeShift = 10; // 向后移动多少条,用于评估指标的预测能力 在第 54 行替换: PlotIndexSetInteger(0, PLOT_SHIFT, Nfut); 为: PlotIndexSetInteger(0, PLOT_SHIFT, Nfut - TimeShift); 在第 55 行插入: PlotIndexSetInteger(1, PLOT_SHIFT, -TimeShift); 在第 87 行替换: if(CopyRates(NULL, 0, 0, Npast, rates) <= 0) return(0); with: if(CopyRates(NULL, 0, TimeShift, Npast, rates) <= 0) return(0); Denis Lazarev 2012.11.25 19:29 #34 值得一看。谁会在交易中使用它?我查看了它的历史记录--结果发现,该指标根本不考虑趋势,它逆势预测了几千个五位数点,在我看来,它应该与 MA/CCI/Bollinger Bands 等指标一起使用,外推器会确认信号,否则它可能会成为一个消耗品。它应该最适合在较高的时间框架上使用,在 D1 上,它预测一个月的准确性令人惊叹,但当趋势开始时,我非常失望(见最后一段)。 MathQuant 2013.01.20 16:09 #35 谢谢 Алёша 2013.02.02 01:42 #36 lazarev-d-m:值得一看。谁在交易中使用它?我也非常好奇,如果有人在 TS 中使用外推器,具体是如何使用的?这个寻找圣杯的方向前景如何?纯粹凭直觉,这似乎是需要的,但不知何故,这种外推器的测试和预测与现实的关联度很低,至少对我来说是这样......能否请您告诉我,如何选择外推器,哪种外推器最准确?我的意思是,可能不只是傅里叶级数可以分解,分解的方法是无穷无尽的。例如,你可以从最简单的方法入手,从 MA 或 MACD 的交叉点入手,从而预测曲线;如果你不懒惰,那么可以从不同的经验分解入手,然后求平均值,最后再求共线....。从理论上讲,我可以想象如何做到这一点,但如果我开始尝试编码,一年之内我也做不到((((。如果外推器能设置近期的概率分布,而不是画一条线,那就更好了。 Женя 2013.02.03 00:10 #37 Alex_Bondar:如果外推器设置的是近期的概率分布,而不是画一条线,那就太酷了。我觉得可以这样,如果你用 photoshop 练习的话)))))。 Сергей Криушин 2013.05.20 20:20 #38 起初,它似乎预测得很好,但最近它开始给出一条直线,尽管在我很久没用的旧终端上,它甚至更好--红线几乎紧贴价格。为什么会出现这种情况呢? 可能是因为更新的缘故,也可能是它的编码太老,时间长了就老了。 Nikolai Semko 2014.07.02 11:19 #39 有趣的指标!感谢它的创造者。为了了解其预测质量,我在代码中增加了一个参数 "开始"--从哪条柱状线开始,而不是从零开始。我还为鼠标移动添加了一个事件处理程序。 要启动它,只需按下 Ctrl 键并移动鼠标(我建议您启用十字准线)--鼠标在图表上的位置就是开始。观看动态效果非常有趣。要关闭它,只需按除 Ctrl 以外的任意键//+--------------------------------------------------------------------------------------+//| Fourier_Extrapolator_of_Price.mq5 |//| Copyright 2010, gpwr |//+--------------------------------------------------------------------------------------+// 增加了移动起点的可能性(按 CTRL)#property copyright "gpwr"#property version "1.00"#property description "Extrapolation of open prices by trigonometric (multitone) model"#property indicator_chart_window#property indicator_buffers 2#property indicator_plots 2//---未来模型输出#property indicator_label1 "Modeled future"#property indicator_type1 DRAW_LINE#property indicator_color1 Red#property indicator_style1 STYLE_SOLID#property indicator_width1 1//--- 过去的模型输出#property indicator_label2 "Modeled past"#property indicator_type2 DRAW_LINE#property indicator_color2 Blue#property indicator_style2 STYLE_SOLID#property indicator_width2 1//--- 全局常量#define pi 3.141592653589793238462643383279502884197169399375105820974944592//--- 指示器输入 input int Npast =300; // 过去的柱状图,拟合三角数列 input int Nfut =50; // 预测未来的柱状图 input int Nharm =20; // 模型中的谐波 input double FreqTOL =0.00001; // 频率计算的容差 input int Start =0; // 从哪一棒开始//--- 全局变量 int N; int key=0; int start=0;//--- 指标缓冲区 double ym[],xm[];//+------------------------------------------------------------------+//| 自定义指标初始化函数 |//+------------------------------------------------------------------+ void OnInit(){//--- 初始化全局变量 N=MathMax(Npast,Nfut+1); //--- 指标缓冲区映射 ArraySetAsSeries(xm,true); ArraySetAsSeries(ym,true); SetIndexBuffer(0,ym,INDICATOR_DATA); SetIndexBuffer(1,xm,INDICATOR_DATA); IndicatorSetInteger(INDICATOR_DIGITS,_Digits); IndicatorSetString(INDICATOR_SHORTNAME, "Fourier("+string(Npast)+")"); PlotIndexSetInteger(0,PLOT_SHIFT,Nfut); ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true); start=Start;}//+------------------------------------------------------------------+//| 自定义指标迭代函数 |//+------------------------------------------------------------------+ 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[]){{ // Check for insufficient data if(rates_total<Npast) { Print("Error:not enough bars in history!"); return(0); }//--- 将指标缓冲区初始化为 EMPTY_VALUE ArrayInitialize(xm,EMPTY_VALUE); ArrayInitialize(ym,EMPTY_VALUE); //--- 使所有价格可用 MqlRates rates[]; ArraySetAsSeries(rates,true); if(CopyRates(NULL,0,start,Npast,rates)<=0) return(0);//--- 主循环//--- 准备输入数据 double x[]; ArrayResize(x,Npast); double av=0; for(int i=0;i<Npast;i++) { x[i]=rates[i].open; av+=x[i]; }av/=Npast; //--- 初始化模型输出 for(int i=0;i<N<N;i++) { { xm[i+start]=av; if(i<=Nfut) ym[i+start]=av; }//--- 拟合三角模型并计算预测结果 for(int harm=1;harm<=Nharm;harm++) { double w,m,a,b; Freq(x,Npast,w,m,a,b); for(int i=0;i<N;i++) { xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i); if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i); } } return(rates_total);}//--- 按 Ctrl 键和鼠标移动的事件处理程序 void OnChartEvent(const int id, // 事件标识符 const long& lparam, // 事件参数类型 long const double& dparam, // 事件参数类型 double const string& sparam // 事件参数类型 string ){ double y; int window=0; datetime ttt; if(id==CHARTEVENT_KEYDOWN) key=(int)lparam; if(id==CHARTEVENT_MOUSE_MOVE && key==17) { ChartXYToTimePrice(0,(int)lparam,(int)dparam,window,ttt,y); if(ttt!=0) start=iBarShift(NULL,0,ttt,false); Comment("x = ",lparam,", y = ",dparam,", Price = ",y,", start = ",start); ArrayInitialize(xm,EMPTY_VALUE); ArrayInitialize(ym,EMPTY_VALUE); //--- 使所有价格可用 MqlRates rates[]; ArraySetAsSeries(rates,true); if(CopyRates(NULL,0,start,Npast,rates)<=0) return;//--- main cycle//--- prepare input data double x[]; ArrayResize(x,Npast); double av=0; for(int i=0;i<Npast;i++) { x[i]=rates[i].open; av+=x[i]; }av/=Npast; //--- 初始化模型输出 for(int i=0;i<N;i++) { xm[i+start]=av; if(i<=Nfut) ym[i+start]=av; }//--- 拟合三角模型并计算预测值 for(int harm=1;harm<=Nharm;harm++) { double w,m,a,b; Freq(x,Npast,w,m,a,b); for(int i=0;i<N;i++) { xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i); if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i); } } } } //+------------------------------------------------------------------+//| Quinn 和 Fernandes 算法求频率 |//+------------------------------------------------------------------+ void Freq(double& x[],int n,double& w,double& m,double& a,double& b){ double z[]; ArrayResize(z,n); double alpha=0.0; double beta=2.0; z[0]=x[0]-xm[0+start]; while(MathAbs(alpha-beta)>FreqTOL) { alpha=beta; z[1]=x[1]-xm[1+start]+alpha*z[0]; double num=z[0]*z[1]; double den=z[0]*z[0]; for(int i=2;i<n;i++) { z[i]=x[i]-xm[i+start]+alpha*z[i-1]-z[i-2]; num+=z[i-1]*(z[i]+z[i-2]); den+=z[i-1]*z[i-1]; }beta=num/den; } w=MathArccos(beta/2.0); TrigFit(x,n,w,m,a,b);}//+------------------------------------------------------------------+//| 三角数列的最小二乘拟合 |//+------------------------------------------------------------------+ void TrigFit(double& x[],int n,double& w,double& m,double& a,double& b){ double Sc =0.0; double Ss=0.0; double Scc=0.0; double Sss=0.0; double Scs=0.0; double Sx=0.0; double Sxc=0.0; double Sxs=0.0; for(int i=0;i<n;i++) { double c=MathCos(w*i); double s=MathSin(w*i); double dx=x[i]-xm[i+start]; Sc +=c; Ss +=s; Scc+=c*c; Sss+=s*s; Scs+=c*s; Sx +=dx; Sxc+=dx*c; Sxs+=dx*s; }Sc /=n; Ss /=n; Scc/=n; Sss/=n; Scs/=n; Sx /=n; Sxc/=n; Sxs/=n; if(w==0.0) { m=Sx; a=0.0; b=0.0; }else { // 计算 a、b 和 m double den=MathPow(Scs-Sc*Ss,2)-(Scc-Sc*Sc)*(Sss-Ss*Ss); a=((Sxs-Sx*Ss)*(Scs-Sc*Ss)-(Sxc-Sx*Sc)*(Sss-Ss*Ss))/den; b=((Sxc-Sx*Sc)*(Scs-Sc*Sc*Ss)-(Sxs-Sx*Ss)*(Scc-Sc*Sc*Sc))/den; m=Sx-a*Sc-b*Ss; }} int iBarShift(string symbol,int timeframe,datetime time,bool exact=false){ if(time<) return(-1); 0) return(-1); ENUM_TIMEFRAMES tf=TFMigrate(timeframe); datetime Arr[],time1; CopyTime(symbol,tf,0,1,Arr); time1=Arr[0]; if(CopyTime(symbol,tf,time,time1,Arr)>0) { if(ArraySize(Arr)>2) return(ArraySize(Arr)-1); if(time<time1) return(1); else return(0); }else return(-1);} ENUM_TIMEFRAMES TFMigrate(int tf){ switch(tf) { case 0: return(PERIOD_CURRENT); case 1: return(PERIOD_M1); case 5: return(PERIOD_M5); case 15: return(PERIOD_M15); case 30: return(PERIOD_M30); case 60:返回(PERIOD_H1); 例 240:返回(PERIOD_H4); 例 1440:返回(PERIOD_D1); 例 10080:返回(PERIOD_W1); 例 43200:返回(PERIOD_MN1); 例 2:返回(PERIOD_M2); 例 3:返回(PERIOD_M3); 例 4:返回(PERIOD_M4); 例 6:return(PERIOD_M6); 例 10: return(PERIOD_M10); 例 12: return(PERIOD_M12); 例 16385: return(PERIOD_H1); 例 16386: return(PERIOD_H2); 例 16387: return(PERIOD_H3); 例 16388: return(PERIOD_H4); 例 16390:return(PERIOD_H6); case 16392: return(PERIOD_H8); case 16396: return(PERIOD_H12); case 16408: return(PERIOD_D1); case 32769: return(PERIOD_W1); case 49153: return(PERIOD_MN1); 默认值: return(PERIOD_CURRENT); }} 附加的文件: Fourier_Extrapolator_of_Price2.mq5 10 kb Errors, bugs, questions Can't compile ('}' - 错误、漏洞、问题 Vladimir Karputov 2014.07.02 13:06 #40 Nikolay7ko:... 请正确插入代码。正确插入代码会让人感觉更愉快:在论坛中正确 插入代码 12345678 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
嘿,有趣的指标。我喜欢在图表上使用预测 模型的数学方面。我对代码还不是很有经验,所以我想知道你如何设置模型 "回溯 "到一定数量(比如 100)之前的预测曲线。这样就可以将它应用到各种图表中,并了解实际情况与模型之间的差异有多大,也许还可以利用它来确定模型运行良好的市场的某些特征,等等。
是的,我用的是 Windows 7,我会看看的
您可能需要在便携模式下运行 mt5:
terminal.exe /portable
你将在当前的 mt5 目录下获得指示器 - 这对安装挂盘很有用
修改,使其及时后移,以测试其预测能力:
在第 32 行插入:
input int TimeShift = 10; // 向后移动多少条,用于评估指标的预测能力
在第 54 行替换:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut);
为:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut - TimeShift);
在第 55 行插入:
PlotIndexSetInteger(1, PLOT_SHIFT, -TimeShift);
在第 87 行替换:
if(CopyRates(NULL, 0, 0, Npast, rates) <= 0) return(0);
with:
if(CopyRates(NULL, 0, TimeShift, Npast, rates) <= 0) return(0);
值得一看。
谁会在交易中使用它?
我查看了它的历史记录--结果发现,该指标根本不考虑趋势,它逆势预测了几千个五位数点,在我看来,它应该与 MA/CCI/Bollinger Bands 等指标一起使用,外推器会确认信号,否则它可能会成为一个消耗品。
它应该最适合在较高的时间框架上使用,在 D1 上,它预测一个月的准确性令人惊叹,但当趋势开始时,我非常失望(见最后一段)。
谢谢
值得一看。
谁在交易中使用它?
我也非常好奇,如果有人在 TS 中使用外推器,具体是如何使用的?这个寻找圣杯的方向前景如何?
纯粹凭直觉,这似乎是需要的,但不知何故,这种外推器的测试和预测与现实的关联度很低,至少对我来说是这样......
能否请您告诉我,如何选择外推器,哪种外推器最准确?我的意思是,可能不只是傅里叶级数可以分解,分解的方法是无穷无尽的。例如,你可以从最简单的方法入手,从 MA 或 MACD 的交叉点入手,从而预测曲线;如果你不懒惰,那么可以从不同的经验分解入手,然后求平均值,最后再求共线....。从理论上讲,我可以想象如何做到这一点,但如果我开始尝试编码,一年之内我也做不到((((。
如果外推器能设置近期的概率分布,而不是画一条线,那就更好了。
如果外推器设置的是近期的概率分布,而不是画一条线,那就太酷了。
我觉得可以这样,如果你用 photoshop 练习的话)))))。
有趣的指标!感谢它的创造者。
为了了解其预测质量,我在代码中增加了一个参数 "开始"--从哪条柱状线开始,而不是从零开始。
我还为鼠标移动添加了一个事件处理程序。
要启动它,只需按下 Ctrl 键并移动鼠标(我建议您启用十字准线)--鼠标在图表上的位置就是开始。
观看动态效果非常有趣。
要关闭它,只需按除 Ctrl 以外的任意键
//+--------------------------------------------------------------------------------------+
//| Fourier_Extrapolator_of_Price.mq5 |
//| Copyright 2010, gpwr |
//+--------------------------------------------------------------------------------------+
// 增加了移动起点的可能性(按 CTRL)
#property copyright "gpwr"
#property version "1.00"
#property description "Extrapolation of open prices by trigonometric (multitone) model"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//---未来模型输出
#property indicator_label1 "Modeled future"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- 过去的模型输出
#property indicator_label2 "Modeled past"
#property indicator_type2 DRAW_LINE
#property indicator_color2 Blue
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- 全局常量
#define pi 3.141592653589793238462643383279502884197169399375105820974944592
//--- 指示器输入
input int Npast =300; // 过去的柱状图,拟合三角数列
input int Nfut =50; // 预测未来的柱状图
input int Nharm =20; // 模型中的谐波
input double FreqTOL =0.00001; // 频率计算的容差
input int Start =0; // 从哪一棒开始
//--- 全局变量
int N;
int key=0;
int start=0;
//--- 指标缓冲区
double ym[],xm[];
//+------------------------------------------------------------------+
//| 自定义指标初始化函数 |
//+------------------------------------------------------------------+
void OnInit()
{
//--- 初始化全局变量
N=MathMax(Npast,Nfut+1);
//--- 指标缓冲区映射
ArraySetAsSeries(xm,true);
ArraySetAsSeries(ym,true);
SetIndexBuffer(0,ym,INDICATOR_DATA);
SetIndexBuffer(1,xm,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
IndicatorSetString(INDICATOR_SHORTNAME, "Fourier("+string(Npast)+")");
PlotIndexSetInteger(0,PLOT_SHIFT,Nfut);
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
start=Start;
}
//+------------------------------------------------------------------+
//| 自定义指标迭代函数 |
//+------------------------------------------------------------------+
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[])
{
{ // Check for insufficient data
if(rates_total<Npast)
{
Print("Error:not enough bars in history!");
return(0);
}
//--- 将指标缓冲区初始化为 EMPTY_VALUE
ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);
//--- 使所有价格可用
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return(0);
//--- 主循环
//--- 准备输入数据
double x[];
ArrayResize(x,Npast);
double av=0;
for(int i=0;i<Npast;i++)
{
x[i]=rates[i].open;
av+=x[i];
}av/=Npast;
//--- 初始化模型输出
for(int i=0;i<N<N;i++)
{
{ xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}
//--- 拟合三角模型并计算预测结果
for(int harm=1;harm<=Nharm;harm++)
{
double w,m,a,b;
Freq(x,Npast,w,m,a,b);
for(int i=0;i<N;i++)
{
xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i);
if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i);
}
}
return(rates_total);
}
//--- 按 Ctrl 键和鼠标移动的事件处理程序
void OnChartEvent(const int id, // 事件标识符
const long& lparam, // 事件参数类型 long
const double& dparam, // 事件参数类型 double
const string& sparam // 事件参数类型 string
){
double y;
int window=0;
datetime ttt;
if(id==CHARTEVENT_KEYDOWN) key=(int)lparam;
if(id==CHARTEVENT_MOUSE_MOVE && key==17)
{
ChartXYToTimePrice(0,(int)lparam,(int)dparam,window,ttt,y);
if(ttt!=0) start=iBarShift(NULL,0,ttt,false);
Comment("x = ",lparam,", y = ",dparam,", Price = ",y,", start = ",start);
ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);
//--- 使所有价格可用
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return;
//--- main cycle
//--- prepare input data
double x[];
ArrayResize(x,Npast);
double av=0;
for(int i=0;i<Npast;i++)
{
x[i]=rates[i].open;
av+=x[i];
}av/=Npast;
//--- 初始化模型输出
for(int i=0;i<N;i++)
{
xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}
//--- 拟合三角模型并计算预测值
for(int harm=1;harm<=Nharm;harm++)
{
double w,m,a,b;
Freq(x,Npast,w,m,a,b);
for(int i=0;i<N;i++)
{
xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i);
if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i);
}
}
}
}
//+------------------------------------------------------------------+
//| Quinn 和 Fernandes 算法求频率 |
//+------------------------------------------------------------------+
void Freq(double& x[],int n,double& w,double& m,double& a,double& b)
{
double z[];
ArrayResize(z,n);
double alpha=0.0;
double beta=2.0;
z[0]=x[0]-xm[0+start];
while(MathAbs(alpha-beta)>FreqTOL)
{
alpha=beta;
z[1]=x[1]-xm[1+start]+alpha*z[0];
double num=z[0]*z[1];
double den=z[0]*z[0];
for(int i=2;i<n;i++)
{
z[i]=x[i]-xm[i+start]+alpha*z[i-1]-z[i-2];
num+=z[i-1]*(z[i]+z[i-2]);
den+=z[i-1]*z[i-1];
}beta=num/den;
}
w=MathArccos(beta/2.0);
TrigFit(x,n,w,m,a,b);
}
//+------------------------------------------------------------------+
//| 三角数列的最小二乘拟合 |
//+------------------------------------------------------------------+
void TrigFit(double& x[],int n,double& w,double& m,double& a,double& b)
{
double Sc =0.0;
double Ss=0.0;
double Scc=0.0;
double Sss=0.0;
double Scs=0.0;
double Sx=0.0;
double Sxc=0.0;
double Sxs=0.0;
for(int i=0;i<n;i++)
{
double c=MathCos(w*i);
double s=MathSin(w*i);
double dx=x[i]-xm[i+start];
Sc +=c;
Ss +=s;
Scc+=c*c;
Sss+=s*s;
Scs+=c*s;
Sx +=dx;
Sxc+=dx*c;
Sxs+=dx*s;
}Sc /=n;
Ss /=n;
Scc/=n;
Sss/=n;
Scs/=n;
Sx /=n;
Sxc/=n;
Sxs/=n;
if(w==0.0)
{
m=Sx;
a=0.0;
b=0.0;
}else
{
// 计算 a、b 和 m
double den=MathPow(Scs-Sc*Ss,2)-(Scc-Sc*Sc)*(Sss-Ss*Ss);
a=((Sxs-Sx*Ss)*(Scs-Sc*Ss)-(Sxc-Sx*Sc)*(Sss-Ss*Ss))/den;
b=((Sxc-Sx*Sc)*(Scs-Sc*Sc*Ss)-(Sxs-Sx*Ss)*(Scc-Sc*Sc*Sc))/den;
m=Sx-a*Sc-b*Ss;
}
}
int iBarShift(string symbol,int timeframe,datetime time,bool exact=false)
{
if(time<) return(-1); 0) return(-1);
ENUM_TIMEFRAMES tf=TFMigrate(timeframe);
datetime Arr[],time1;
CopyTime(symbol,tf,0,1,Arr);
time1=Arr[0];
if(CopyTime(symbol,tf,time,time1,Arr)>0)
{
if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
if(time<time1) return(1);
else return(0);
}else return(-1);
}
ENUM_TIMEFRAMES TFMigrate(int tf)
{
switch(tf)
{
case 0: return(PERIOD_CURRENT);
case 1: return(PERIOD_M1);
case 5: return(PERIOD_M5);
case 15: return(PERIOD_M15);
case 30: return(PERIOD_M30);
case 60:返回(PERIOD_H1);
例 240:返回(PERIOD_H4);
例 1440:返回(PERIOD_D1);
例 10080:返回(PERIOD_W1);
例 43200:返回(PERIOD_MN1);
例 2:返回(PERIOD_M2);
例 3:返回(PERIOD_M3);
例 4:返回(PERIOD_M4);
例 6:return(PERIOD_M6);
例 10: return(PERIOD_M10);
例 12: return(PERIOD_M12);
例 16385: return(PERIOD_H1);
例 16386: return(PERIOD_H2);
例 16387: return(PERIOD_H3);
例 16388: return(PERIOD_H4);
例 16390:return(PERIOD_H6);
case 16392: return(PERIOD_H8);
case 16396: return(PERIOD_H12);
case 16408: return(PERIOD_D1);
case 32769: return(PERIOD_W1);
case 49153: return(PERIOD_MN1);
默认值: return(PERIOD_CURRENT);
}
}
...