グローバル初期化に失敗した!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ページ 5

 
deysmacro:
Comment() は、ほとんどの場合、チャートに影響を与えない。

  if(ObjectFind(Symbol()+"Lot_Size_Label")==0)
   {         
  int x_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_XDISTANCE);
  int y_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_YDISTANCE);
  Comment(x_check+ " , "+y_check); 
   }

Comment()で、座標データが何であるかを確認 する。

ラベルが右に行くと変わるはずですが、変わりません。

つまり、座標はあるべき姿なのです。

ラベルは右へ消えていきます。

 

座標はXDISTANCE = 225; YDISTANCE = 27; CORNER = 3です。

まず、チャート上にインディを読み込むと、ラベルは所定の位置にある。

2つ目は、MT4を閉じて再起動すると、ラベルが右に移動します。

3番目は、Tfを移動させた後、ラベルが後ろにジャンプします。

Cornerの計算に関係するAnchorsの関係で、B646のバグに違いない。

 
グローバル初期化に失敗したことと、何か関係があるのでしょうか?
 
SDC:
グローバル初期化失敗と何の関係があるんだ?

あのB646はマジでバグってる!
 
Dadas:


ありがとうございます。deinit時にオブジェクトが削除されないというのは私も同じ問題でした。

私はあるインディを開発していたのですが、このような奇妙な結果になりました。

一番簡単な方法は、start()の中でObjectDelete()をすることです。

init()をOnInit()に、deinit()をOnDeinit()に変更したら、ラベルが正しく表示されるようになりました!ありがとうございます!

その後、しばらくすると、そうじゃなくなった!!!まだ同じ踊りを続けています。


どういたしまして、ダダス。でも、スタートメソッドでObjectDelete() を使うのはやめとこう。それはOnDeInit()の中で行うのがベストだ。その理由は、OnStart()やOnCalculate()にコードを書くと、ティックが来るたびに実行されることになるからだ。それは2つの理由で悪いことです。1) リアルタイム・アプリケーションで無駄にできない時間を使って、多くのオペレーションを追加することになる。価格の変化が何らかの形でオブジェクトに影響を与える場合のみ、"startup" メソッドでこれを行うべきです。例として、次のようなものを考えてみましょう(これは私が販売する予定のアプリの一部ですが、これを共有することはクールです :-) )。

// If no trade is progress, there is no Position Value to display
      if (ObjectFind("PositionValue") > 0)
                ObjectDelete("PositionValue");
                
      if (ObjectFind("PipsProfitLoss") > 0)
                ObjectDelete("PipsProfitLoss");
                
      if (ObjectFind("CurrentStop") > 0)
                ObjectDelete("CurrentStop");
                
      if (ObjectFind("PipsLockedIn") > 0)
                ObjectDelete("PipsLockedIn");
                
      if (ObjectFind("ProfitLockedIn") > 0)
                ObjectDelete("ProfitLockedIn");
                
      if (GlobalVariableCheck(CurrentPairPercentageRisk))
         GlobalVariableDel(CurrentPairPercentageRisk);

このコードは、クローズド・トレードから取り残されたオブジェクトが存在する場合に、それを捕捉するものです。

ところで - これは絶対にやってはいけません。

string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(rates_total);

あなたはこのコードの意図を誤解しています。これは、サーバーが「落ち着く」までインディーは実行しないように設計されています。だから0を返しているのです。そうすれば、インディのコードは必要な情報がすべて揃うまで実行されません。正直なところ、OnCalculate()を使う必要がなかったので、まだ使ったことがないのですが、あなたがやっていることは災難への招待だと言えます。有効なデータが得られるまで、このコードを実行しないでください」とプログラムに言っているわけではありませんし、ただ風任せで最善を望んでいるだけです。実のところ、サーバーから信頼できる情報を得られない場合、あなたのコードがどうなるのか、私にはわかりません。必要であれば自分で計算するような情報を不必要に計算して負荷に渡し、必要でないものには手を出さずに計算時間を短縮しているように見えます。これでは何を目指しているのかよくわかりません。

Happy Coding!

 
ProfessorMetal:


どういたしまして、ダダス。でも、スタートメソッドでObjectDelete()を使うのはやめといたほうがいいね。これはOnDeInit()の中で行うのがベストだ。その理由は、OnStart()やOnCalculate()にコードを書くと、ティックが来るたびに実行されることになるからだ。それは2つの理由で悪いことです。1) リアルタイム・アプリケーションで無駄にできない時間を使って、多くのオペレーションを追加することになる。価格の変化が何らかの形でオブジェクトに影響を与える場合のみ、"startup "メソッドでこれを行うべきです。例として、次のようなことを考えてみましょう(これは私が販売する予定のアプリの一部ですが、これを共有することはクールです :-) )。

このコードは、クローズド・トレードから取り残されたオブジェクトが存在する場合、それをキャッチするものです。

ところで、これは絶対にやってはいけないことです。

あなたはこのコードの意図を誤解しています。このコードは、サーバーが「落ち着く」までインディーは実行しないように設計されています。だから0を返しているのです。そうすれば、インディのコードは必要な情報がすべて揃うまで実行されません。正直なところ、OnCalculate()を使う必要がなかったので、まだ使ったことがないのですが、あなたがやっていることは災難への招待だと言えます。有効なデータが得られるまで、このコードを実行しないでください」とプログラムに言っているわけではありませんし、ただ風任せで最善を望んでいるだけです。実のところ、サーバーから信頼できる情報を得られない場合、あなたのコードがどうなるのか、私にはわかりません。必要であれば自分で計算するような情報を不必要に計算して負荷に渡し、必要でないものには手を出さずに計算時間を短縮しているように見えます。これでは何を目指しているのかよくわかりません。

Happy Coding!


いつもありがとうございます

フローティングラベルの答えが見つかった。

どうやら、オブジェクト・アンカーをコードでバインドしなければならないようだ。

https://docs.mql4.com/en/constants/objectconstants/enum_anchorpoint

つまり、次のようなコードを追加する必要があります。

if(Corner==0) Anchor=ANCHOR_LEFT;
if(Corner==1) Anchor=ANCHOR_RIGHT;
if(Corner==2) Anchor=ANCHOR_LEFT;
if(Corner==3) Anchor=ANCHOR_RIGHT; 

を追加し、別の行でオブジェクトを設定する必要があります。

    ObjectSet(objname,OBJPROP_ANCHOR,Anchor);

人生は決して楽にはならない

そして、これは、結局のところ、役に立ちません!

ところで。彼らが何を達成しようとしているのか、教えてあげましょう。

彼らは、できるだけ多くの人がコードをいじるのをやめさせたいのです。

できるだけ商業的でなければならない。

つい最近まで、ほとんど誰でも簡単なmql4をいじることができた。

今は、すべてを商業化することが目標なのです

 
Dadas:

あのB646はマジでバグってる!
そうかもしれませんが、グローバル初期化に失敗したというのは、今回のオブジェクトのアンカーポイント に関する議論とは関係ない、特定のエラーです。
 
ProfessorMetal:


この新しいOnCalculate()メソッドは私には意味がわかりません。必要であれば自分で計算するような負荷情報を不必要に計算して渡しているように見えますし、必要のないものに手を出さないことで計算時間を短縮しているようにも見えます。これでは何を目指しているのかよくわかりません。

Happy Coding!

OnCalculateは、インジケータがすでに処理したバーの数を計算する結果を提供します。これは古いIndicatorCounted関数を 置き換えるものです。また、シリーズ配列が参照渡しであるため、mql5との互換性を実現しています。コーディングの観点からは、ほとんど違いはありません。

 

改めて、ダダスさん、よろしくお願いします。ANCHORプロパティを 使うことは、私の作品でも活用しているのに、忘れていました。

SDC、情報ありがとうございます。ドキュメントでは、その目的があまり明確になっていないのでロシア語から英語への翻訳で意味がわからなくなったのではと思います。今、それはより意味をなします。OnStart()の代わりに使うものではなく、IndicatorCounted()の代わりに使うものだと推測します。IndicatorCounted()をOnCalculate()に置き換える「前」と「後」のような例を示すドキュメントを提供するのは、良い追加になると思います。あなたの説明を踏まえてドキュメントを見直し、どのようにピースが組み合わされるかを確認する必要がありますね。本当にありがとうございました。

Prof

 

int start()の代わりにint OnCalculate()を使っていますね。start()と同じようにtick毎に 実行されます。実行前と実行後はこのようになります。

int start()
  {
   int i=0, limit=0;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//----
   limit = Bars-counted_bars-1;
   for (i = limit; i >= 0; i--)
   {
//---- indicator calculations
   }
   return(0);
  }

//--------------------------------------------------
//--------------------------------------------------

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   int i=0, limit=0;
//--- check for possible errors
   if(prev_calculated < 0) return(-1);
//---
   limit = rates_total-prev_calculated;
   for(i = limit; i >= 0; i--)
   {
//--- indicator calculations
   }
   return(rates_total);
  }

OnCalculateの正式なパラメータは、それをより自己完結させ、コーダーはすべての種類のグローバルの呼び出しに依存する必要がありません、それは明らかにOOP界では悪いコーダーで、手首を叩くことです。実際には、どちらを使っても大差はない。また、OnCalculateはmql5と同じなので、互換性のあるコードを書くことができます。