for(int i=0; i<OrdersTotal(); i++){if(!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY )))continue;//выбираем из истории счетаif(OrderSymbol()!=Symbol())continue;if(OrderMagicNumber()== Magic){
позиции =true;}}
但这样你的代码就只能在测试器中工作。因为否则的话,你将不得不在每次打开EA在线时改变魔力。
很明显,你需要设置账户历史记录的时间。
也就是说,最后一次用给定的魔法进行交易是什么时候开/关的?是6个月前还是24小时前?
有一些函数可以返回最后一笔开仓或平仓交易的条数(从当前条数算到历史的后面)。
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает номер бара открытия последней позиции или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+int NumberOfBarOpenLastPos(string sy="0",int tf=0,int op=-1,int mn=-1){datetime t;int i, k=OrdersTotal();if( sy==""|| sy=="0") sy=Symbol();for( i=0; i< k; i++){if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)){if(OrderSymbol()== sy){if(OrderType()==OP_BUY||OrderType()==OP_SELL){if( op<0||OrderType()== op){if( mn<0||OrderMagicNumber()== mn){if( t<OrderOpenTime()) t=OrderOpenTime();}}}}}}return(iBarShift( sy, tf, t, True));}//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает номер бара закрытия последней позиции или -1. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//| op - операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+int NumberOfBarCloseLastPos(string sy="0",int tf=0,int op=-1,int mn=-1){datetime t;int i, k=OrdersHistoryTotal();if( sy==""|| sy=="0") sy=Symbol();for( i=0; i< k; i++){if(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)){if(OrderSymbol()== sy){if(OrderType()==OP_BUY||OrderType()==OP_SELL){if( op<0||OrderType()== op){if( mn<0||OrderMagicNumber()== mn){if( t<OrderCloseTime()) t=OrderCloseTime();}}}}}}return(iBarShift( sy, tf, t, True));}
给你举个例子。我在我的代码中是这样使用这些函数的。
//======================================================================// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if( NumberOfBarOpenLastPos(NULL,1440,-1, Magic)==0|| NumberOfBarCloseLastPos(NULL,1440,-1, Magic)==0)
Trade=false;else Trade=true;//================================================================
或者像这样。
//======================================================================// запрет торговли , если за последние 85 баров графика Н1//т.е. за посл.85 часов)уже были открыты позиции или// закрыты позиции с заданным магикомif( NumberOfBarOpenLastPos(NULL,60,-1, Magic)<=85|| NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85)
Trade=false;else Trade=true;
当使用(调用)这些文件中的函数时(已经在mt4中实现),在EA工作不正确的情况下,我们可以在日志中看到我们在代码中的错误编号。
例如,我们调用GetLastError()函数。
在这种情况下,如果我们在代码中犯了错误或设置了不正确的外部参数,我们将在日志中看到这个错误的编号。
例如,130。
而这个数字的解码可以在网页上找到 - https://book.mql4.com/ru/appendix/errors
我们不必搜索所有的代码,因为我们已经知道了这个数字--到底是哪里出错了!
让我纠正一下:GetLastError函数可以在没有头文件的情况下调用,但要在不浏览网站的情况下得到错误描述,你应该链接库。
你没有正确地调用该函数。
你的函数是这样调用的:如果(NumberOfPositions(NULL,Magic)>1)
它应该看起来像这样。
感受一下差异(你错过了"-1")!并改变你的代码。
为了控制它,你可以在图表上打印一个注释。例如,像这样(在START函数的开头)。
至于你的第二个条件,我会("不假思索地巧妙")设置一个不同的魔术师和单独的函数Open_Buy_2(),通过第二个条件来开仓 !第二个条件的代码将看起来像这样
摆脱。
我也明白为什么第二个条件不起作用,也许我对问题的解释不正确。
我希望我的EA能够检查订单是否被它打开,即使它们在很久以前就被关闭。NumberOfPositions可以工作,但它只计算未结头寸的数量。(这就是为什么它不起作用)
在我的EA代码中,有一个脚本,它在打开每一个下一个头寸时都会考虑到前一个头寸的数据,如果没有前一个头寸,那么第一个订单就应该在没有这个条件的情况下打开(否则,EA将不会启动)。 因此,应该有一个函数来了解这个EA的至少一个订单是否已经被打开(即使该订单随后被关闭)。如果还没有订单(在工作开始时),那么第一个订单被打开,不考虑第二个条件,所有随后的订单被打开,考虑第二个条件,即使用以前订单的数据。
有可能以这种方式修改函数吗?
请告诉我iTime 功能显示什么。
那10位数的胡言乱语是什么?秒钟?
如何转换为年-月-日-时-分?
我明白了。为了确定历史上是否有职位,你可以这样做。
但这样你的代码就只能在测试器中工作。因为否则的话,你将不得不在每次打开EA在线时改变魔力。
很明显,你需要设置账户历史记录的时间。
也就是说,最后一次用给定的魔法进行交易是什么时候开/关的?是6个月前还是24小时前?
有一些函数可以返回最后一笔开仓或平仓交易的条数(从当前条数算到历史的后面)。
给你举个例子。我在我的代码中是这样使用这些函数的。
或者像这样。
嗯......在同一个简单的问题上挣扎......开了很多仓位,但最多只需要1个,当买入结束后,有信号来开卖......。大要求提示并纠正以下代码中的错误......我在哪里需要开出一个魔力?如果你不介意的话,举个愚蠢的例子,当买入时向上交叉(不超过1个订单),卖出时向下也不超过1个。 我认为这将立即解决许多新手的问题。预先感谢你。
另一个愚蠢的问题。
- 如何声明一个数组,其元素数由一个外部变量给出。
它是这样的。
另一个愚蠢的问题。
- 如何声明一个数组,其元素数由一个外部变量给出。
https://docs.mql4.com/ru/array/ArrayResize
嗯......在同一个简单的问题上挣扎......开了很多仓位,但最多只需要1个,当买入关闭,出现卖出的信号时......。大要求提示并纠正以下代码中的错误......我在哪里需要开出一个魔力?如果你不介意的话,举个愚蠢的例子,当买入时向上交叉(不超过1个订单),卖出时向下也不超过1个。 我认为这将立即解决许多新手的问题。提前感谢。
像这样试试吧。
(你必须对NumberOfPositions()更加注意,它被写在标题中是有原因的。
/|说明:|说明:返回位置的数量。
//| 参数 : |
//| sy - 仪器名称(""或NULL - 当前符号)|
|| op - 操作 ( -1 - 任何位置 ) ||
//| mn - MagicNumber ( -1 - any magic number) | |
//+----------------------------------------------------------------------------+