初学者的问题 MQL4 MT4 MetaTrader 4 - 页 143

 
Лауреат:
如何制作一个函数,在时间历史中经过指定数量的蜡烛后,通过其自身的桥段关闭一个开仓
int numBars = 5;
void OnTick()
{
     for(int i = OrdersTotal(); i >= 0; i--)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
          if( OrderSymbol() != _Symbol)                continue;
          if( OrderMagicNumber() != Magic)             continue;
          if( OrderOpenTime() > Time[numBars-1] )      continue; 
          
          /* work */
     }
}
 
sviter-pro:
我在做实验!!。逻辑是具体的!!!你能帮助我吗?

它有什么特别之处?

看看最后的位置,打开相反的位置。

 
Konstantin Nikitin:

我去看看。

 
sviter-pro:

我会检查好的。

 

你好。请帮助解决该功能。在一个账户上,应该有几个EA在交易。每个EA每天可以开设不超过一个交易。我需要一个函数,如果EA已经有了交易,则返回true ,如果没有交易,则返回false 。根据我的理解,检查应该是在当前日期通过魔法 完成的。如果你能帮助我,我计划在我的每一个需要这样检查的EA中建立这个功能。如果我能提供帮助,我正计划在我需要这种检查的每个EA中建立它。

 
Kolya32:

你好。请帮助解决该功能。在一个账户上,它应该是与几个EA一起交易。每个EA每天可以开出不超过一个交易。如果有交易,该函数应返回true ,如果没有交易,则返回false 。根据我的理解,检查应该是在当前日期通过魔法 完成的。如果你能帮助我,我计划在我的每一个需要这样检查的EA中建立这个功能。如果我能提供帮助,我正计划在我需要这种检查的每个EA中建立它。

一切都已经在我们面前完成了))。请看这里

 

看来我需要isTradeToDay()函数。好吧,我做个实验)谢谢你。

我为自己纠正了这个函数,注释了int mn=-1,用Magic代替了mn。在测试器中运行有此功能的EA后,我看到了一个很大的缺点:测试EA的 时间增加了好几年!现在我决定在一个模拟账户上测试具有这一功能的专家顾问。我的账户里有5个专家顾问,我担心交易开仓会有滞后。

bool isTradeToDay(string sy="", int op=-/*,int mn=-1*/) {
int i, k=OrdersHistoryTotal();

如果(sy=="0")sy=符号()。
for (i=0; i<k; i++) {
如果(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
如果(OrderSymbol()==sy || sy==""){
如果(OrderType()==OP_BUY || OrderType()==OP_SELL) {
如果(op<0 || OrderType()==op){
如果(Magic<0 || OrderMagicNumber()==Magic) {
如果(TimeDay(OrderOpenTime())==Day()
&&TimeMonth(OrderOpenTime())==Month()
&&TimeYear(OrderOpenTime())==Year())返回(True)。
}
}
}
}
}
}
k=OrdersTotal()。
for (i=0; i<k; i++) {
如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
如果(OrderSymbol()==sy || sy==""){
如果(OrderType()==OP_BUY || OrderType()==OP_SELL) {
如果(op<0 || OrderType()==op){
如果(Magic<0 || OrderMagicNumber()==Magic) {
如果(TimeDay(OrderOpenTime())==Day()
&&TimeMonth(OrderOpenTime())==Month()
&&TimeYear(OrderOpenTime())==Year())返回(True)。
}
}
}
}
}
}
return(False)。
}

 

你需要在图表上标记网格的盈亏平衡水平。

以点为单位的利润。

double current_Prof_Pts = current_Prof_Bux/current_summ_lot/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point)

购买网格的盈亏平衡位置

zero = Bid-current_Prof_Pts*_Point

(对于卖出,分别为:Ask+current_Prof_Pts*_Point)

结果:似乎是真的,但总是在真实值附近跳动,大约3个点。

你能告诉我错误在哪里吗?

 
Kolya32:

看来我需要isTradeToDay()函数。好吧,我会做实验的)谢谢你。

我发现了一个很大的缺点:测试一个EA的 时间整整增加了五倍!

是的,当然了。该函数是以一种通用的方式编写的。如果你每次勾选都访问它,那么循环就会贯穿整个账户历史。而且账户历史可能相当深(我见过有超过100 000个订单的情况)。为了加快执行速度,你不需要每次都在整个历史上运行循环。只需在一开始做一次,并记住最后处理的订单的索引即可。下一次,你需要只对索引大于存储索引的订单进行循环。之后,再次记住上一个订单的索引,以此类推。

 
Igor Zakharov:

你需要在图表上标记网格的盈亏平衡水平。

以点为单位的利润。

购买网格的盈亏平衡位置

(对于卖出,分别为:Ask+current_Prof_Pts*_Point)

结果:似乎是真的,但总是在真实值附近跳动,大约3个点。

请告知,错误在哪里?

浮动价差是 咎由自取。