新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1178

 
Aleksey Mavrin:

我们是在谈论测试器还是在线?

如果在线--看一下代码,某处的移动事件没有正常路由。顺便说一下,网站上的面板只有五个不同的库,你是什么意思?

而在测试器中--似乎没有办法,也不知道为什么。

在向所有面板对象发送移动命令后,执行ChartRedraw()
 
Aleksey Mavrin:

你是在说测试器还是在线?

如果在线--看一下代码,某处的移动事件没有正常路由。顺便说一下,网站上的面板只有五个不同的库,你是什么意思?

而在测试器中--似乎没有办法,也不知道为什么。

我们谈论的是在线。我真的不需要在测试器中使用它。我不确定库的情况--我不是编程方面的专家。我只是从MQL5参考中提取了一个现成的按钮代码。

我已经做过了,而且会便宜很多。显然,这就是为什么按钮的位置在下一个刻度上被更新。我不明白如何使按钮与背景一起移动。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Artyom Trishkin:
在向所有面板对象发送移动命令后,执行ChartRedraw()
我试过这样做,但没有成功。
   ObjectSetInteger(0, "Buy",            OBJPROP_XDISTANCE, x + 2);
   ObjectSetInteger(0, "Buy",            OBJPROP_YDISTANCE, y + 2);
   ChartRedraw();
  
   ObjectSetInteger(0, "Sell",           OBJPROP_XDISTANCE, x + 74);
   ObjectSetInteger(0, "Sell",           OBJPROP_YDISTANCE, y + 2);
   ChartRedraw();
 
请帮助我理解。我有一个交易面板的代码,在订单没有触发的情况下,打开一个挂起的 买入止损订单,并进行后续跟踪。我在日志中没有看到任何错误,也没有尝试修改订单。我试图通过日志追踪在哪个阶段发生的错误,使用函数:
Print("Ордер Выбран!");

只是在每个if条件之后插入了它。

结果,我发现,这个功能。

 for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))  

成功选择订单进行,但如果在此代码后插入 Print("Order Selected!");

if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOp
en())

则发生错误。

2020.06.17 01:38:24.136 2020.01.02 07:40:00 修改订单#2买入止损0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [无效的价格]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: modify #2 at 1.00000 (sl: 1.00000 tp: 1.00000) [无效的价格]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 BUY STOP修改失败!结果Retcode:10015,Retcode的描述:无效的价格

我在另一个自动交易的EA中使用同样的代码(唯一的区别是没有这样的代码)。

ObjectGetInteger(0, "Buy Stop", OBJPROP_STATE) == true


),我没有任何问题。订单的打开和修改都没有任何问题。

下面是代码本身。

     double Ask          = NormalizeDouble(PriceInformation_High_Buy[HighestCandle_High_Buy].high, _Digits) + indent; // максимум самой высокой свечи плюс отступ
     double sl_buy       = NormalizeDouble(PriceInformation_Low_Buy[LowestCandle_Low_Buy].low, _Digits) - indent;     // минимум самой низкой свечи минус отступ  
     double tp_buy       = Ask + ((Ask - sl_buy) * Профит_фактор);                                                    // количество стопов лоссов 
     
     if  (OrdersTotal()==0 && PositionsTotal()==0 &&                                         // проверка на наличие открытых позиций и ордеров
     ObjectGetInteger(0, "Buy Stop", OBJPROP_STATE) == true)                                 // проверка состояния кнопки
                                                                                             
     {
        atrade.BuyStop(Lots, Ask, _Symbol, sl_buy, tp_buy, ORDER_TIME_GTC, 0, "My comment"); // посылаем ордер Buy Stop
        ObjectSetInteger(0, "Buy Stop", OBJPROP_STATE, false);                               // отжимаем кнопку
     }

     else

     ObjectSetInteger(0, "Buy Stop", OBJPROP_STATE, false);                                  // отжимаем кнопку
       
//---Трейлинг Buy Stop---------------------------------------------------------------------------------------------------------------------------//     
      
        for(int i=OrdersTotal()-1;i>=0;i--)
          if(aorder.SelectByIndex(i))                                                                      // выбираем ордер 
       
            if(aorder.Symbol()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOpen()) // проверяем символ, мэджик номер, цену
               
              {
                 if(aorder.OrderType()==ORDER_TYPE_BUY_STOP)
                 Print("Ордер Выбран!"); 
                 if(aorder.PriceCurrent()<aorder.PriceOpen())
                 
                    {
                     if(atrade.OrderModify(aorder.Ticket(),
                        asymbol.NormalizePrice(Ask),
                        asymbol.NormalizePrice(sl_buy),
                        asymbol.NormalizePrice(tp_buy),
                        aorder.TypeTime(),
                        aorder.TimeExpiration()))
                        Print("Модификация BUY STOP прошла успешно! Тикет ордера = ",atrade.ResultOrder());
                     else
                        Print("Модификация BUY STOP прошла с ошибкой! Result Retcode: ",atrade.ResultRetcode(),
                              ", description of Retcode: ",atrade.ResultRetcodeDescription());
                    }
              }

