初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 963

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

このコンパイルタイムエラーは何を意味し、どのように修正すればよいのでしょうか?約8万行のクラスがあります。2クラス分作らないといけないの?これはナンセンスだ。このようにすべてが制限されるのであれば、この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 が参照するオーダーを指定してからpoint= を指定する。

Ivanさん、ありがとうございます。試しているのですが、私にはうまくいきません。

チケットではなくタイプで修正対象のオーダーを選択し、そのプロパティを参照する方法、ロジックそのものが理解できません。

注文の変更自体ではチケットは必須項目で、注文の種類はないので、ロジックが理解できない。

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という2つの未決済注文があります。開封の順序は問わない。

チケット番号は、ここでは何の役にも立ちません。

チェック条件では、Sell_Stop(例えば)がオープンオーダーの中にあるかどうかを知ることができますね。

しかし、この注文のSell_Stopにどのように対処すればよいのかがわかりません。

をクリックすると、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はdatetime であるとのことですが、何が問題なのか理解できません。

何が問題で、どうすれば解決するのか?

 
vladzeit:

アドバイスをお願いします。

ヘルプに例があります: オーダーを使った作業の一般的なアルゴリズム。

コンパイル時にdatetime 型で警告が出ますが、どうやら型変換の衝突があるようです。

ヘルプによると、ORDER_TIME_SETUPはdatetime であるとのことですが、何が問題なのか理解できません。

何が問題で、どうすれば解決するのか?

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

OrderGetIntegerは正しい型に変換する必要があります。INTと同じ です。

 
Konstantin Nikitin:

OrderGetIntegerは正しい型に変換する必要があります。INTと同じ です。

例を挙げていただきありがとうございます。

はっきりさせてください...というのは、私の理解が正しければですが。

this=(datetime)OrderGetInteger とすることで、OrderGetInteger に明示的にdatetime型を 採用するように指示しています。?

このルールは、型が明示されていない、あるいは代入される変数の型と一致しないすべての関数に適用されるのでしょうか? それとも、特別な場合だけなのでしょうか?

これはルールなのか、それとも特別なケースとして覚えておく必要があるのか、理解したいのです。

理由: