如何编码? - 页 299

 

在MQL4的自定义时间输入

是否可以用MQL4写一段代码,从用户定义的条形图开始画一条水平线,直到图表的结束。

下面是使用Metastock的相同代码

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

这里是结果

我希望能用MQL4做同样的事情。

 

试着这样做。

#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}

只要把它复制并粘贴到一些指标上(这是一个已经工作的指标),并把它附加到图表上。

kappari:
有没有可能用MQL4写一段代码,从用户定义的条形图开始画一条水平线,直到图表的结束。

以下是使用Metastock的相同代码

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

这里是结果

我希望能用MQL4做同样的事情。
 
mladen:
试着像这样。
#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}
把它复制并粘贴到某个指标上(它是一个已经工作的指标),然后把它附在图表上。

你是最棒的,谢谢你,mladen

 

嗨,Mladen。

你能告诉我更多关于这里的函数 的原理吗?我还是不大明白。谢谢

Terrance

mladen:
试试这个函数:
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
然后你可以检查
:if openedBuys==0 open buy if

openedSells==0 open sell

 

tkuan77

你想把订单限制在每次1次买入和1次卖出。

因此,如果你在开仓前调用已开订单计数器,你可以控制 你有多少已开的买入或卖出。

一个例子:

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order

如果openBuys的值不是0,就不能开新的买单。同样的逻辑也适用于卖出(这是该帖子中的第二个例子)。

tkuan77:
嗨,Mladen。

你能告诉我更多关于这里的函数的原理吗?我还是不大明白。谢谢

特伦斯
 

嗨,姆拉登。

也许我的表述有误。我想达到的目的是,当我的买入标准得到满足时,它将触发买入,如果再次满足另一个买入标准,它将触发另一个买入或卖出,如果卖出标准得到满足。然而,我在任何时间点上的最大交易量将是2。

我之前尝试过你的方法,我仍然遇到了系统同时开启2笔交易的情况,这就是为什么我尝试用Bars功能 来限制它,但同样的问题是EA同时开启2笔交易。

这里可能的原因是什么?是否与我的逻辑有关?

谢谢

特伦斯

mladen:
tkuan77

你想把订单限制在一次买入和卖出1次。

因此,如果你在开仓前调用已开订单计数器,你可以控制你有多少个已开的买入或卖出。

一个例子:

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order
如果openBuys uis任何东西而不是0,你就不会打开一个新的买单。同样的逻辑也适用于卖出(这是该帖子的第二个例子)。
 

你可以增加检查某种类型的订单是否已经在当前栏中打开,这样你就可以防止在下一个刻度上打开新的订单。如果是(在当前栏位上有一个订单),那么就不能开新的订单。如果没有,你可以开一个新的订单。这里有一个函数,可以计算出在当前条形图上开出的重复类型的订单。

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

tkuan77:
你好,姆拉登。

也许我的表述有误。我想实现的是,当我的买入标准被满足时,它将触发买入,如果再次满足另一个买入标准,它将触发另一个买入或卖出,如果卖出标准被满足。然而,我在任何时间点上的最大交易量将是2。

我之前尝试过你的方法,我仍然遇到了系统同时开启2笔交易的情况,这就是为什么我尝试用Bars功能来限制它,但同样的问题是EA同时开启2笔交易。

这里可能的原因是什么?是否与我的逻辑有关?

答复

特伦斯
 
tkuan77:
嗨,Mladen。

也许我可能误解了自己。我想达到的目的是,当我的买入标准被满足时,它将触发买入,如果再次满足另一个买入标准,它将触发另一个买入或卖出,如果卖出标准被满足。然而,我在任何时间点上的最大交易量将是2。

我之前尝试过你的方法,我仍然遇到了系统同时开启2笔交易的情况,这就是为什么我尝试用Bars功能来限制它,但同样的问题是EA同时开启2笔交易。

这里可能的原因是什么?是否与我的逻辑有关?

请注意

Terrance

这是因为你没有说明你希望第二笔交易与第一笔交易有什么不同。区别的形式可以是X条数或价格远离第一买入价。

 

谢谢Mladen的帮助,但是我只想和你确认一下,我是把代码放在我的多头/空头功能之前,还是放在中间,还是放在其他地方?因为它似乎一直在跳出错误,我似乎找不到它的来源。还有,MagicNumber是不是应该是一个整数?

Terrance

total = OrdersTotal();

如果(total < 2)

{

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

如果(OrderMagicNumber() != MagicNumber)继续。

如果(OrderSymbol() != Symbol()) 继续。

如果(OrderType() != type) 继续。

如果(OrderOpenTime()=endTime)继续。

openedAtBar++;

break;

}

return(openAtBar);

}

如果(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point, Ask+TakeProfit*Point,

"My EA",12345,0,Green)。

如果(ticket>0)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

否则 Print("打开BUY订单错误。",GetLastError())。

return(0);

}

如果(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point, Bid-TakeProfit*Point,

"My EA",12345,0,Red)。

如果(ticket>0)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Sell order opened : ",OrderOpenPrice());

}

否则 Print("打开卖出订单错误。",GetLastError())。

return(0);

}

return(0);

}

mladen:
你可以增加检查某种类型的订单是否已经在当前的条形图上打开,这样你就可以防止在下一个tick上打开一个新的订单。如果是(在当前栏位上有一个订单),那么就不能开新的订单。如果没有,你可以开一个新的订单。这里有一个函数,可以计算出在当前条形图上打开的重复类型的订单。
int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

 

...

特伦斯

这是一个函数。把它放在你的EA的末尾,并在你认为合适的地方调用它,以检查订单是否已经在当前栏位上打开。

tkuan77:
谢谢Mladen的帮助,但是我只想和你确认一下,我是把代码放在我的多/空函数之前,还是放在中间,还是放在其他地方?因为它似乎一直在弹出错误,我似乎找不到它的来源。还有,MagicNumber是不是应该是一个整数?

Terrance

total = OrdersTotal();

if(total < 2)

{

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

如果(OrderMagicNumber() != MagicNumber)继续。

如果(OrderSymbol() != Symbol()) 继续。

如果(OrderType() != type) 继续。

如果(OrderOpenTime()=endTime)继续。

openedAtBar++;

break;

}

return(openAtBar);

}

如果(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point, Ask+TakeProfit*Point,

"My EA",12345,0,Green)。

如果(ticket>0)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

否则 Print("打开BUY订单错误。",GetLastError())。

return(0);

}

如果(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point, Bid-TakeProfit*Point,

"My EA",12345,0,Red)。

如果(ticket>0)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Sell order opened : ",OrderOpenPrice());

}

否则 Print("打开卖出订单错误。",GetLastError())。

return(0);

}

return(0);

}
原因: