如何编码? - 页 299 1...292293294295296297298299300301302303304305306...347 新评论 kappari 2012.07.08 06:04 #2981 在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做同样的事情。 Mladen Rakic 2012.07.08 07:42 #2982 试着这样做。 #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做同样的事情。 How to code? Way to SHADE AREA [存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要路过。没有你就无处可去 - 3. kappari 2012.07.08 15:31 #2983 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 tkuan77 2012.07.09 12:06 #2984 嗨,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 ifopenedSells==0 open sell Mladen Rakic 2012.07.09 13:50 #2985 tkuan77 你想把订单限制在每次1次买入和1次卖出。 因此,如果你在开仓前调用已开订单计数器,你可以控制 你有多少已开的买入或卖出。 一个例子: int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order 如果openBuys的值不是0,就不能开新的买单。同样的逻辑也适用于卖出(这是该帖子中的第二个例子)。 tkuan77: 嗨,Mladen。 你能告诉我更多关于这里的函数的原理吗?我还是不大明白。谢谢 特伦斯 tkuan77 2012.07.09 14:07 #2986 嗨,姆拉登。 也许我的表述有误。我想达到的目的是,当我的买入标准得到满足时,它将触发买入,如果再次满足另一个买入标准,它将触发另一个买入或卖出,如果卖出标准得到满足。然而,我在任何时间点上的最大交易量将是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,你就不会打开一个新的买单。同样的逻辑也适用于卖出(这是该帖子的第二个例子)。 Mladen Rakic 2012.07.09 14:17 #2987 你可以增加检查某种类型的订单是否已经在当前栏中打开,这样你就可以防止在下一个刻度上打开新的订单。如果是(在当前栏位上有一个订单),那么就不能开新的订单。如果没有,你可以开一个新的订单。这里有一个函数,可以计算出在当前条形图上开出的重复类型的订单。 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笔交易。 这里可能的原因是什么?是否与我的逻辑有关? 答复 特伦斯 编码帮助 EA不会在多对上运行,需要帮助 精英指标 :) NMSS_2 2012.07.10 01:37 #2988 tkuan77: 嗨,Mladen。也许我可能误解了自己。我想达到的目的是,当我的买入标准被满足时,它将触发买入,如果再次满足另一个买入标准,它将触发另一个买入或卖出,如果卖出标准被满足。然而,我在任何时间点上的最大交易量将是2。 我之前尝试过你的方法,我仍然遇到了系统同时开启2笔交易的情况,这就是为什么我尝试用Bars功能来限制它,但同样的问题是EA同时开启2笔交易。 这里可能的原因是什么?是否与我的逻辑有关? 请注意 Terrance 这是因为你没有说明你希望第二笔交易与第一笔交易有什么不同。区别的形式可以是X条数或价格远离第一买入价。 tkuan77 2012.07.11 14:15 #2989 谢谢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); } How to code? [存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. Help with Entry Criteria Mladen Rakic 2012.07.11 15:30 #2990 ... 特伦斯 这是一个函数。把它放在你的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); } 1...292293294295296297298299300301302303304305306...347 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
在MQL4的自定义时间输入
是否可以用MQL4写一段代码,从用户定义的条形图开始画一条水平线,直到图表的结束。
下面是使用Metastock的相同代码
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做同样的事情。
试着这样做。
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);
}只要把它复制并粘贴到一些指标上(这是一个已经工作的指标),并把它附加到图表上。
有没有可能用MQL4写一段代码,从用户定义的条形图开始画一条水平线,直到图表的结束。
以下是使用Metastock的相同代码
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做同样的事情。试着像这样。
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
试试这个函数:
{
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 :
to count opened sell orders, call it like this :
[PHP]int openedSells = countOpened(OP_SELL);tkuan77
你想把订单限制在每次1次买入和1次卖出。
因此,如果你在开仓前调用已开订单计数器,你可以控制 你有多少已开的买入或卖出。
一个例子:
如果openBuys的值不是0,就不能开新的买单。同样的逻辑也适用于卖出(这是该帖子中的第二个例子)。
嗨,Mladen。
你能告诉我更多关于这里的函数的原理吗?我还是不大明白。谢谢
特伦斯嗨,姆拉登。
也许我的表述有误。我想达到的目的是,当我的买入标准得到满足时,它将触发买入,如果再次满足另一个买入标准,它将触发另一个买入或卖出,如果卖出标准得到满足。然而,我在任何时间点上的最大交易量将是2。
我之前尝试过你的方法,我仍然遇到了系统同时开启2笔交易的情况,这就是为什么我尝试用Bars功能 来限制它,但同样的问题是EA同时开启2笔交易。
这里可能的原因是什么?是否与我的逻辑有关?
谢谢
特伦斯
tkuan77
你想把订单限制在一次买入和卖出1次。
因此,如果你在开仓前调用已开订单计数器,你可以控制你有多少个已开的买入或卖出。
一个例子:
你可以增加检查某种类型的订单是否已经在当前栏中打开,这样你就可以防止在下一个刻度上打开新的订单。如果是(在当前栏位上有一个订单),那么就不能开新的订单。如果没有,你可以开一个新的订单。这里有一个函数,可以计算出在当前条形图上开出的重复类型的订单。
{
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);
}
你好,姆拉登。
也许我的表述有误。我想实现的是,当我的买入标准被满足时,它将触发买入,如果再次满足另一个买入标准,它将触发另一个买入或卖出,如果卖出标准被满足。然而,我在任何时间点上的最大交易量将是2。
我之前尝试过你的方法,我仍然遇到了系统同时开启2笔交易的情况,这就是为什么我尝试用Bars功能来限制它,但同样的问题是EA同时开启2笔交易。
这里可能的原因是什么?是否与我的逻辑有关?
答复
特伦斯嗨,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);
}
你可以增加检查某种类型的订单是否已经在当前的条形图上打开,这样你就可以防止在下一个tick上打开一个新的订单。如果是(在当前栏位上有一个订单),那么就不能开新的订单。如果没有,你可以开一个新的订单。这里有一个函数,可以计算出在当前条形图上打开的重复类型的订单。
{
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的末尾,并在你认为合适的地方调用它,以检查订单是否已经在当前栏位上打开。
谢谢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);
}