エラー、バグ、質問 - ページ 1593

 
スマートフォンやLC、μlサイトのトップページに製品回収のメッセージが表示されない。
 


魔法のスクリプトは時間を逆行させる ;-)

魔法のスクリプトは時間を逆行させる ;-)

 
Vladimir Pastushak:
スマートフォンに製品レビューのメッセージが表示されるが、LCやmclサイトのトップには表示されない。
昔からそうなんですが、感想を残すとおかしいから載せてくれとまで言われた記憶がありますし、すぐに質問されても2ヶ月経ってから気づくということもありますね。:-)
 

バグではないけれど、共有せずにはいられない

ライティング

if((!IsRunOnTester() && TimeCurrent() >= D'2016.06.31 23:59'))// для тестировщиков, ограничение работы по времени

コンパイラが警告を出す

無効な日付 *****.mq4 115 46

文字列の日付が有効かどうかもチェックされるんですね、ショックです )(6月30日)

 

どうやら誰も気にしていないようですが、また書きますね。

実際の作業は、空きメモリの100%程度の合計サイズの配列を作り、そこに素早く数値を詰め、計算を行い、解放することである。

で空きメモリサイズを取得するようにしています。

int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);

結果:23987MB、私の物理メモリは12141MB、つまり半分の量です。

この図は火星人のものだと理解しているのですが、それでも信じてスクリプトを書いて検証しています。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
#define  PARTS 5

   srand(GetTickCount());
//---
   int mem_free_mb=(int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);
   //mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.
   long mem_for_calc=(long)((double)mem_free_mb*1024*1024);
   long mem_one_part=(long)floor((double)mem_for_calc/PARTS);
   if(mem_one_part>=INT_MAX-1)
      mem_one_part=INT_MAX-1;
//---
   printf("Memory for calc: %0.f MB, parts: %d, part: %0.f MB",mem_for_calc/1024/1024,PARTS,mem_one_part/1024/1024);
   char array1[];
   char array2[];
   char array3[];
   char array4[];
   char array5[];

   int res=ArrayResize(array1,(int)mem_one_part);
   Print("Array1 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",1.0*mem_one_part/1024/1024);

   res=ArrayResize(array2,(int)mem_one_part);
   Print("Array2 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",2.0*mem_one_part/1024/1024);

   res=ArrayResize(array3,(int)mem_one_part);
   Print("Array3 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",3.0*mem_one_part/1024/1024);

   res=ArrayResize(array4,(int)mem_one_part);
   Print("Array4 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",4.0*mem_one_part/1024/1024);

   res=ArrayResize(array5,(int)mem_one_part);
   Print("Array5 Resize: ",res);
   if(res<1)return;
   printf("Reserved: %0.f MB",5.0*mem_one_part/1024/1024);

   uint gtc=GetTickCount();
   for(int i=0;i<mem_one_part;i++)
     {
      char ch=(char)rand();
      array1[i]=ch;
      array2[i]=ch;
      array3[i]=ch;
      array4[i]=ch;
      array5[i]=ch;
     }
//---
   printf("Spent time: %d ms",GetTickCount()-gtc);
  }

メモリがなくなったので、array3 を割り当てることはできません」という論理的な結果を得ました。

そして、現在使用可能なメモリ量を指定する行をアンコメントします。

mem_free_mb=5300;//<--- Столько показывает 'Доступной' в диспетчере задач.

その後、スクリプトは正常に実行されます。

開発者の方々の迷惑にならないようにしたいのですが、メモリがどれだけ使えるかは重要です。

TerminalInfoIntegerで 知ることができるようにしてください。

 

ほとんどの場合、利用可能なすべてのメモリを取り出すことができないことをご存知ですか?

メモリの断片化というものがあります。すべてのメモリを5つのフラグメントに分割することにしましたが、システムには必要なサイズの、途切れることのないメモリのフラグメントが1つもありません。

 
Slawa:

ほとんどの場合、利用可能なすべてのメモリを取り出すことができないことをご存知ですか?

メモリの断片化という考え方があります。あなたはすべてのメモリを5つのフラグメントに分割することに決めました。しかし、システムにはあなたが必要とするサイズの連続したメモリフラグメントが1つもありません。

1.TERMINAL_MEMORY_AVAILABLE パラメータが物理的に何を意味するのか、まず知ることができますか?

2.フラグメントについては、プログラマではなく、Windowsのメモリマネージャが処理すべきものだと思います。

例えば、利用可能なメモリの50%を使いたいなど、ある瞬間にどれくらい使えるかを知る必要があります。

もう一つの実作業は、CopyTicksのリクエストです。利用可能なメモリより多くのティックを要求すると、「メモリ不足」になります。

 
Andrey Voytenko:

もう一つ、本当に難しいのはCopyTicksのリクエストです。利用可能なメモリより多くのティックを要求すると、「メモリ不足」になります。

または、データをファイルにアンロードし、そこから必要なセグメントを取り出す。
 
coderex:
あるいは、データをファイルにアップロードして、そこから必要なセグメントを取り出すことも可能です

私にしては遅いな。すべて記憶で行いたい。実は今やっているのですが、利用可能なメモリのサイズを知るためにGlobalMemoryStatusExを呼び出す必要があるんです。


	          
 
Andrey Voytenko:

この問題は、最初から何も知らないクラウドエージェントで最適化する場合に特に深刻です。 MQLでもWinApiでも(DLL呼び出しが禁止されているため)、そこで利用できるメモリの本当の量を判断することはできません。

TERMINAL_MEMORY_AVAILABLEの実用的な意味は何なのでしょうか? 幸せにも不幸にもならないのに、なぜ導入するのでしょうか?