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
我认为最好的方法是不使用指标。这只是最简单的方法。作为一个开始,这已经很好了。
你所看到的是我对该指标所做的修改。如果你想使用这个指标,请确保在你的代码中写上正确的名称。
只要你知道你想要的信息在哪个缓冲区,代码里有多少个指标都无所谓。好吧,你是说最简单的不一定是最好的......更好的方法是把指标写在EA里面......但要做到这一点,按照课程的例子,它说要复制到EA的唯一部分是迭代函数 部分,而缓冲区是在代码的初始化函数部分......那么我是否要把整个指标代码复制到EA中?我怎么做才是最好的呢......在EA中的指标?你能告诉我吗?我想我正在学习。 我喜欢它!
好吧,你是说最简单的不一定是最好的......更好的方法是把指标写在EA里面......但要做到这一点,按照课程的例子,它说要复制到EA的唯一部分是迭代函数部分,而缓冲区是在代码的初始化函数部分......那么我是否要把整个指标代码复制到EA中?我怎么做才是最好的呢......在EA中的指标?你能告诉我吗?
当然不是。只是逻辑部分。事实上,我有一个例子,就是这样做的(我想自己写,但我现在正在研究一个新的看价格的方法,它占用了我所有的时间)。
你可以在这里找到它。(它不是很好,需要时间来解决,但你可以看到如何将代码结合在一起。)
在这个EA中,你可以设置你想同时到达边缘的TF,或者只使用一个TF。
很好!!!。你有这个想法!!!!
如果你想检查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);
}也许我现在应该按照你展示的方式做,并调用指标....,这样更简单。
我有一个好老师。
现在我有了 "那个 "想法,请教我剩下的方法,以 "最好 "的方式做这件事,并在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()调用指标之前,我昨天已经做了很多。在我撤销所有我已经做的事情之前,我想知道是否可以按原样完成,并且比撤销所有的事情然后让它调用指标效果更好?
正如我所说的,你不必处理历史,你只是为了得到最后一个值而填充整个缓冲区。
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");
}
}
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来寻找一个高点。这个点怎么可能达到呢?线值不是从必须触及它才能发出信号的同一个柱子计算出来的吗?随着条形图的上升,边缘线也会上升。
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);