//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара закрытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(iBarShift(sy, tf, t, True)); }
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара закрытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(iBarShift(sy, tf, t, True)); }
int start() { int n=25; int w=18; double sum_x=0; // Сумма цен закрытия для пары 1 double sum_y=0; // Сумма цен закрытия для пары 2 double Price_Close_x[]; // Массив Price_Close для пары 1 double Price_Close_y[]; // Массив Price_Close для пары 2 double dx[]; // Отклонение от среднего значения для пары 1 dx double dy[]; // Отклонение от среднего значения для пары 2 dy double dx2[]; // Квадрат отклонения ср.значения dx2 double dy2[]; // Квадрат отклонения ср.значения dy2 double dxdy[]; // Произведение dx и dy
Alert("Sum_x равно ", sum_x); Alert("Sum_y равно ", sum_y); double Mx=sum_x/(n-1); // Среднее значение цен закрытия пары 1 Mx double My=sum_y/(n-1); // Среднее значение цен закрытия пары 2 My Alert("Mx равно ", Mx); Alert("My равно ", My);
for(int i=1; i<n; i++) { dx[i]=Price_Close_x[i]-Mx; dy[i]=Price_Close_y[i]-My; dx2[i]=DoubleToString(dx[i]*dx[i], w); dy2[i]=DoubleToString(dy[i]*dy[i], w); dxdy[i]=DoubleToString(dx[i]*dy[i], w); Alert("Отклонение dx на баре ", i, " равно ", DoubleToString(dx[i], w)); Alert("Отклонение dy на баре ", i, " равно ", DoubleToString(dy[i], w)); Alert("Квадрат dx на баре ", i, " равен ", DoubleToString(dx2[i], w)); Alert("Квадрат dy на баре ", i, " равен ", DoubleToString(dy2[i], w)); Alert("dxdy на баре ", i, " равен ", DoubleToString(dxdy[i], w)); } double Edx2=0; // Сумма квадратов отклонений Edx2 double Edy2=0; // Сумма квадратов отклонений Edy2 double Edxdy=0; // Сумма произведений отклонений Edxdy for(int q=0; q<n; q++) { Edx2=DoubleToString((Edx2+dx2[q]), w); Edy2=DoubleToString((Edy2+dy2[q]), w); Edxdy=DoubleToString((Edxdy+dxdy[q]), w); } Alert("Сумма Edx2 равна ", DoubleToString(Edx2, w)); Alert("Сумма Edy2 равна ", DoubleToString(Edy2, w)); Alert("Сумма Edxdy равна ", DoubleToString(Edxdy, w));
//---- indicator line SetIndexStyle(0,DRAW_LINE); //---- //---- name for DataWindow and indicator subwindow label // short_name="RSI("+IntegerToString(RSIPeriod)+")"; short_name="RSI("+RSIPeriod+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name);
return(0); } //+------------------------------------------------------------------+ //| Relative Strength Index | //+------------------------------------------------------------------+ int start() { int i,counted_bars=IndicatorCounted(); double rel,negative,positive,sma,x,y,Pos,Neg; double sumn=0.0,sump=0.0; //---- if(Bars<=RSIPeriod) return(0); if(TF!=0) { string name=WindowExpertName(); for(i=0; i<Bars-counted_bars+1; i++) { int barIndex=iBarShift(NULL,TF,Time[i],false); MABuffer[i]=iCustom(Symbol(),TF,name,RSIPeriod,Levl,0,0,barIndex); } return(0); }
//+----------------------------------------------------------------------------+ //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает номер бара закрытия последней позиции или -1. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция ( -1 - любая позиция) | //| mn - MagicNumber ( -1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(iBarShift(sy, tf, t, True)); }
其逻辑是这样的。
请原谅我的无礼)我可以在哪里看到这个代码的例子吗?
这很简单。
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
对不起,也许我说错了。
对这个 指标进行冥想。它有大量的静态变量。
static int cDir=0;
static int pDir=0;
它们是代替缓冲器制成的。
当IndicatorCounted()=0时,LastTime应该被清零(其他的不是必须的,但最好是)。
然后在循环的开始,移动这些数值。
{
LastTime=Time[i];
pDir=cDir;
}
else
{
cDir=pDir;
}
以 "c "开头的变量是当前值,以 "p "开头的变量是先前值。
这个链接打不开--404错误。
我试着用时间做实验,但没有成功......。我想的方向是 "如何在最后一小节停止计算",我想这是我的错误。我现在要考虑的是,在改变当前栏位之前,如何不对计算的最后一步进行改变。
这很简单。
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
对不起,也许我说错了。
你好!请帮我解答一下算法的问题。
我写了一个简单的脚本,用来计算皮尔逊的相关系数。这些数组是基于收盘价,从第一条开始。
{
int n=25;
int w=18;
double sum_x=0; // Сумма цен закрытия для пары 1
double sum_y=0; // Сумма цен закрытия для пары 2
double Price_Close_x[]; // Массив Price_Close для пары 1
double Price_Close_y[]; // Массив Price_Close для пары 2
double dx[]; // Отклонение от среднего значения для пары 1 dx
double dy[]; // Отклонение от среднего значения для пары 2 dy
double dx2[]; // Квадрат отклонения ср.значения dx2
double dy2[]; // Квадрат отклонения ср.значения dy2
double dxdy[]; // Произведение dx и dy
ArrayResize(Price_Close_x, n);
ArrayResize(Price_Close_y, n);
ArrayResize(dx, n);
ArrayResize(dy, n);
ArrayResize(dx2, n);
ArrayResize(dy2, n);
ArrayResize(dxdy, n);
string sym_x="EURUSD";
string sym_y="GBPUSD";
for(int p=1; p<n; p++)
{
Price_Close_x[p]=iClose(sym_x, PERIOD_H1, p);
Price_Close_y[p]=iClose(sym_y, PERIOD_H1, p);
sum_x=sum_x+Price_Close_x[p];
sum_y=sum_y+Price_Close_y[p];
}
Alert("Sum_x равно ", sum_x);
Alert("Sum_y равно ", sum_y);
double Mx=sum_x/(n-1); // Среднее значение цен закрытия пары 1 Mx
double My=sum_y/(n-1); // Среднее значение цен закрытия пары 2 My
Alert("Mx равно ", Mx);
Alert("My равно ", My);
for(int i=1; i<n; i++)
{
dx[i]=Price_Close_x[i]-Mx;
dy[i]=Price_Close_y[i]-My;
dx2[i]=DoubleToString(dx[i]*dx[i], w);
dy2[i]=DoubleToString(dy[i]*dy[i], w);
dxdy[i]=DoubleToString(dx[i]*dy[i], w);
Alert("Отклонение dx на баре ", i, " равно ", DoubleToString(dx[i], w));
Alert("Отклонение dy на баре ", i, " равно ", DoubleToString(dy[i], w));
Alert("Квадрат dx на баре ", i, " равен ", DoubleToString(dx2[i], w));
Alert("Квадрат dy на баре ", i, " равен ", DoubleToString(dy2[i], w));
Alert("dxdy на баре ", i, " равен ", DoubleToString(dxdy[i], w));
}
double Edx2=0; // Сумма квадратов отклонений Edx2
double Edy2=0; // Сумма квадратов отклонений Edy2
double Edxdy=0; // Сумма произведений отклонений Edxdy
for(int q=0; q<n; q++)
{
Edx2=DoubleToString((Edx2+dx2[q]), w);
Edy2=DoubleToString((Edy2+dy2[q]), w);
Edxdy=DoubleToString((Edxdy+dxdy[q]), w);
}
Alert("Сумма Edx2 равна ", DoubleToString(Edx2, w));
Alert("Сумма Edy2 равна ", DoubleToString(Edy2, w));
Alert("Сумма Edxdy равна ", DoubleToString(Edxdy, w));
double Koef; // Коэффициент Пирсона
Koef=Edxdy/(sqrt(DoubleToString((Edx2*Edy2), w)));
Alert("Коэффициент корреляции Пирсона между ", sym_x, " и ", sym_y, " равен ", DoubleToString(Koef, w));
return;
}
价格数组从第一条到第24条取值。
现在我也想计算24个柱子的相关性,但要从第二(!)个柱子的价格数组。
由于不知道这个算法,我手动输入了每个价格阵列。
{
Price_Close_x[p]=iClose(sym_x, PERIOD_H1, p);
Price_Close_y[p]=iClose(sym_y, PERIOD_H1, p);
sum_x=sum_x+Price_Close_x[p];
sum_y=sum_y+Price_Close_y[p];
Price_Close_x1[p]=iClose(sym_x, PERIOD_H1, p+1);
Price_Close_y1[p]=iClose(sym_y, PERIOD_H1, p+1);
Price_Close_x2[p]=iClose(sym_x, PERIOD_H1, p+2);
Price_Close_y2[p]=iClose(sym_y, PERIOD_H1, p+2);
Price_Close_x3[p]=iClose(sym_x, PERIOD_H1, p+3);
Price_Close_y3[p]=iClose(sym_y, PERIOD_H1, p+3);
...
...
Price_Close_x24[p]=iClose(sym_x, PERIOD_H1, p+24);
Price_Close_y24[p]=iClose(sym_y, PERIOD_H1, p+24);
}
24个条形图是一个拖累,如果我想知道100个条形图的相关性,输入每个数组是一个痛苦的过程。
该怎么做呢,人们?)
你好!你能不能在算法上帮助我!?
for(int p=1; p<n; p++)我写了一个计算皮尔逊相关系数的脚本。我按收盘价提取数组,从第一条开始
for(int p=1; p<n; p++)
{
Price_Close_x[p]=iClose(sym_x, PERIOD_H1, p)。
Price_Close_y[p]=iClose(sym_y, PERIOD_H1, p)。
sum_x=sum_x+Price_Close_x[p]。
sum_y=sum_y+Price_Close_y[p]。
Price_Close_x1[p]=iClose(sym_x, PERIOD_H1, p+1)。
Price_Close_y1[p]=iClose(sym_y, PERIOD_H1, p+1)。
Price_Close_x2[p]=iClose(sym_x, PERIOD_H1, p+2)。
Price_Close_y2[p]=iClose(sym_y, PERIOD_H1, p+2)。
Price_Close_x3[p]=iClose(sym_x, PERIOD_H1, p+3)。
Price_Close_y3[p]=iClose(sym_y, PERIOD_H1, p+3)。
...
Price_Close_x24[p]=iClose(sym_x, PERIOD_H1, p+24)。
Price_Close_y24[p]=iClose(sym_y, PERIOD_H1, p+24)。
}
____________________________________________________________________________
二维阵列
PriceClose[][2]。
int n=24;
ArrayResize(PriceClose,n);
for(int p=0; p<n; p++) {
PriceClose[p][0]=iClose(sym_x, PERIOD_H1, p);
PriceClose[p][1]=iClose(sym_y, PERIOD_H1, p);
sum_x+=PriceClose[p][0];
sum_y+=PriceClose[p][1];
}
我不知道我哪里做错了......
//| SVA_03.mq4 |
//| Copyright © 2006, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow
//---- input parameters
extern int RSIPeriod=14;
extern int Levl=50;
extern int TF=0;
//---- buffers
double MABuffer[];
static datetime TimeN=0;
static datetime TimeX=0;
int StopCalc=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
IndicatorBuffers(1);
SetIndexBuffer(0,MABuffer);
//---- indicator line
SetIndexStyle(0,DRAW_LINE);
//----
//---- name for DataWindow and indicator subwindow label
// short_name="RSI("+IntegerToString(RSIPeriod)+")";
short_name="RSI("+RSIPeriod+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
return(0);
}
//+------------------------------------------------------------------+
//| Relative Strength Index |
//+------------------------------------------------------------------+
int start()
{
int i,counted_bars=IndicatorCounted();
double rel,negative,positive,sma,x,y,Pos,Neg;
double sumn=0.0,sump=0.0;
//----
if(Bars<=RSIPeriod) return(0);
if(TF!=0)
{
string name=WindowExpertName();
for(i=0; i<Bars-counted_bars+1; i++)
{
int barIndex=iBarShift(NULL,TF,Time[i],false);
MABuffer[i]=iCustom(Symbol(),TF,name,RSIPeriod,Levl,0,0,barIndex);
}
return(0);
}
i=Bars-RSIPeriod-1;
if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
datetime TimeC=iTime(NULL,TF,0);
while(i>=0)
{
if(i!=0 && StopCalc==0)
{
sumn=0.0;sump=0.0;
if(i==Bars-RSIPeriod-1)
{
int k=Bars-2;
//---- initial accumulation
while(k>=i)
{
rel=Close[k]-Close[k+1];
if(rel>0) sump+=rel;
else sumn-=rel;
k--;
}
positive=sump/RSIPeriod;
negative=sumn/RSIPeriod;
}
else
{
//---- smoothed moving average
rel=Close[i]-Close[i+1];
if(rel>0) sump=rel;
else sumn=-rel;
positive=(Pos*(RSIPeriod-1)+sump)/RSIPeriod;
negative=(Neg*(RSIPeriod-1)+sumn)/RSIPeriod;
}
x=Pos;
y=Neg;
Pos=positive;
Neg=negative;
if(x>0)sma=Close[i+1]+x;
else sma=Close[i+1]-y;
MABuffer[i]=sma;
Print("Этап 01 i=",i);
}
if(i==0)
{
if(TimeC!=TimeX)
{
rel=Close[i+1]-Close[i+2];
if(rel>0) sump=rel;
else sumn=-rel;
positive=(Pos*(RSIPeriod-1)+sump)/RSIPeriod;
negative=(Neg*(RSIPeriod-1)+sumn)/RSIPeriod;
x=Pos;
y=Neg;
Pos=positive;
Neg=negative;
Print("positive=",positive);
Print("negative=",negative);
if(x>0)sma=Close[i+1]+x;
else sma=Close[i+1]-y;
MABuffer[i]=sma;
Print("Этап 2 i=",i);
TimeX=iTime(NULL,TF,0);
StopCalc=1;
}
}
i--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
结果与选项4不同 - 怎么了?
链接无法打开 - 404错误
试着用时间进行实验,但没有成功......。我想的方向是 "如何在最后一小节停止计算",我想这是我的错误。我现在要考虑的是,在改变当前栏位之前,如何不对计算的最后一步进行改变。
你怎么这么重,还不转轴?你已经得到了一个解决方案,你所要做的就是坐下来思考。当然,结论是没有言语的--你看到了 "时间 "这个词,并立即断定是你干的......。
你不需要链接,否则你会迷失方向。 你所需要的一切都在这个帖子中描述了,让我详细地重复一下。
1.声明一个静态变量 LastTime。
2. 声明一对静态变量,前缀为s和p。
3.当IndicatorCounted()=0时,在步骤1和2创建的所有变量为空。
4.在周期开始时,重置数值。
{
LastTime=Time[i];
pDir=cDir;
}
else
{
cDir=pDir;
}
为什么你这么重口味而不举足轻重?你已经得到了一个决定,你所要做的就是坐下来思考。当然,结论是,好吧,没有什么话--时间这个词看到了,并立即得出结论,你做到了......
你不需要链接,否则你会迷失方向。 你需要的一切都写在这个帖子里,让我详细地重复一下。
1.声明一个静态变量 LastTime。
2. 声明一对静态变量,前缀为s和p。
3.当IndicatorCounted()=0时,在步骤1和2创建的所有变量为空。
4.在循环开始时重置这些值。
{
LastTime=Time[i];
pDir=cDir;
}
else
{
cDir=pDir;
}
谢谢你想帮忙!
我在写指标方面没有什么经验,所以有一些困难--我正在寻找的解决方案--正如我上面的最后一段代码所证明的。
你建议的变体造成了困难,因为我无法理解哪些变量要归零--尽管想法很清楚--保留最初的计算值。
如果你能解释一下为什么我的变体不起作用--我也把计算限制在每个柱状图的一个刻度上,而且变量不应改变,预计这个变体的成本较低,因为循环不会在每个刻度上空转,不像你提出的变体。
其逻辑是这样的。
我在这里有以下细微差别:我把这个代码(感谢Alekseu Fedotov)。
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
现在我开了一张支票。
这里有一个问题,因为最初NumberOfBarCloseLastPos将被设置为"-1"。因此,第一笔订单将永远不会打开。
在这种情况下,我们能做什么?或者,也许我误解了什么?