新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1357 1...135013511352135313541355135613571358135913601361136213631364...1953 新评论 Tretyakov Rostyslav 2021.01.22 12:57 #13561 DanilaMactep: 这个过程应该写在每一行的后面,其中有一个试图使用订单发送打开一个订单--对吗? 在所有交易 之后, OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()。 DanilaMactep 2021.01.22 13:01 #13562 MakarFX:在所有交易 之后, OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()。 如果我的专家顾问被从图表中删除,它将无法工作,除非我再次手动添加它。我怎样才能将它重置为自动工作? Tretyakov Rostyslav 2021.01.22 13:06 #13563 DanilaMactep: 这必须写在试图使用订单发送开立订单的每一行之后,这样做对吗? 如果我们排除了与以下方面有关的错误 mode_stoplevel, mode_tradeallowed, mode_minlot, mode_lotstep, mode_maxlot 那么,猫头鹰就不会扑向服务器了 Tretyakov Rostyslav 2021.01.22 13:07 #13564 DanilaMactep: 如果EA被从图表中删除,它将无法工作,直到我再次手动上传。我怎样才能自动复位? 你不能自动做到这一点,这是为了纠正错误 Vasyl Temchenko 2021.01.22 13:53 #13565 DanilaMactep:这个案例必须写在每一行的后面,在这一行中,有一个试图使用ordersend打开一个订单--对吗? 如果我们所说的 "这种情况 "是指检查允许的最小和最大订单量,订单量的阶梯,允许的最大交易数量+订单,自由保证金的充足性(这些都是主要的,验证器最常拒绝的),那么写一个函数 更合理,例如叫它OrderCheck。 然后,在开启任何新的交易之前,只需检查音量。 大约如此。 Lot=OrderCheck(OP_BUY,Lot); // или Lot=OrderCheck(OP_SELL,Lot); Alexey Belyakov 2021.01.22 14:04 #13566 所有亲爱的程序员们,大家好我已经为一个问题纠结了一天了,我想不明白。请帮助我解决这个问题。 底线。 该工具是RTS期货,周期为M5。 算法必须根据时间改变参数SL和TP,重要的是,如果满足某些条件,未结头寸 不是由TP(request.tp = ....)和反市场订单关闭。 有三个区间:1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.sec>=1 && stm.hour<=12 && stm.sec>=1) 。min<=03) // 从12:00:01 - 12:03:00 2) (stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09) // 16:05:01 - 16:09:00 3)(stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00 在区间 "1) "参数SL和TP=200和200 在间隔 "2)"和 "3)",SL和TP=100和100 问题是:该算法只在当前的开关上固定利润,但我们需要在n个以上的烛台(至少10-15个)保持获利条件 图表周期M5 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ datetime some_time=TimeCurrent(); #define EXPERT_MAGIC 1010 // MagicNumber эксперта //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { double Ask = SymbolInfoDouble(NULL, SYMBOL_ASK); double Bid = SymbolInfoDouble(NULL, SYMBOL_BID); double SL=0; double TP=0; datetime tm=TimeCurrent(); MqlDateTime stm; TimeToStruct(tm,stm); bool is_siesta=false; if (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // Условия SL и TP работают только в этом интервале времени { SL=200/_Point; TP=200/_Point; is_siesta=true; } else { if(((stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09)) || (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04)) // Условия SL и TP работают только в этих интервалах времени { SL=100/_Point; TP=100/_Point; // тейк профит закрывается кодом is_siesta=true; } else { return; } } double Lots=1; datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрению datetime static timeOpen = 0; if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_BUY; request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); request.deviation= 5; request.sl = NormalizeDouble(Ask-SL*_Point,_Digits); request.magic = 1010; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки timeOpen = timeBar; } if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_SELL; request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); request.deviation= 5; request.sl = NormalizeDouble(Bid+SL*_Point,_Digits); request.magic = 1010; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки timeOpen = timeBar; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL) if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт. { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ulong magic=PositionGetInteger(POSITION_MAGIC); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции if((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику { request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_BUY; request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY) if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт. { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ulong magic=PositionGetInteger(POSITION_MAGIC); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции if((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику { request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_SELL; request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp } Совершение сделок - Торговые операции - Справка по MetaTrader 5 www.metatrader5.com Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением... Any questions from newcomers Errors, bugs, questions 错误、漏洞、问题 Tretyakov Rostyslav 2021.01.22 15:28 #13567 Alexey Belyakov: 问题是:该算法只在当前的开关上固定利润,但我们需要对n条曲线(至少10-15条)保持获利条件。 M5图期 在代码中,SL和TP的动作是有时间限制的。 午睡时的SL和TP分开,午休时的SL和TP分开 Tretyakov Rostyslav 2021.01.22 17:11 #13568 Alexey Belyakov:所有亲爱的程序员们,大家好我已经为一个问题纠结了一天了,我想不明白。请帮助我解决这个问题。 你能改变运行时间和条数 吗? //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ datetime some_time=TimeCurrent(); #define EXPERT_MAGIC 1010 // MagicNumber эксперта input string TimeStart_1= "12:00:01"; input string TimeStop_1 = "12:03:00"; input string TimeStart_2= "16:05:01"; input string TimeStop_2 = "16:09:00"; input string TimeStart_3= "20:00:11"; input string TimeStop_3 = "20:04:00"; input int BarTrade = 10; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { double Ask = SymbolInfoDouble(NULL, SYMBOL_ASK); double Bid = SymbolInfoDouble(NULL, SYMBOL_BID); double SL=0; double TP=0; datetime tm=TimeCurrent(); MqlDateTime stm; TimeToStruct(tm,stm); int TimeBarTrade=BarTrade*Period()*60; bool is_siesta=false; if((TimeCurrent()>=StringToTime(TimeStart_1) && TimeCurrent()<=StringToTime(TimeStop_1))|| (TimeCurrent()>=StringToTime(TimeStart_2) && TimeCurrent()<=StringToTime(TimeStop_2))|| (TimeCurrent()>=StringToTime(TimeStart_3) && TimeCurrent()<=StringToTime(TimeStop_3))) {is_siesta=true;} else {is_siesta=false;} if(TimeCurrent()>=StringToTime(TimeStart_1) && TimeCurrent()<=(StringToTime(TimeStop_1)+TimeBarTrade)) { SL=200/_Point; TP=200/_Point; } if((TimeCurrent()>=StringToTime(TimeStart_2) && TimeCurrent()<=(StringToTime(TimeStop_2)+TimeBarTrade))|| (TimeCurrent()>=StringToTime(TimeStart_3) && TimeCurrent()<=(StringToTime(TimeStop_3)+TimeBarTrade))) { SL=100/_Point; TP=100/_Point; } double Lots=1; datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрению datetime static timeOpen = 0; if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_BUY; request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); request.deviation= 5; request.sl = NormalizeDouble(Ask-SL*_Point,_Digits); request.magic = 1010; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки timeOpen = timeBar; } if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_SELL; request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); request.deviation= 5; request.sl = NormalizeDouble(Bid+SL*_Point,_Digits); request.magic = 1010; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки timeOpen = timeBar; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL) if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт. { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ulong magic=PositionGetInteger(POSITION_MAGIC); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции if((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику { request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_BUY; request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY) if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт. { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ulong magic=PositionGetInteger(POSITION_MAGIC); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции if((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику { request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_SELL; request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp } Alexey Belyakov 2021.01.22 20:51 #13569 非常感谢 MakarFX !它的工作就像它应该的那样 ! Tretyakov Rostyslav 2021.01.22 21:44 #13570 Alexey Belyakov: 非常感谢 MakarFX !现在它可以正常工作了 ! 不客气) 1...135013511352135313541355135613571358135913601361136213631364...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这个过程应该写在每一行的后面,其中有一个试图使用订单发送打开一个订单--对吗?
在所有交易 之后, OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()。
在所有交易 之后, OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()。
这必须写在试图使用订单发送开立订单的每一行之后,这样做对吗?
如果我们排除了与以下方面有关的错误
mode_stoplevel, mode_tradeallowed, mode_minlot, mode_lotstep, mode_maxlot
那么,猫头鹰就不会扑向服务器了
如果EA被从图表中删除,它将无法工作,直到我再次手动上传。我怎样才能自动复位?
这个案例必须写在每一行的后面,在这一行中,有一个试图使用ordersend打开一个订单--对吗?
如果我们所说的 "这种情况 "是指检查允许的最小和最大订单量,订单量的阶梯,允许的最大交易数量+订单,自由保证金的充足性(这些都是主要的,验证器最常拒绝的),那么写一个函数 更合理,例如叫它OrderCheck。
然后,在开启任何新的交易之前,只需检查音量。
大约如此。
所有亲爱的程序员们,大家好我已经为一个问题纠结了一天了,我想不明白。请帮助我解决这个问题。
底线。
该工具是RTS期货,周期为M5。
算法必须根据时间改变参数SL和TP,重要的是,如果满足某些条件,未结头寸 不是由TP(request.tp = ....)和反市场订单关闭。
有三个区间:1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.sec>=1 && stm.hour<=12 && stm.sec>=1) 。min<=03) // 从12:00:01 - 12:03:00
2) (stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09) // 16:05:01 - 16:09:00
3)(stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00
在区间 "1) "参数SL和TP=200和200
在间隔 "2)"和 "3)",SL和TP=100和100
问题是:该算法只在当前的开关上固定利润,但我们需要在n个以上的烛台(至少10-15个)保持获利条件
图表周期M5
Alexey Belyakov:
问题是:该算法只在当前的开关上固定利润,但我们需要对n条曲线(至少10-15条)保持获利条件。
M5图期
在代码中,SL和TP的动作是有时间限制的。 午睡时的SL和TP分开,午休时的SL和TP分开
所有亲爱的程序员们,大家好我已经为一个问题纠结了一天了,我想不明白。请帮助我解决这个问题。
你能改变运行时间和条数 吗?
非常感谢 MakarFX !现在它可以正常工作了 !
不客气)