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のExpert Advisorの冒頭に以下の行を記述すると
#include <fxsaber\HistoryTicks\ArrayResize.mqh> // https://www.mql5.com/ru/code/20298

を実行すると、ArrayResize または ArrayCopy の実行時にエラーが発生した場合に、詳細な通知を受けることができます。

これにより、配列を介して情報を渡す際の特定しにくい問題を見ることができますが、さらに重要なのは、配列が範囲外 であるためにEAが停止したというメッセージを受け取ることです(EAのせいではありません)。例えば、メモリ不足などの不具合のため。つまり、数時間後に偶然気づくのではなく、EAの異常停止が 起こったことをすぐに知ることができるのです。


HistoryTicksライブラリはすでにこの行を含んでいます(追加する必要はありません)。なぜなら、ツールの主な目的は、実際のアカウントでExpert Advisorと戦うことだからです。


端末のジャーナルには、別のプロジェクトにそのような記録があるだけでした。

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)
 

MQL4の関数MarketInfo(asymbol, MODE_MARGIN_REQUIRED)のMQL5でのアナログを提案してください。

1Lotの買い付けを行うために必要な自由資金を 調達したいのですが。

MQL5のSymbolInfoDouble(symbol, ...)関数の様々なバリエーションを試しましたが、正しいバリエーションは見つからず、どこでも0を返します。

 
Elena Baranova:

MQL4の関数MarketInfo(asymbol, MODE_MARGIN_REQUIRED)のMQL5でのアナログを提案してください。

1Lotの買い付けを行うために必要な自由資金を 調達したいのですが。

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);

とすぐにリファレンスを表示します。

アカウント・マージン・フリー

ポジションを建てるために利用可能な、預金通貨での口座内の自由資金の大きさ

AccountInfoDouble


と2が最小限のチェックです。

   //--- вызовем функцию проверки
   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:

記事では真面目に勉強することを教えている一方で

この例では、取引注文を送信する前にチェックする機能まで完全に提供されています。


ひとつ。

とすぐさまリファレンスに。

アカウント・マージン・フリー

ポジションを建てるために利用可能な、預金通貨による口座内の自由資金の大きさ

AccountInfoDouble


と2 - 最小限のチェック。

私が必要としないポジションを開くために利用可能な預金の通貨で口座内の自由資金のサイズ

ロットサイズを残高の%で計算しています。

1ロットの買い付けを開始するために必要な利用可能資金 量を知りたい のですが。