新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1551 1...154415451546154715481549155015511552155315541555155615571558...1953 新评论 Vladislav Andruschenko 2021.07.30 10:21 #15501 natawik:大家好,请帮助我我有一个这样的问题。我从mql5 买了一个vpc,一切工作正常,自己安装了一个专家,设置了8个图表,并设置了一个专家。我把整个事情转移到vpc。我不得不从我的电脑上卸载metatrade,因为它不是我的。而现在当我从电脑里进去的时候。一切都在运作,专家。它可以工作,但我看不到它,无法对设置进行任何修改。我怎样才能归还EA和时间表,以便我可以从我的电脑上管理它们?谢谢你! 你需要为这种情况保存配置文件。为了以后在万国邮联下上传。 законопослушный гражданин 2021.07.30 10:45 #15502 谁知道如何将报告中的所有数据不失真地导出到exel? 如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。 无论我怎么保存,都无法摆脱这个问题。 Alexey Viktorov 2021.07.30 10:55 #15503 законопослушный гражданин:谁知道如何将报告中的所有数据不失真地导出到exel?如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。无论我怎么保存,都无法摆脱这个问题。 在上传之前,或在打开导出的文件之前,在Excell中把整数部分 和小数部分 之间的分隔符换成一个点。 Tretyakov Rostyslav 2021.07.30 10:57 #15504 законопослушный гражданин:谁知道如何将报告中的所有数据不失真地导出到exel?如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。无论我怎么保存,都无法摆脱这个问题。 所以 Alexey Viktorov 2021.07.30 11:04 #15505 SGarnov:也许你还应该考虑到被触发的停止次数。例如,EA 会在历史上找到一个止损点,如果有两个,它应该把它们都加到三个或四个,这完全取决于外部设置 "止损点的数量"。 在你的情况下,最好的事情是,不仅在你的情况下,而且在大多数情况下,不要用搜索关闭的订单转向交易历史,而是在一个数组中保留未结订单的票据。定期翻阅数组,检查这个订单是否被一个简单的条件所关闭。 if(OrderCloseTime() != 0) // значит ордер закрылся… 如果订单已经关闭,可以通过票据选择并检查它是否以盈利方式关闭。你也可以检查从开仓到止损的距离,并在你母亲允许的范围内增加这一距离。 在所有这些操作之后,我们应该将数组大小 重置为0,并在循环中的当前时刻用开仓的订单的点数重新填充它,增加数组大小。 Natalja Moisejonok 2021.07.30 11:45 #15506 Vladislav Andruschenko:你必须为这种场合保存档案。为了以后在万国邮联下上传。 如果我关掉VPN,把所有东西都放回去,再把VPN打开,把所有的图和EA都转给你呢?不会有任何关于你的旧数据,对吗? Mikhail Rudyk 2021.07.30 12:07 #15507 你好 帮助我理解代码 附上一段有类的代码,一切工作正常,但 我想把类中的一些函数连接到我自己的一个单独的函数中,并写入错误 例子 void OpenHandPosition(int tp) { string lot=0.01 bool response = actionTrade.ManageOrderSend(tp, lt, 0, 0, 0, 0, 0);// } 它的工作原理是这样的 而这并不奏效 void OpenHandPosition(int tp) { int stopLoss = GetStopLossPoints(size); int takeProfit = GetTakeProfitPoints(); bool response = actionTrade.ManageOrderSend(tp, lt , stopLoss, takeProfit, 0, 0, 0); } 这个功能是有效的 void StrategyTrader::DoEntryTrade(TradeDirection tradeDir) 而这个人却没有 OpenHandPosition(int tp) 帮助 附加的文件: test.mq5 21 kb Tretyakov Rostyslav 2021.07.30 12:14 #15508 SGarnov:我得出的结论是,这很难实现,你的代码更简单,更清晰,更有逻辑性,但.....,不知为何也没有加起来。最主要的是不要放弃。 这似乎是可以的。试试吧,问问... //+------------------------------------------------------------------+ //| SGarnov.v2.1.mq4 | //| Copyright 2020, DrMak. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, DrMak." #property link "https://www.mql5.com" #property version "1.00" #property strict //--- input parameters input int T_Profit = 2; // Коэффициент Take Profit input int S_Loss = 200; // Уровень Stop Loss input double O_Lots = 0.01; // Лоты input int SL_Count = 2; // Количество убыточных ордеров input int Slippage = 30; // Проскальзывание input int N_Magic = 888; // Magic datetime T_Start; double sl_price,tp_price,t_profit,s_loss; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Comment(""); //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- t_profit = S_Loss*T_Profit * Point(); tp_price = NormalizeDouble(t_profit+GetPointLoss(), Digits); //--- s_loss = MathMax(S_Loss, MarketInfo(_Symbol, MODE_STOPLEVEL)) * Point(); sl_price = NormalizeDouble(s_loss, Digits); //--- // Удаляем отложенный ордер после профита if(CountOrders(-1)==1) DeletePending(); //--- // Проверяем серию убыточных ордеров if(CountOrders(-1)==1&&GetLossOrders()<SL_Count) { // Устанавливаем отложенный ордер SendPending(); } //--- // Проверяем наличие ордеров if(CountOrders(-1)>0) { // Устанавливаем StopLoss/TakeProfit ModifyOrder(); } //--- int a=(int)TimeStart(); int b=GetLossOrders(); int c=(int)((GetPointLoss()+t_profit)/Point); Comment("Время начала цикли: ",TimeToStr(a,TIME_SECONDS),"\n", "Серия StopLoss ордеров: ",b,"\n", "Размер TakeProfita: ",c); } //+------------------------------------------------------------------+ //| Модификация ордера | //+------------------------------------------------------------------+ void ModifyOrder() { double op=0; for(int pos=OrdersTotal()-1;pos>=0;pos--) { if(OrderSelect(pos,SELECT_BY_POS)==true) { if(OrderSymbol()==_Symbol) { if(OrderStopLoss()==0) { if(OrderType()==OP_BUY) {op=OrderOpenPrice(); if(OrderModify(OrderTicket(), OrderOpenPrice(), op-sl_price, op+tp_price, OrderExpiration())) {Print("Ордер модифицирован");} else {Print("Ошибка модификации ордера:", GetLastError());} } if(OrderType()==OP_SELL) {op=OrderOpenPrice(); if(OrderModify(OrderTicket(), OrderOpenPrice(), op+sl_price, op-tp_price, OrderExpiration())) {Print("Ордер модифицирован");} else {Print("Ошибка модификации ордера:", GetLastError());} } } } } } } //+------------------------------------------------------------------+ //| Подсчет ордеров по типу | //+------------------------------------------------------------------+ //| 0 - ордера типа BUY 1 - ордера типа SELL | //| 2 - ордера типа BUYLIMIT 3 - ордера типа SELLLIMIT | //| 4 - ордера типа BUYSTOP 5 - ордера типа SELLSTOP | //| 6 - ордера типа Balance -1 - Все типы ордеров | //+------------------------------------------------------------------+ int CountOrders(int or_ty=-1) { int cnt=0; for(int pos=OrdersTotal()-1;pos>=0;pos--) { if(OrderSelect(pos,SELECT_BY_POS)==true) { if(OrderSymbol()==_Symbol) { if(or_ty<0 || or_ty==OrderType()) cnt++; } } } return(cnt); } //+------------------------------------------------------------------+ //| Установка отложенного ордера | //+------------------------------------------------------------------+ void SendPending() { double op=0; for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS)==true) { if(OrderSymbol()==_Symbol) { if(OrderType()==OP_BUY) { if(OrderStopLoss() != 0) { op=OrderStopLoss(); if(OrderSend(_Symbol,OP_SELLSTOP,O_Lots,op,Slippage,0,0,NULL,N_Magic)) {Print("Отложенный ордер установлен");} else {Print("Ошибка установки отложеного одера: ", GetLastError());} } } if(OrderType()==OP_SELL) { if(OrderStopLoss() != 0) { op=OrderStopLoss(); if(OrderSend(_Symbol,OP_BUYSTOP,O_Lots,op,Slippage,0,0,NULL,N_Magic)) {Print("Отложенный ордер установлен");} else {Print("Ошибка установки отложеного одера: ", GetLastError());} } } } } } } //+------------------------------------------------------------------+ //| Возвращает пункты убытка закрытых ордеров с начала цикла | //+------------------------------------------------------------------+ double GetPointLoss() { double result=0,b=0,s=0;; int i=OrdersHistoryTotal(); for(int pos=0; pos<i; pos++) { if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol()==_Symbol) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(OrderProfit()<0) { if(OrderCloseTime()>=TimeStart()) { if(OrderType()==OP_BUY) { b+=OrderOpenPrice()-OrderClosePrice(); } if(OrderType()==OP_SELL) { s+=OrderClosePrice()-OrderOpenPrice(); } } } } } } } return(b+s); } //+------------------------------------------------------------------+ //| Удаление отложенного ордера | //+------------------------------------------------------------------+ void DeletePending() { for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS)==true) { if(OrderSymbol()==_Symbol) { if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) { if(OrderMagicNumber() == N_Magic) { if(OrderDelete(OrderTicket())) {Print("Отложенный ордер удален");} else {Print("Ошибка удаления отложеного одера: ", GetLastError());} } } } } } } //+------------------------------------------------------------------+ //| Возвращает время начала цикла | //+------------------------------------------------------------------+ datetime TimeStart() { datetime ts1=0,ts2=0; if(OrdersTotal()!=0) { for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS)) { if(OrderMagicNumber()!=N_Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(OrderSymbol()==_Symbol) { if(ts1<OrderOpenTime()) { ts1=OrderOpenTime(); } } } } } } for(int pos=0; pos<OrdersHistoryTotal(); pos++) { if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) { if(OrderMagicNumber()!=N_Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(OrderSymbol()==_Symbol) { if(ts2<OrderOpenTime()) { ts2=OrderOpenTime(); } } } } } } } return(MathMax(ts1,ts2)); } //+------------------------------------------------------------------+ //| Возвращает кол-во серии убыточных ордеров | //+------------------------------------------------------------------+ int GetLossOrders() { int cnt=0; int i=OrdersHistoryTotal(); for(int pos=0; pos<i; pos++) { if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY)) { if((OrderSymbol()==_Symbol)) { if(OrderCloseTime()>=TimeStart()) { if(OrderProfit()<0) cnt++; } } } } return(cnt); } //+------------------------------------------------------------------+ SGarnov 2021.07.30 12:32 #15509 MakarFX:这似乎是可以的。试试吧,问问... 谢谢你的帮助,只有在下周我才能写出EA的正确性,今天是周五,我不再寻找市场进入 价格了。 Vladislav Andruschenko 2021.07.30 12:38 #15510 natawik: 如果我关闭VPN,把所有东西都放回去,然后再打开VPN,把所有东西都转给你,图形和专家顾问怎么办?不会有任何关于你的旧数据,对吗? 我经常遇到这样的问题,当我设置一台电脑,配置终端,然后迁移一切,继续工作,改变图形,等等,然后砰的一声,有些东西需要被改变....。我必须重新做一遍。 1...154415451546154715481549155015511552155315541555155615571558...1953 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
大家好,请帮助我
我有一个这样的问题。我从mql5 买了一个vpc,一切工作正常,自己安装了一个专家,设置了8个图表,并设置了一个专家。我把整个事情转移到vpc。
我不得不从我的电脑上卸载metatrade,因为它不是我的。
而现在当我从电脑里进去的时候。
一切都在运作,专家。它可以工作,但我看不到它,无法对设置进行任何修改。我怎样才能归还EA和时间表,以便我可以从我的电脑上管理它们?
谢谢你!
你需要为这种情况保存配置文件。为了以后在万国邮联下上传。
谁知道如何将报告中的所有数据不失真地导出到exel?
如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。
无论我怎么保存,都无法摆脱这个问题。
谁知道如何将报告中的所有数据不失真地导出到exel?
如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。
无论我怎么保存,都无法摆脱这个问题。
在上传之前,或在打开导出的文件之前,在Excell中把整数部分 和小数部分 之间的分隔符换成一个点。
谁知道如何将报告中的所有数据不失真地导出到exel?
如果我只是复制 "利润 "一栏中的一些数据,就会以日期形式导出,如94年1月而不是1.94。
无论我怎么保存,都无法摆脱这个问题。
所以
也许你还应该考虑到被触发的停止次数。例如,EA 会在历史上找到一个止损点,如果有两个,它应该把它们都加到三个或四个,这完全取决于外部设置 "止损点的数量"。
在你的情况下,最好的事情是,不仅在你的情况下,而且在大多数情况下,不要用搜索关闭的订单转向交易历史,而是在一个数组中保留未结订单的票据。定期翻阅数组,检查这个订单是否被一个简单的条件所关闭。
如果订单已经关闭,可以通过票据选择并检查它是否以盈利方式关闭。你也可以检查从开仓到止损的距离,并在你母亲允许的范围内增加这一距离。
在所有这些操作之后,我们应该将数组大小 重置为0,并在循环中的当前时刻用开仓的订单的点数重新填充它,增加数组大小。
你必须为这种场合保存档案。为了以后在万国邮联下上传。
你好
帮助我理解代码
附上一段有类的代码,一切工作正常,但
我想把类中的一些函数连接到我自己的一个单独的函数中,并写入错误
例子
它的工作原理是这样的
而这并不奏效
这个功能是有效的
void StrategyTrader::DoEntryTrade(TradeDirection tradeDir)
而这个人却没有
OpenHandPosition(int tp)
帮助
我得出的结论是,这很难实现,你的代码更简单,更清晰,更有逻辑性,但.....,不知为何也没有加起来。最主要的是不要放弃。
这似乎是可以的。试试吧,问问...
这似乎是可以的。试试吧,问问...
谢谢你的帮助,只有在下周我才能写出EA的正确性,今天是周五,我不再寻找市场进入 价格了。
如果我关闭VPN,把所有东西都放回去,然后再打开VPN,把所有东西都转给你,图形和专家顾问怎么办?