mql5语言的特点、微妙之处以及技巧 - 页 166

 
fxsaber:
for (int i =::ArrayResize(TmpSort, ::ArraySize(ARRAY)) - 1; i >= 0; i--)

我不建议你这样写。如果系统不能为阵列分配所需的内存量,程序将继续安静地运行,导致不可预知的后果。

 
Alexey Navoykov:

我不建议你这样写。如果系统不能为阵列分配所需的内存量,程序将继续安静地运行,导致不可预知的后果。

我一定要把它放在真正的账户上。

关于交易、自动交易系统和测试交易策略的论坛

图书馆:HistoryTicks

fxsaber, 2019.09.10 18:58

关于交易、自动交易系统和交易策略测试的论坛

图书馆:HistoryTicks

fxsaber, 2018.12.10 13:55

如果你在任何MT4/5专家顾问的开头写上以下一行
#include <fxsaber\HistoryTicks\ArrayResize.mqh> // https://www.mql5.com/ru/code/20298

然后在执行ArrayResize或ArrayCopy时出现错误时得到详细的通知。

这可以让你看到在通过数组传递信息时难以识别的问题,但更重要的是,得到EA因数组超出范围 而停止的信息(不是EA的错)。例如,由于缺乏内存或其他一些故障。换句话说,你会马上知道EA发生了异常停止,而不是在几个小时后才意外地注意到它


HistoryTicks库已经包含了这一行(不需要添加),因为工具的主要目的--在真实账户上与Expert Advisors作战。


在航站楼的日志中,只有另一个项目有这样的记录。

MemoryException 4471871064 bytes not available, 0 heapmin result


由于插入了这一行,在用户日志中可以看到所发生的详细情况

Alert: ThirdPartyTicks - ERROR in int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int)! - see the logs.
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 64: ::MQLInfoString(MQL_PROGRAM_PATH) = C:\Program Files\ICMarkets - MetaTrader 5\MQL5\Scripts\fxsaber\ThirdPartyTicks.ex5
PROGRAM_SCRIPT
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 66: typename(T) = MqlTick
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 67: sizeof(T) = 60
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 68: Res = -1
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 69: NewSize = 129140
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 70: Reserve = 74402041
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 71: ::ArraySize(Array) = 129139
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 72: PrevSize = 129139
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 73: NewSize*sizeof(T) = 7748400
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 74: PrevSize*sizeof(T) = 7748340
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 75: Reserve*sizeof(T) = 169155164
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 76: ::GetLastError() = 4004
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 77: DuringTime = 1195
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 79: ::TerminalInfoInteger(TERMINAL_BUILD) = 2138
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 80: ::TerminalInfoInteger(TERMINAL_DISK_SPACE) = 6344
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 81: ::TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL) = 16301
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 82: ::TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) = 31530
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 83: ::TerminalInfoInteger(TERMINAL_MEMORY_TOTAL) = 32602
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 84: ::TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1072
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 86: ::ChartID() = 132088214536525342
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 87: ::PeriodSeconds() = 60
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 88: ::Symbol() = EURUSD
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 89: ::TimeCurrent() = 2019.09.10 19:49:15
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 90: ::TimeLocal() = 2019.09.10 19:49:12
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 94: ::SymbolInfoTick(_Symbol,Tick) = true
 time = 2019.09.10 19:49:13.178 bid = 1.10436 ask = 1.10439 last = 0.00000 volume = 0 2 TICK_FLAG_BID
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 97: ::ChartSetInteger(0,CHART_BRING_TO_TOP,true) = true
array out of range in 'Array.mqh' (11,10)
 

请建议在MQL5中对MQL4函数MarketInfo(asymbol, MODE_MARGIN_REQUIRED)进行模拟。

我需要获得开1手买入所需的自由资金数额

我尝试了MQL5中SymbolInfoDouble(symbol, ...)函数的不同变体,我找不到正确的变体,它到处都返回0。

 
Elena Baranova:

请建议在MQL5中对MQL4函数MarketInfo(asymbol, MODE_MARGIN_REQUIRED)进行模拟。

我需要获得开1手买入所需的自由资金数额

我尝试了MQL5中SymbolInfoDouble(symbol, ...)函数的不同变体,我找不到正确的变体,它到处都返回0。

https://www.mql5.com/ru/articles/2555#not_enough_money

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 

我很抱歉,我不明白为什么需要这个链接。我在那里没有看到我问题的答案。

 
Elena Baranova:

我很抱歉,我不明白为什么需要这个链接。我在那里没有看到我问题的答案。

你在这篇文章中到底没有看到什么?

检查的例子。

MQL5

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }
 
Vladimir Karputov:

你在这篇文章中到底没有看到什么?

检查的例子。

MQL5

你需要获得开1手买入所需的自由资金数额

文章中的检查与此有什么关系?

 
Elena Baranova:

需要获得打开1个地段购买所需的可用资金数额

文章中的支票与此有什么关系?

因为这篇文章教导人们要勤奋地学习材料。

这个例子甚至给了你完整的功能,让你在发送交易指令前进行检查。


一。

//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);

并立即进行参考。

帐户余额

账户中可用于开仓的存款货币的自由资金规模

帐户信息双倍


和两个是最低限度的检查。

   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
Документация по MQL5: Информация о счете / AccountInfoDouble
Документация по MQL5: Информация о счете / AccountInfoDouble
  • www.mql5.com
Информация о счете / AccountInfoDouble - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Elena Baranova:

需要获得打开1个地段购买所需的可用资金数额

文章中的支票与此有什么关系?

没想到你会在阅读短代码时遇到困难,那么请阅读帮助https://www.mql5.com/ru/docs/trading/ordercalcmargin

 
Vladimir Karputov:

虽然这篇文章教导人们要勤奋学习材料。

这个例子甚至给出了在发送交易订单之前进行检查的全部功能。


一。

并立即进行了参考。

帐户余额

账户中可用于开仓的存款货币的自由资金规模

帐户信息双倍


和两个--最低限度的检查。

账户中以存款货币计算的自由资金规模,可用于开立我不需要的头寸

我以余额的百分比来计算手数。

我需要得到开1手买入所需的可用资金 数额。