如何创建一个神奇的数字阵列? - 页 4 1234 新评论 Edward Hirsch 2010.12.30 00:44 #31 强。 1) 第一个OrderSend()通过测试返回值是否大于0来检查它是否成功。 大于零,然后再尝试发送第二个订单。 2) 为了识别和处理订单对,你可以根据以下代码,如果订单对 是由不同的类型组成的(然而,如果分组超过2个,或者如果订单是由不同的类型组成的,则必须改变算法)。 然而,如果分组超过2个,或者一个组中的订单都是同一类型的,则必须改变算法)。 下面的示例程序 "ReportsTrader.mq4 "在报告或新闻事件发生时放置跨期订单。 报道或新闻事件。 跨式订单是由高于和低于市场价格的两个挂单 组成的。当一个 当一个挂单达到市场价格时,它就会变成一个市场订单,而另一个挂单就会变成市场订单。 订单必须被删除。因此,订单对需要一个序列号来跟踪它们。 //+------------------------------------------------------------------+ //| ReportsTrader.mq4 | //| Copyright © 2010, sxTed | //| MailTo: sxTed@gmx.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, sxTed" #property link "MailTo: sxTed@gmx.com" //+------------------------------------------------------------------+ //| input parameters: | //+-----------0---+----1----+----2----+----3]------------------------+ extern int ExpertID = 2; extern int StopLoss = 20; extern int TakeProfit = 60; extern int DistanceToMarket = 15; extern double Lots = 0.05; extern bool AlertError = true; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ void start() { static string Report[4][4] = {"2010.12.30 05:00", "USDJPY", "JPY Purchasing Manager Index" , "0", "2010.12.30 09:00", "EURUSD", "EUR Italian Producer Price Index", "0", "2010.12.30 13:30", "USDJPY", "USD Initial Jobless Claims" , "0", "2010.12.31 00:30", "AUDUSD", "AUD Private Sector Credit" , "0" }; int Position[10][7], iReports=ArrayRange(Report,0), i, k, iPairs, iPipsFactor; int iOrders=OrdersTotal(), iPositions=ArrayRange(Position,0), iSequenceNumber; double dTS, dSL, pp; string sSequenceNumber; //----------------------------------------------------------------- triage of orders if (iOrders > iPositions) iPositions=ArrayResize(Position,iOrders)/iOrders; ArrayInitialize(Position,0); for (i=0; i<iOrders; i++) { if (!OrderSelect(i,SELECT_BY_POS)) continue; if (OrderMagicNumber() != ExpertID) continue; iSequenceNumber = StrToInteger(OrderComment()); for (k=0; k<iPositions; k++) { if (Position[k][6] == iSequenceNumber) { Position[k][OrderType()] = OrderTicket(); break; } if (Position[k][6] == 0) { Position[k][6] = iSequenceNumber; Position[k][OrderType()] = OrderTicket(); iPairs++; break; } } } //----------------------------------------------------------------- maintain straddle orders for (i=0; i<iPairs; i++) { if (Position[i][OP_BUY] > 0) { if (OrderSelect(Position[i][OP_BUY], SELECT_BY_TICKET)) { if ((MarketInfo(OrderSymbol(),MODE_DIGITS) == 5) || (MarketInfo(OrderSymbol(),MODE_DIGITS) == 3)) iPipsFactor = 10; else iPipsFactor = 1; dTS=StopLoss*iPipsFactor*MarketInfo(OrderSymbol(),MODE_POINT); dSL=OrderStopLoss()+dTS*MathFloor((MarketInfo(OrderSymbol(),MODE_BID)-dTS-OrderStopLoss())/dTS); if (MarketInfo(OrderSymbol(),MODE_BID)-dSL >= dTS && dSL > OrderStopLoss()) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),dSL,OrderTakeProfit(),0)) return(Error("OrderModify")); } } } if (Position[i][OP_SELL] > 0) { if (OrderSelect(Position[i][OP_SELL], SELECT_BY_TICKET)) { if ((MarketInfo(OrderSymbol(),MODE_DIGITS) == 5) || (MarketInfo(OrderSymbol(),MODE_DIGITS) == 3)) iPipsFactor = 10; else iPipsFactor = 1; dTS=StopLoss*iPipsFactor*MarketInfo(OrderSymbol(),MODE_POINT); dSL=OrderStopLoss()-dTS*MathFloor((OrderStopLoss()-dTS-MarketInfo(OrderSymbol(),MODE_ASK))/dTS); if (dSL-MarketInfo(OrderSymbol(),MODE_ASK) >= dTS && dSL < OrderStopLoss()) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),dSL,OrderTakeProfit(),0)) return(Error("OrderModify")); } } } if (Position[i][OP_BUYSTOP] > 0 && Position[i][OP_SELLSTOP] == 0) { if (!OrderDelete(Position[i][OP_BUYSTOP])) return(Error("OrderDelete ticket "+Position[i][OP_BUYSTOP])); } if (Position[i][OP_BUYSTOP] == 0 && Position[i][OP_SELLSTOP] > 0) { if (!OrderDelete(Position[i][OP_SELLSTOP])) return(Error("OrderDelete ticket "+Position[i][OP_SELLSTOP])); } } //----------------------------------------------------------------- place new straddle orders for Report for (i=0; i<iReports; i++) { if (Report[i][3] == "0") { if ((TimeGMT() >= StrToTime(Report[i][0])-PERIOD_M5*60) && (TimeGMT() <= StrToTime(Report[i][0]))) { Report[i][3] = "done"; sSequenceNumber=DoubleToStr(SequenceNumber(),0); if ((MarketInfo(Report[i][1],MODE_DIGITS) == 5) || (MarketInfo(Report[i][1],MODE_DIGITS) == 3)) iPipsFactor = 10; else iPipsFactor = 1; pp=MarketInfo(Report[i][1],MODE_ASK)+DistanceToMarket*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT); if (OrderSend(Report[i][1],OP_BUYSTOP,Lots,pp,3,pp-StopLoss*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT),pp+TakeProfit*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT),sSequenceNumber,ExpertID,0,Green) == -1) return(Error("OrderSend OP_BUYSTOP")); RefreshRates(); pp=MarketInfo(Report[i][1],MODE_BID)-DistanceToMarket*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT); if (OrderSend(Report[i][1],OP_SELLSTOP,Lots,pp,3,pp+StopLoss*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT),pp-TakeProfit*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT),sSequenceNumber,ExpertID,0,Red) == -1) return(Error("OrderSend OP_SELLSTOP")); } } } } int Error(string sErrorMessage) { int iErrorNumber=GetLastError(); Print(sErrorMessage," error ",iErrorNumber); if (AlertError) Alert(sErrorMessage," error ",iErrorNumber); return(-1); } //+------------------------------------------------------------------+ //| Function..: SequenceNumber | //| Purpose...: Generate a sequential number. | //| Returns...: dSeqNum - next sequence number. | //| Notes.....: MT4 keeps the value of the global variable at the | //| client terminal for 4 weeks since the last access. | //| Use SequenceNumber() to generate a unique identity | //| for each order (and passed via parameter <magic> | //| number, or converted to a string and passed via the | //| parameter <comment> to the OrderSend() function) as | //| the trade servers of some brokers do modify the | //| ticket number of a pending order when it changes to | //| a market order. | //| The same sequence number could, for example, be used | //| to identify the two positions of a straddle order. | //| ****************************************************** //| * If the expert has to close partial lots, then MT4 * //| * retains in the new order the contents of the * //| * OrderMagicNumber() but loses OrderComment(). * //| ****************************************************** //| Sample....: string sNumber=DoubleToStr(SequenceNumber(),0); | //| if(OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-25*Point, | //| Ask+25*Point,sNumber,16384,0,Green) > 0)| //| OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-25*Point, | //| Ask+65*Point,sNumber,16384,0,Green); | //+------------------------------------------------------------------+ double SequenceNumber() { double dSeqNum=1, d; string sName="SequenceNumber"; while (GlobalVariableCheck("Semaphore")) d+=0; GlobalVariableSet("Semaphore",1); if (GlobalVariableCheck(sName)) dSeqNum=GlobalVariableGet(sName)+1; GlobalVariableSet(sName,dSeqNum); GlobalVariableDel("Semaphore"); return(dSeqNum); } //+------------------------------------------------------------------+ //| Function..: TimeGMT | //| Thank you.: Slawa ref. http://www.metatrader4.com/forum/2435 | //| Purpose...: Retrieve the current system date and time expressed | //| in GMT (UTC) time. | //| Returns...: tGMT. | //+------------------------------------------------------------------+ #import "Kernel32.dll" void GetSystemTime(int& TimeArray[]); #import datetime TimeGMT() { int TimeArray[4]; GetSystemTime(TimeArray); int YY=TimeArray[0]&0x0000FFFF; int MM=TimeArray[0]>>16; int DD=TimeArray[1]>>16; int hh=TimeArray[2]&0x0000FFFF; int mm=TimeArray[2]>>16; int ss=TimeArray[3]&0x0000FFFF; return(StrToTime(StringConcatenate(YY,".",MM,".",DD," ",hh,":",mm,":",ss))); } //+------------------------------------------------------------------+ 附加的文件: reportstrader_1.mq4 10 kb Chee Chua 2010.12.30 04:51 #32 谢谢!哇,将花时间来阅读和理解你的代码... Dean Thomas Whittingham 2019.03.11 07:32 #33 我不知道你是否已经解决了这个问题,但我已经非常接近能够做同样的事情了。 我的系统创建了价格水平(基于我开始时的输入),这些价格水平应该是永久性的,因此,如果价格重新回到一个价格水平,而订单不存在,就会下订单。这些价格水平是在使用for循环创建每个待定订单 时创建的。然后,magicnumber是由pricelevel衍生出来的。 你可以在这里看到我的代码。 https://www.mql5.com/en/forum/306224 我唯一的问题是,有时我的数字比交易的价格水平少1位,我无法解决。 Anyone want to take a crack at this? 2019.03.11www.mql5.com Hi All, Anyone want to take a crack at this? This code will ask for inputs, so in this case the following were entered 2019.03.11 11:56:18.393 2016... 1234 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
1) 第一个OrderSend()通过测试返回值是否大于0来检查它是否成功。
大于零,然后再尝试发送第二个订单。
2) 为了识别和处理订单对,你可以根据以下代码,如果订单对
是由不同的类型组成的(然而,如果分组超过2个,或者如果订单是由不同的类型组成的,则必须改变算法)。
然而,如果分组超过2个,或者一个组中的订单都是同一类型的,则必须改变算法)。
下面的示例程序 "ReportsTrader.mq4 "在报告或新闻事件发生时放置跨期订单。
报道或新闻事件。
跨式订单是由高于和低于市场价格的两个挂单 组成的。当一个
当一个挂单达到市场价格时,它就会变成一个市场订单,而另一个挂单就会变成市场订单。
订单必须被删除。因此,订单对需要一个序列号来跟踪它们。
我不知道你是否已经解决了这个问题,但我已经非常接近能够做同样的事情了。
我的系统创建了价格水平(基于我开始时的输入),这些价格水平应该是永久性的,因此,如果价格重新回到一个价格水平,而订单不存在,就会下订单。这些价格水平是在使用for循环创建每个待定订单 时创建的。然后,magicnumber是由pricelevel衍生出来的。
你可以在这里看到我的代码。
https://www.mql5.com/en/forum/306224
我唯一的问题是,有时我的数字比交易的价格水平少1位,我无法解决。