新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1561 1...155415551556155715581559156015611562156315641565156615671568...1953 新评论 Eugen8519 2021.08.02 19:24 #15601 MakarFX: 不要删除 你必须像我写的那样改变标志。 于是我就这么做了,它照样开到了五个合同。 Tretyakov Rostyslav 2021.08.02 19:26 #15602 Eugen8519:所以我改变了它,它像往常一样打开了五个合同 发布OnTick()代码 Mihail Matkovskij 2021.08.02 19:28 #15603 MakarFX:然后加起来,计算出这一时期的全部利润。 你又误解了。他说他想计算利润。该函数试图计算最后一个平仓订单的损失,结果并不正确。所以,他最后把所有人都弄糊涂了。 Eugen8519 2021.08.02 19:29 #15604 MakarFX: 发布OnTick()代码 void OnTick() { double close1 = iClose(_Symbol,Timeframe,1); datetime time_0=iTime(0); if(TimeBar==time_0) return; if(TimeBar==0) { TimeBar=time_0; return; }//first program run double EMA0[],EMA_TREND[],WMA0[]; //--- int start_pos=1,count=3; if(!iGetArray(handle_iMA_EMA,0,start_pos,count,EMA0)) return; if(!iGetArray(handle_iMA_EMA_TREND,0,start_pos,count,EMA_TREND)) return; if(!iGetArray(handle_iMA_WMA,0,start_pos,count,WMA0)) return; //--- if(UseTimeLimit) { YesStop=true; MqlDateTime str1; TimeToStruct(TimeCurrent() , str1); if(str1.hour > startHour && str1.hour < stopHour) YesStop=false; } if(YesStop==false) { ulong m_ticket=0; double SEma,LEma; SEma = iMAGet(handle_iMA_WMA,0); LEma = iMAGet(handle_iMA_EMA,0); static int isCrossed=0; if(!Reverse) isCrossed=Crossed(LEma,SEma); else isCrossed=Crossed(SEma,LEma); //--- if(!RefreshRates()) return; //--- bool condition1 = (close1 > EMA_TREND[0]); bool condition2 = (isCrossed==1); { { int pos_total=PositionsTotal(); { if(condition1 && condition2 && pos_total==0 ) { if(!RefreshRates()) return; TimeBar=time_0; my_TP = m_symbol.Ask() + ExtTakeProfit*Point(); my_SL = m_symbol.Ask() - ExtStopLoss*Point(); my_lot = Lots; OPENORDER("Buy"); CLOSEORDER("Sell"); } } bool condition3 = (close1 < EMA_TREND[0]); bool condition4 = (isCrossed==2); if(condition3 && condition4 && pos_total==0 ) { if(!RefreshRates()) return; TimeBar=time_0; my_TP = m_symbol.Bid() - ExtTakeProfit*Point(); my_SL = m_symbol.Bid() + ExtStopLoss*Point(); my_lot= Lots; OPENORDER("Sell"); CLOSEORDER("Buy"); } } } if(UseTimeLimitClose) { MqlDateTime TimeNow; TimeToStruct(TimeCurrent(),TimeNow); if ( TimeNow.day_of_week >= closday && TimeNow.hour >= Close_Hour && TimeNow.min >= Close_min ) { CloseAllPositions(); } } //--- TrailingOrder(); Trailing(); //--- return; } } //-------------------------------------------------------------------- void CLOSEORDER(string ord) { for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions if(m_position.SelectByIndex(i)) if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY && ord=="Buy") m_trade.PositionClose(m_position.Ticket()); // Close Buy if(m_position.PositionType()==POSITION_TYPE_SELL && ord=="Sell") m_trade.PositionClose(m_position.Ticket()); // Close Sell } } //-------------------------------------------------------------------- void CloseAllPositions() { for(int i=PositionsTotal()-1; i>=0 && !IsStopped(); i--) { if(m_position.SelectByIndex(i)) { //--- trading object m_trade.SetExpertMagicNumber(m_position.Magic()); m_trade.SetTypeFillingBySymbol(m_position.Symbol()); //--- close positions if(m_trade.PositionClose(m_position.Ticket()) && (m_trade.ResultRetcode()==TRADE_RETCODE_DONE || m_trade.ResultRetcode()==TRADE_RETCODE_PLACED)) PrintFormat("Position #%I64u on %s to be closed",m_position.Ticket(),m_position.Symbol()); else PrintFormat("> Error closing position #%I64u on %s (%s)",m_position.Ticket(),m_position.Symbol(),m_trade.ResultComment()); } } } //-------------------------------------------------------------------- void OPENORDER(string ord) { double priceL=m_symbol.Ask(); if(ord=="Sell") //--- check for free money if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,my_lot,priceL)<0.0) printf("We have no money. Free Margin = %f",m_account.FreeMargin()); else if(!m_trade.Sell(my_lot,Symbol(),m_symbol.Bid(),my_SL,my_TP,"")) Print("BUY_STOP -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of Retcode: ",m_trade.ResultRetcodeDescription(), ", ticket of order: ",m_trade.ResultOrder()); // Если sell, то не открываемся double priceS=m_symbol.Bid(); if(ord=="Buy") //--- check for free money if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,my_lot,priceS)<0.0) printf("We have no money. Free Margin = %f",m_account.FreeMargin()); else if(!m_trade.Buy(my_lot,Symbol(),m_symbol.Ask(),my_SL,my_TP,"")) Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription(), ", ticket of deal: ",m_trade.ResultDeal()); return; } double iMAGet(const int handle,const int index) { double MA[]; ArraySetAsSeries(MA,true); //--- reset error code ResetLastError(); //--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 index if(CopyBuffer(handle,0,0,index+1,MA)<0) { //--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(0.0); } return(MA[index]); } //+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ bool RefreshRates() { //--- refresh rates if(!m_symbol.RefreshRates()) return(false); //--- protection against the return value of "zero" if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Get Time for specified bar index | //+------------------------------------------------------------------+ datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=Period(); datetime Time[]; datetime time=0; ArraySetAsSeries(Time,true); int copied=CopyTime(symbol,timeframe,index,1,Time); if(copied>0) time=Time[0]; return(time); } //+------------------------------------------------------------------+ //| Get value of buffers | //+------------------------------------------------------------------+ bool iGetArray(const int handle,const int buffer,const int start_pos, const int count,double &arr_buffer[]) { bool result=true; if(!ArrayIsDynamic(arr_buffer)) { PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__); return(false); } ArrayFree(arr_buffer); //--- reset error code ResetLastError(); //--- fill a part of the iBands array with values from the indicator buffer int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer); if(copied!=count) { //--- if the copying fails, tell the error code PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d", __FILE__,__FUNCTION__,count,copied,GetLastError()); //--- quit with zero result - it means that the indicator is considered as not calculated return(false); } return(result); } void TrailingOrder() { int pos_total=PositionsTotal(); if(InpTrailingOrderLimit==0) return; for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions if(m_position.SelectByIndex(i)) if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep) if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep)) OPENORDER("Buy"); } else { if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep) if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep)))) OPENORDER("Sell"); } } } void Trailing() { if(InpTStop==0) return; if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTStop+ExtTStep) if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTStop+ExtTStep)) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTStepShift), m_position.TakeProfit())) Print("Modify ",m_position.Ticket(), " Position -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } else { if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTStop+ExtTStep) if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTStop+ExtTStep))) || (m_position.StopLoss()==0)) { if(!m_trade.PositionModify(m_position.Ticket(), m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTStepShift), m_position.TakeProfit())) Print("Modify ",m_position.Ticket(), " Position -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } } } } //+------------------------------------------------------------------+ pos_total<=2 暂时删除 Tretyakov Rostyslav 2021.08.02 19:36 #15605 Eugen8519: 找到线 OPENORDER("Buy"); 并将其替换为。 if (PositionsTotal()<=2) { OPENORDER("Buy"); } 找到一条线 OPENORDER("Sell"); 并替换为 if (PositionsTotal()<=2) { OPENORDER("Sell"); } Tretyakov Rostyslav 2021.08.02 19:40 #15606 Mihail Matkovskij:你又误解了。他说他想计算一下利润。该函数试图计算最后一笔平仓订单的损失,但并不正确。所以他最后把所有人都弄糊涂了。 你自己说利润可以是负的,他想得到交易的总利润是正还是负的。 Eugen8519 2021.08.02 19:44 #15607 MakarFX:找到线并将其替换为。找到一条线 并将其替换为。 if(InpTrailingOrderLimit==0) return; for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions if(m_position.SelectByIndex(i)) if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) { if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep) if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep)) if (PositionsTotal()<=2) { OPENORDER("Buy"); } } else { if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep) if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep)))) if (PositionsTotal()<=2) { OPENORDER("Sell"); } 我这么一说,在两个合同上还是无限制的 Mihail Matkovskij 2021.08.02 19:46 #15608 MakarFX: 你自己说利润可能是负的,他想得到交易的总利润是正还是负的。 因此,只有当利润为正数时,才会将其加起来。如果是负数,就是亏损。如果我们想知道总利润,所有的利润,包括负的,都要加起来。而这个函数试图找出最后一笔订单的利润,它做得不正确,被称为lastloss。你不明白吗?哦,亲爱的...我已经筋疲力尽了... Tretyakov Rostyslav 2021.08.02 19:47 #15609 Eugen8519:我是这样说的,但在两个合同上还是没有限制。 不存在于无效的OnTick中 Valeriy Yastremskiy 2021.08.02 19:47 #15610 MakarFX:然后加起来,计算出这一时期的全部利润。"那你为什么要在利润上加上交换和佣金?鉴于 OrderProfit() 也可以是消极的...而且,如果你只处理1个或几个匹配的订单,而不是全部,我们谈论的是什么样的总利润?"有些东西真的让对方感到困惑。这句话说得很对,不是说负数的加减法)我也不喜欢答案 寻求,它就在那里) 1...155415551556155715581559156015611562156315641565156615671568...1953 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
不要删除
你必须像我写的那样改变标志。
于是我就这么做了,它照样开到了五个合同。
所以我改变了它,它像往常一样打开了五个合同
然后加起来,计算出这一时期的全部利润。
你又误解了。他说他想计算利润。该函数试图计算最后一个平仓订单的损失,结果并不正确。所以,他最后把所有人都弄糊涂了。
发布OnTick()代码
找到线
OPENORDER("Buy");
并将其替换为。
找到一条线
OPENORDER("Sell");
并替换为
你又误解了。他说他想计算一下利润。该函数试图计算最后一笔平仓订单的损失,但并不正确。所以他最后把所有人都弄糊涂了。
找到线
并将其替换为。
找到一条线
并将其替换为。
我这么一说,在两个合同上还是无限制的
你自己说利润可能是负的,他想得到交易的总利润是正还是负的。
因此,只有当利润为正数时,才会将其加起来。如果是负数,就是亏损。如果我们想知道总利润,所有的利润,包括负的,都要加起来。而这个函数试图找出最后一笔订单的利润,它做得不正确,被称为lastloss。你不明白吗?哦,亲爱的...我已经筋疲力尽了...
我是这样说的,但在两个合同上还是没有限制。
不存在于无效的OnTick中
然后加起来,计算出这一时期的全部利润。
也可以是消极的...
而且,如果你只处理1个或几个匹配的订单,而不是全部,我们谈论的是什么样的总利润?"
有些东西真的让对方感到困惑。这句话说得很对,不是说负数的加减法)
我也不喜欢答案 寻求,它就在那里)