请告诉我我的错误是什么?

 
Mikhail:

这是关于在线。我真的不需要在测试器中使用它。我无法回答关于库的问题,我在编程方面完全是个傻瓜。我只是从MQL5参考中提取了一个现成的按钮代码。

我已经 做了,但我没有得到任何错误,我还不能修复它。显然,这就是为什么按钮的位置在下一个刻度上 被更新。我不明白如何使按钮随着背景移动。

你又是如何确定它是在下一个刻度上而不是在那个刻度上的呢?)

 
Mikhail:
请帮助理解。有交易面板的代码,以打开待定的 买入止损,如果订单失败,则进行跟踪。订单已经打开,但没有修改订单。 日志中没有显示错误,我们也没有尝试修改订单。我试图通过日志追踪在哪个阶段发生的错误,使用函数:

只是在每个if条件之后插入了它。

结果,我发现,这个功能。

成功选择订单进行,但如果在此代码后插入 Print("Order Selected!");

则发生错误。

2020.06.17 01:38:24.136 2020.01.02 07:40:00 修改订单#2买入止损0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [无效的价格]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: modify #2 at 1.00000 (sl: 1.00000 tp: 1.00000) [无效的价格]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 BUY STOP修改失败!结果Retcode:10015,Retcode的描述:无效的价格

我在另一个自动交易的EA中使用同样的代码(唯一的区别是没有这样的代码)。


),我没有任何问题。订单的打开和修改都没有任何问题。

下面是代码本身。

你能告诉我我的错误是什么吗?

显然,Normalize不能正常工作。Unprint asymbol.Digits() asymbol.TickSize(),.Point()检查。

 

大家好。在访问EA到DLL时面临这个问题。

无法加载'C:\....\shablon.dll' [487]

错误487似乎是指ERROR_INVALID_ADDRESS,但库的路径是正确的。实际上,我已经把这个dll放到了所有的文件夹里,但没有帮助。

会是什么呢?我将感谢您的帮助。


P.S. 起初这个dll是用于32位的,在mt4*86下工作。我为64位重新编译了它,现在把它放在mt5*64上,有这样的问题。



 
Aleksey Mavrin:

你怎么知道下一个刻度是什么,而不是那一个?)

在新的蜱虫到来之前,按钮没有任何移动。这是我的眼睛所能看到的。只要价格发生变化,按钮就会移动。

但今天,即使在新的勾选中,按钮也停止了重绘,尽管我没有改变任何东西。只有背景在动。
 
Aleksey Mavrin:

显然,Normalize不能正常工作。四舍五入到1。Unprint asymbol.Digits() asymbol.TickSize(),.Point()检查。

当我进行这样的查询时。

Print("Symbol ", _Symbol, " Digits ", _Digits, " Point ", Point());

我得到这个结果。

2020.06.17 13:49:53.270 2020.01.02 06:50:00 符号 EURUSD_i 数字 5 点 1e-05

当我提出这样的要求时。

Print("Symbol ",aorder.Symbol(), " Digits ", asymbol.Digits(), " Point ", asymbol.TickSize());

我得到这个结果。

2020.06.17 13:51:58.787 2020.01.02 06:45:00 符号 EURUSD_i 数字 0 点 0.0

同时我想指出,如果我不插入Print函数,我根本没有得到任何错误,订单甚至没有尝试修改自己。仿佛CTrade没有看到我的订单。

检查符号和神奇数字不起作用。

Print("Symbol ", asymbol.Name(), " Magic ", aorder.Magic(), " Ticket ", aorder.Ticket()); 

结果。

2020.06.17 14:37:38.147 2020.01.02 06:50:00 Symbol Magic 0 Ticket 2

神奇的数字应该是12345,符号是欧元美元。

为什么我不能得到象征和medgic?

如果你改变了这个字符串。

aorder.Symbol()==asymbol.Name()

改为

aorder.Symbol()==_Symbol

并删除了通过神奇数字的验证,那么我们的价格就有问题了。

2020.06.17 01:38:24.136 2020.01.02 07:40:00 修改订单#2买入止损0.1 EURUSD_i在1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.00000 [无效价格]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: modify #2 at 1.00000 (sl: 1.00000 tp: 1.00000) [无效的价格]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 BUY STOP修改失败!结果Retcode:10015,Retcode的描述:无效的价格

我已经绞尽脑汁了,而同样的代码在另一个专家顾问中工作正常。

我做错了什么?

Документация по MQL5: Общие функции / Print
Документация по MQL5: Общие функции / Print
  • www.mql5.com
Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно...
 
dozolov:

大家好。在访问EA到DLL时面临这个问题。

无法加载'C:\....\shablon.dll' [487]

错误487似乎是指ERROR_INVALID_ADDRESS,但库的路径是正确的。实际上,我已经把这个dll放到了所有的文件夹里,但没有帮助。

会是什么呢?我将感谢您的帮助。


P.S. 起初这个dll是用于32位的,在mt4*86下工作。我为64位重新编译了它,现在我把它放在mt5*64上,有这样的问题。



ERROR_INVALID_ADDRESS不是关于路径。你传递的是错误的论据。

原因: