初学者的问题 MQL5 MT5 MetaTrader 5 - 页 963

 
the size of local variables is too large (more than 512 kb)

这个编译时错误是什么意思,我应该如何解决?我有一个大约有80,000行的类。我必须用它来做两个班吗?这是无稽之谈。如果一切都以这种方式限制,那么这个64位版本的意义何在?
 
Juer:
你怎么能知道是什么原因导致了长时间的编译(超过10分钟)。结果ex5文件的重量约为12mb,并不是那么多。我怎样才能诊断和解决导致如此长的编译的原因?

https://www.mql5.com/ru/forum/165399#comment_3968004

优化=0

我想我已经把这个问题解决了。

Время компиляции
Время компиляции
  • 2017.01.02
  • www.mql5.com
Всем привет! Код компилируется очень долго (около минуты). Строк кода - около 4000. От чего зависит время и как можно ускорить...
 
当修改一个订单时,OrderGetDouble 所指向的订单必须在point= 之前指定。
 
Ivan Ivanov:
当修改一个订单时,我们应该在点= 之前指定OrderGetDouble 所指向的订单。

谢谢你,伊万,我正在尝试,但对我来说没有效果。

我不明白这个逻辑本身,如何按类型而不是按票据选择修改的订单,然后参考其属性。

我不明白这个逻辑,因为在订单修改本身中,票据是必须填写的字段,没有订单类型。

m_trade.OrderModify(ticket,Bid-(SHAG_s*_Point),Ask+((SLL_s-SHAG_s) *_Point),Ask-((TPP_s+SHAG_s)*_Point),0,0,0);

在我的案例中,有两个未结订单:Buy_Stop 和 Sell_Stop。他们开放的顺序可以是任何。

票号对我来说没有任何帮助。

在检查条件中,我可以发现Sell_Stop(例如)是否在未结订单中。

但我找不到我应该如何处理这个特定的订单Sell_Stop,以便当OrderModify 被调用时

来准确修改Sell_Stop,而不是碰巧在票据下的东西。

我有一种感觉,语言的语法让我去看票据中的所有订单,只是为了在OrderModify 中填写票据字段。

这就是我对订单修改感到困惑的地方。我失去了这个过程的逻辑。

 

是否有附加到EA图表的功能?像ChartIndicatorAdd()

或者,如果没有模板,我怎样才能以编程方式将EA附加到一个给定的图表上?

 

如何翻译成mql5?

OP_LOTS = (((AccountBalance() * _LosPercent) / 100) / MarketInfo(Symbol(), MODE_TICKVALUE)) / (pp);
        OP_LOTS = MathRound(OP_LOTS / MarketInfo(Symbol(), MODE_LOTSTEP)) * MarketInfo(Symbol(), MODE_LOTSTEP);
        OP_LOTS = MathMax(OP_LOTS, MarketInfo(Symbol(), MODE_MINLOT));
        OP_LOTS = MathMin(OP_LOTS, MarketInfo(Symbol(), MODE_MAXLOT));
 
Sprut112:

我如何翻译成mql5?

double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
double lotMax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotMin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
将在两个版本中工作。
 

请告知。

帮助中有一个例子:用订单工作的一般算法。

  {
//--- получим общее количество ордеров
   int orders=OrdersTotal();
//--- пробежим по списку ордеров
   for(int i=0;i<orders;i++)
   {
   ResetLastError();
//--- скопируем в кэш ордер по его номеру в списке
   ulong ticket=OrderGetTicket(i);
   if(ticket!=0)// если ордер успешно скопирован в кэш, работаем с ним
   {
   double price_open   =OrderGetDouble(ORDER_PRICE_OPEN);
   datetime time_setup =OrderGetInteger(ORDER_TIME_SETUP);
   string symbol       =OrderGetString(ORDER_SYMBOL);
   long magic_number   =OrderGetInteger(ORDER_MAGIC);
   if(magic_number    ==m_magic)
   {
//  обработаем ордер с заданным ORDER_MAGIC
   }
   PrintFormat("Ордер #%d по %s был выставлен %s, ORDER_MAGIC=%d",ticket,symbol,TimeToString(time_setup),magic_number);
   }
   else  // вызов OrderGetTicket() завершился неудачно
   {
   PrintFormat("Ошибка при получении ордера из списка в кэш. Код ошибки: %d",GetLastError());
   }
   }
  }

在编译时,我得到了一个关于datetime 类型的警告,显然,有一个类型转换的冲突。

我不明白问题出在哪里;根据帮助,ORDER_TIME_SETUP日期类型

问题是什么,如何解决?

 
vladzeit:

请告知。

帮助中有一个例子:用订单工作的一般算法。

在编译时,我得到了一个关于datetime 类型的警告,类型转换一定有冲突。

我不明白问题出在哪里;根据帮助,ORDER_TIME_SETUP日期类型

问题是什么,如何解决?

datetime time_setup =(datetime)OrderGetInteger(ORDER_TIME_SETUP);
//....
long magic_number   =(long)OrderGetInteger(ORDER_MAGIC);

OrderGetInteger应该被转换为正确的类型,与INT相同

 
Konstantin Nikitin:

OrderGetInteger需要被转换为正确的类型,与INT相同

谢谢你的例子。

请澄清一下...如果我理解正确的话。

我们告诉OrderGetInteger采用显式的数据类型,而this=(datetime)OrderGetInteger?

这条规则是否适用于所有没有明确类型或与被赋值的变量类型不匹配的函数? 或者这只是一种特殊情况?

我想了解这是否是一个规则,或者只是需要作为一个特殊情况来记住。