编码帮助......我如何让指标过滤而不是警报? - 页 3

 
elihayun:
我认为最好的方法是不使用指标。这只是最简单的方法。作为一个开始,这已经很好了。

你所看到的是我对该指标所做的修改。如果你想使用这个指标,请确保在你的代码中写上正确的名称。

只要你知道你想要的信息在哪个缓冲区,代码里有多少个指标都无所谓。

好吧,你是说最简单的不一定是最好的......更好的方法是把指标写在EA里面......但要做到这一点,按照课程的例子,它说要复制到EA的唯一部分是迭代函数 部分,而缓冲区是在代码的初始化函数部分......那么我是否要把整个指标代码复制到EA中?我怎么做才是最好的呢......在EA中的指标?你能告诉我吗?我想我正在学习。 我喜欢它!

 
Aaragorn:
好吧,你是说最简单的不一定是最好的......更好的方法是把指标写在EA里面......但要做到这一点,按照课程的例子,它说要复制到EA的唯一部分是迭代函数部分,而缓冲区是在代码的初始化函数部分......那么我是否要把整个指标代码复制到EA中?我怎么做才是最好的呢......在EA中的指标?你能告诉我吗?

当然不是。只是逻辑部分。事实上,我有一个例子,就是这样做的(我想自己写,但我现在正在研究一个新的看价格的方法,它占用了我所有的时间)。

你可以在这里找到它。(它不是很好,需要时间来解决,但你可以看到如何将代码结合在一起。)

在这个EA中,你可以设置你想同时到达边缘的TF,或者只使用一个TF。

附加的文件:
ytt2_ea.mq4  6 kb
 
elihayun:
很好!!!。你有这个想法!!!!

如果你想检查5M和15M是否同时到达边缘,你可以从每个TF中获取数值并一起测试。

但这要留待以后....

我有一个好老师。

现在我有了 "那个 "想法,请告诉我剩下的方法,以 "最好 "的方式做这件事,并在EA内编写指标。我已经在某种程度上做了....,但我没有把缓冲区复制到EA中......我想这必须要插入,嗯?

在EA中究竟要复制多少东西?

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

//| Custom indicator initialization function |

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

#property indicator_chart_window

#property indicator_buffers 5

#property indicator_color1 Red

#property indicator_color2 Black

#property indicator_color3 Blue

#property indicator_color4 Red

#property indicator_color5 Blue

double upper[], middle1[], middle2, lower[];

double Xup[], Xdown[];

extern int period = 34;

int init()

{

SetIndexStyle(0,DRAW_LINE,EMPTY,2);

SetIndexShift(0,0);

SetIndexDrawBegin(0,0);

SetIndexBuffer(0,upper);

SetIndexStyle(1,DRAW_LINE,EMPTY,2);

SetIndexShift(1,0);

SetIndexDrawBegin(1,0);

SetIndexBuffer(1,middle1);

SetIndexStyle(2,DRAW_LINE,EMPTY,2);

SetIndexShift(2,0);

SetIndexDrawBegin(2,0);

SetIndexBuffer(2,lower);

SetIndexStyle(3,DRAW_ARROW,EMPTY,2);

SetIndexArrow(3, 162);

SetIndexShift(3,0);

SetIndexDrawBegin(3,0);

SetIndexBuffer(3,Xdown);

SetIndexStyle(4,DRAW_ARROW,EMPTY,2);

SetIndexArrow(4, 162);

SetIndexShift(4,0);

SetIndexDrawBegin(4,0);

SetIndexBuffer(4,Xup);

//---- indicators

//----

return(0);

}

也许我现在应该按照你展示的方式做,并调用指标....,这样更简单。

 
Aaragorn:
我有一个好老师。

现在我有了 "那个 "想法,请教我剩下的方法,以 "最好 "的方式做这件事,并在EA内编写指标。我已经在某种程度上做了....,但我没有把缓冲区复制到EA中......猜想这必须要插入,嗯?

这其中有多少是需要在EA中复制的?

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

//| Custom indicator initialization function |

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

.......

//---- indicators

//----

return(0);

}
也许我现在应该按照你展示的方式来做,把指标称为....,这样比较简单。

没有。这不是逻辑,这是该指标的视觉部分

 

这将需要两篇文章来展示我目前所做的全部事情....site不会一次接受全部内容......不要让我用信息覆盖你......我只想向你展示我到目前为止所做的事情。

前半部分...

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

//| EMA_CROSS_2.mq4 |

//| Coders Guru |

//| https://www.forex-tsd.com |

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

// ultima versiune cu micro lots! H1 si D1

#property copyright "Coders Guru"

#property link "https://www.forex-tsd.com"

//---- Trades limits

extern double

TakeProfit = 10,

TrailingStop = 20,

StopLoss = 20;

extern bool

UseStopLoss = false;

//---- EMAs paris

extern int

ShortEma = 1,

LongEma = 5;

//---- Crossing options

extern bool

immediate_trade = true, //Open trades immediately or wait for cross.

reversal = false, //Use the originally reversal crossing method or not

ConfirmedOnEntry = false;

//---- Money Management

extern double

Lots = 1,

HedgePercent = 1; // Used to calcualte the what percent of the lots the user wants to be

// used in the hedged position

extern bool

MM = true, //Use Money Management or not

AccountIsMicro = true; //Use Micro-Account or not

extern int

StartHour = 0, //Indicates when the user wants the EA to start trading

StopHour = 23; //Indicates when the user wants the EA to stop trading

extern int

Risk = 10; //10%

extern int

MAGICMA = 20060301;

extern bool

Show_Settings = true;

//---- Global varaibles

static int

TimeFrame = 0;

datetime

CheckValueTime;

//---- Trend bands

double upper[], middle1[], middle2, lower[];

double Xup[], Xdown[];

extern int period = 34;

//---- Filter Parameters

extern double longrange = 25;

extern double shortrange = 20;

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

//| expert initialization function |

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

int init()

{

if(Show_Settings) Print_Details();

else Comment("");

return(0);

}

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

//| expert deinitialization function |

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

int deinit()

{

TimeFrame=Period(); //Prevent counting the cross while the user changing the timeframe

return(0);

}

bool isNewSumbol(string current_symbol)

{

//loop through all the opened order and compare the symbols

int total = OrdersTotal();

for(int cnt = 0 ; cnt < total ; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

string selected_symbol = OrderSymbol();

if (current_symbol == selected_symbol)

return (False);

}

return (True);

}

int Crossed (double line1 , double line2)

{

static int last_direction = 0;

static int current_direction = 0;

if(TimeFrame!=Period())

{

TimeFrame=Period();

return (0);

}

if(line1>line2)current_direction = 1; //up

if(line1<line2)current_direction = 2; //down

if(immediate_trade==false)

{

if(last_direction == 0) //first use

{

last_direction = current_direction;

return(0);

}

}

if(current_direction != last_direction) //changed

{

last_direction = current_direction;

return (last_direction);

}

else

{

return (0); //not changed

}

}

//--- Bassed on Alex idea! More ideas are coming

double LotSize()

{

double lotMM = MathCeil(AccountFreeMargin() * Risk / 1000) / 100;

if(AccountIsMicro==false) //normal account

{

if (lotMM < 0.1) lotMM = Lots;

if ((lotMM > 0.5) && (lotMM < 1)) lotMM=0.5;

if (lotMM > 1.0) lotMM = MathCeil(lotMM);

if (lotMM > 100) lotMM = 100;

}

else //micro account

{

if (lotMM < 0.01) lotMM = Lots;

if (lotMM > 1.0) lotMM = MathCeil(lotMM);

if (lotMM > 100) lotMM = 100;

}

return (lotMM);

}

string BoolToStr ( bool value)

{

if(value) return ("True");

else return ("False");

}

void Print_Details()

{

string sComment = "";

string sp = "----------------------------------------\n";

string NL = "\n";

sComment = sp;

sComment = sComment + "TakeProfit=" + DoubleToStr(TakeProfit,0) + " | ";

sComment = sComment + "TrailingStop=" + DoubleToStr(TrailingStop,0) + " | ";

sComment = sComment + "StopLoss=" + DoubleToStr(StopLoss,0) + " | ";

sComment = sComment + "UseStopLoss=" + BoolToStr(UseStopLoss) + NL;

sComment = sComment + sp;

sComment = sComment + "immediate_trade=" + BoolToStr(immediate_trade) + " | ";

sComment = sComment + "reversal=" + BoolToStr(reversal) + NL;

sComment = sComment + sp;

sComment = sComment + "Lots=" + DoubleToStr(Lots,0) + " | ";

sComment = sComment + "MM=" + BoolToStr(MM) + " | ";

sComment = sComment + "Risk=" + DoubleToStr(Risk,0) + "%" + NL;

sComment = sComment + sp;

Comment(sComment);

}

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

//| expert start function |

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

 

下半场...

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

//| expert start function |

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

int start() {

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

//| Custom indicator iteration function |

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

int limit;

int counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

double avg;

for(int x=0; x<limit; x++) {

Xdown[x] = 0; Xup[x] = 0;

middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line

middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

upper[x] = middle2 + (3.5*avg);

lower[x] = middle2 - (3.5*avg);

if (MathAbs(upper[x] - High[x]) < 2*Point)

{

Xdown[x] = upper[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower[x] - Low[x]) < 2*Point)

{

Xup[x] = lower[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach lower edge");

}

}

return(0);

}

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

double findAvg(int period, int shift) {

double sum=0;

for (int x=shift;x<(shift+period);x++) {

sum += High[x]-Low[x];

}

sum = sum/period;

return (sum);

}

bool NewBar()

{

static datetime dt = 0;

if (dt != Time[0])

{

dt = Time[0];

return(true);

}

return(false);

//end of trend bands custom indicator

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

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

{

if(Hour() >= StartHour && Hour() <= StopHour){ //Nothing will happen unless the time is within the trading time

int cnt, ticket, total;

double SEma, LEma, SEmaLAST, LEmaLAST;

string comment = "";

if(reversal==true) comment = "EMA_CROSS_Counter-Trend";

if(reversal==false) comment = "EMA_CROSS_Trend-Following";

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(TakeProfit<1)

{

Print("TakeProfit less than 1");

return(0); // check TakeProfit

}

static int isCrossed = 0;

if(ConfirmedOnEntry)

{

if(CheckValueTime==iTime(NULL,TimeFrame,0)) return(0); else CheckValueTime = iTime(NULL,TimeFrame,0);

SEma = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEma = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,1);

SEmaLAST = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEmaLAST = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,2);

if(SEmaLASTLEma) isCrossed = 1;

if(SEmaLAST>LEmaLAST && SEma<LEma) isCrossed = 2;

}

else

{

SEma = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0);

LEma = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,0);

isCrossed = Crossed (LEma,SEma);

}

if(reversal==false)

{

if(isCrossed==1) isCrossed = 2;

else if(isCrossed==2) isCrossed = 1;

}

if(MM==true) Lots = LotSize(); //Adjust the lot size

total = OrdersTotal();

// TRAILING STOP

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())

{

if(OrderType()==OP_BUY) // long position is opened

{

// check for trailing stop

if(TrailingStop>0)

{

if(Bid-OrderOpenPrice()>Point*TrailingStop)

{

if(OrderStopLoss()<Bid-Point*TrailingStop)

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}

else // go to short position

{

// check for trailing stop

if(TrailingStop>0)

{

if((OrderOpenPrice()-Ask)>(Point*TrailingStop))

{

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

}

}

// ENTRY

if(total < 2 || isNewSumbol(Symbol())) //I have modified the if condition too: it was total<1 (orBanAway aka cucurucu)

{

double HedgeLots = (HedgePercent/100)*Lots; //calculates the Lots for the hedged position

if(isCrossed == 1 && Point < toplinevalue-longrange)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

//###################################################################### the added code starts here

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

else

ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

//###################################################################### ends here

return(0);

}

if(isCrossed == 2)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

else

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

//###################################################################### the added code starts here

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

//###################################################################### ends here

return(0);

}

return(0);

}

return(0);

}

return(0);

}

}

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

现在当我走到这一行时...

if(isCrossed == 1 && Point < toplinevalue-longgrange)

这就是我想把指标的值放在当前条形图上的地方......

我如何从上面的代码中调出当前条形的信息,因为它已经在EA中了?事实上,在你告诉我如何用icustom()调用指标之前,我昨天已经做了很多。在我撤销所有我已经做的事情之前,我想知道是否可以按原样完成,并且比撤销所有的事情然后让它调用指标效果更好?

 

正如我所说的,你不必处理历史,你只是为了得到最后一个值而填充整个缓冲区。

for(int x=0; x<limit; x++) {

Xdown[x] = 0; Xup[x] = 0;

middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line

middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

upper[x] = middle2 + (3.5*avg);

lower[x] = middle2 - (3.5*avg);

if (MathAbs(upper[x] - High[x]) < 2*Point)

{

Xdown[x] = upper[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower[x] - Low[x]) < 2*Point)

{

Xup[x] = lower[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach lower edge");

}

}

[/PHP]

Why not just calculate the last bar

[PHP]

int x = 0;

//Xdown[x] = 0; Xup[x] = 0;

//

// we are not using middle line

//middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line

double middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg);

if (MathAbs(upper - High) < 2*Point)

{

// no need just alert (or open a trade)

//Xdown[x] = upper[x];

if (NewBar())

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower - Low) < 2*Point)

{

//Xup[x] = lower[x];

if (NewBar()) // I remove " && x == 0" because we know that x == 0

Alert(Symbol()," ",Period()," reach lower edge");

}

}

 
int x = 0;

double middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg); [/php]

ok that makes sense, I don't need the whole array just the current bar, so this (above code) is all that is required to calculate the top and bottom lines that needs to be in the EA?

this part (code below) confused me. I don't get the logic of it..I know it's sending alerts when the line is crossed but that's not what I need to use this for. I don't understand how it works to make the Xdown = upper , nor do I understand the logic of upper - high <2*point . To me it is a mass of confusion.

all I need to do with the top and bottom lines is know where they are in the current bar so I can determine how close to allow the point to approach them before it disallows the trade? that is the logic I want to create with the right code. I don't need alerts. Also I have not been able to find 'newbar()' in the metaeditor dictionary and the search function in metaeditor isn't working for me it's not responsive.

[php] if (MathAbs(upper - High) < 2*Point)

{

// no need just alert (or open a trade)

//Xdown[x] = upper[x];

if (NewBar())

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower - Low) < 2*Point)

{

//Xup[x] = lower[x];

if (NewBar()) // I remove " && x == 0" because we know that x == 0

Alert(Symbol()," ",Period()," reach lower edge");

}

}

我一直在看MEdictionary,我看到一个 "bool IsTradeAllowed( )",如果它太近,我是否可以用它来限制交易的开启?

 

如果你想知道上线 是否接近价格,一个方法是如果它们之间的差异很小(比方说2点)。

我不关心(这不是一个好主意)价格是否在线下或线上。对我来说,2个点的距离就够了。因此,差异是

上方 - 高方会 给你差值,但不是以点为单位(它是像0.0004或-0.0004)。为了确保差值是正的,我们使用了MathAbs 函数,它返回绝对值(正)。现在我们必须检查它是否小于2点。当价格上升1点时,保留字Point 将返回该值。每个货币对都是不同的。

把它放在一起

如果(MathAbs(upper - High)< 2*Point) 意味着差异小于2点,对我们来说已经很接近了。

事实上,使用High并不好,因为High可能在上面,但当前的价格却很远。我们必须使用Ask 而不是High(在指标中我们必须使用Close[x])。

为了确保价格在该线之上,我们可以这样做

if ((Ask > upper) && (Ask - upper < 2 * Point))

.....(alert or open a trade)

 

我把它归结为这样......但是等等......。

如果这只是用这一栏的简单移动平均线 乘以3.5来寻找一个高点。这个点怎么可能达到呢?线值不是从必须触及它才能发出信号的同一个柱子计算出来的吗?随着条形图的上升,边缘线也会上升。

//----------channel filter

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, 0);// only used to calculate outer bands

double avg;

avg = findAvg(back, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg);