新型MQL4で台無しになった小額紙幣管理-Indicator - ページ 2

 
デイスマクロです。ゼロで割る 原因となる線がどこにあるかは分かっています。過去5日間の日足平均のレンジが必要だからです。この後、インジケーターの中でそのATRで何かを割ると、データが更新されない限りATRはゼロになり、それが問題です。私は、少なくとも過去5日間の日次データが利用可能であることを確認する必要があります。そうすれば、ATRは>0になり、インジケータは動作します。
 
mar:
デイスマクロゼロによる除算を引き起こす行がどこにあるかは分かっています。それは、過去5日間の日足平均レンジが必要だからです。この後、インジケータで何かをATRで割ると、データが更新されない限りATRはゼロになり、それが問題です。私は、少なくとも過去5日間の日次データが利用可能であることを確認する必要があります。そうすれば、ATRは>0になり、インジケータは動作します。

利用可能なデータをGVに入れ、それを取得する。そうすれば、データが来たとき、あるいはデータに違いがあるとき、GVを更新すればよい。

ATRはそのように機能しているのかもしれません。


人はいつも「まず動作させてから、コードを最適化しろ」と言っています。

時々、動作させるために、コードの行が非常に長くなることがありますが、一度動作すると、コードを切り詰めることができます。)

 

バカみたいかもしれませんが、GVってなんですか?

 
グローバル変数
 

もちろん... :-)

もう一つ説明できないことがあります。次のコードは、私が最初に投稿したコードを少し修正したものです。これはマネーマネジメントのインジケーターでもありますが、ATRを削除しました。これは5~100ピップまでのストップロス・レベルを5ピップ・ステップで表示するだけです。つまり、ATRの計算が全くないのです。このインジケータをチャートにドラッグすると、問題なく動作します。どのペアも、どのタイムフレームも。問題ありません。しかし、MetaTraderを開くとゼロ除算エラーが発生し、またストップロスレベルの代わりに「Label」だけが印刷されます。

このエラーはこの行で発生します。

lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);

私はこの行のすべての変数を印刷し、AccountBalance()がゼロでMarketInfo(Symbol(), MODE_TICKVALUE)がゼロであるという結論に達しました。つまり、明らかにMetaTraderを開いたときに、データがまったく利用できないのです。昔のMetaTraderではこんなことはなかったのですが。というわけで、どうしたらいいのかさっぱりわかりません・・・。

以下はそのコードです。

#property indicator_chart_window
//--- input parameters
extern int  Risk=5;
extern int SL_Levels=20;
int multi, exp1, SL, i, k;
double MoneyRisk, Spread, modifySpread, lots;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   k=0;
   for(i=1; i<=SL_Levels; i++)
   {
      if (ObjectFind("SL"+i) == -1)
      {
         ObjectCreate("SL"+i, OBJ_LABEL, 0, 0, 0);
         ObjectSet("SL"+i, OBJPROP_CORNER, 1);
         ObjectSet("SL"+i, OBJPROP_XDISTANCE, 3);
         ObjectSet("SL"+i, OBJPROP_YDISTANCE, k);
         k=k+15;    
      }
   }
   if (ObjectFind("Spread") == -1)
   {
      ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0);
      ObjectSet("Spread", OBJPROP_CORNER, 3);
      ObjectSet("Spread", OBJPROP_XDISTANCE, 3);
      ObjectSet("Spread", OBJPROP_YDISTANCE, 1);
   }
   
//-- 4 / 5 Digit Settings --
   multi   = 1;
   exp1     = 0;
   modifySpread = 1;
   if (Digits==5 || Digits==3)
   {
      modifySpread = 0.1;
      multi=10;
      exp1=1;
   }
//----
   SL = 10;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(i=1; i<=SL_Levels; i++)
   {
      ObjectDelete("SL"+i);
   }
   ObjectDelete("Spread");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
   Spread     = MarketInfo(Symbol(), MODE_SPREAD)*modifySpread;
   MoneyRisk  = AccountBalance()*Risk*0.01;
   k=0;
   Print(Spread);
   Print(AccountBalance());
   Print(MoneyRisk);
   Print(MarketInfo(Symbol(), MODE_TICKVALUE));
   Print(SL);
   Print(multi);
   for(i=1; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
      ObjectSetText("SL"+i, SL+ " : "+DoubleToStr(lots, 2), 10, "Calibri", White);
      k=k+15;
      SL = SL+5;     
   }
   SL = 10;
   ObjectSetText("Spread", Spread, 10, "Calibri", White);

   WindowRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
数学の計算順序の基本がわからない?何が問題なのか、すぐにわかります。あなたの数学の計算命令です。
 

もう少し正確に教えてください。具体的に何が問題なのでしょうか(いつも動いていたので...)?


AccountBalance()など、MetaTraderから必要なデータが、Platformを起動した直後に利用できない問題がまだ残っていると思います。

 

もう一つの例。

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
//----
  {
   Comment  (AccountBalance());
//----
   return(0);
  }
//+------------------------------------------------------------------+
MetaTraderを開くと、結果はゼロになります!そしてそれは、タイムフレームやペアを変更するまでゼロのままです。これはまさにゼロによる除算 エラーの問題だと思います。あなたもそう思いませんか?
 
mar:

この行のALL変数をプリントしてみたところ、AccountBalance()はゼロ、MarketInfo(Symbol(), MODE_TICKVALUE)はゼロという結論に達しました。つまり、明らかにMetaTraderを開いたときに、データがまったく利用できないのです。昔のMetaTraderではこんなことはなかったのですが。だから、私は何をすべきか全く分からない...。

以下がそのコードです。

これが問題の原因であることが確実な場合は、Start()の直後に次のコードを追加してください。

if( MarketInfo(Symbol(), MODE_SPREAD)==0 || AccountBalance() == 0 )
   return(0);
 

どうもGumRaiです。

上のインジケーターでテストしてみました。MetaTraderを何分か走らせてもAccountBalanceはゼロのままです。手動で何か(ペア、時間枠)を変更するまでは、正しいAccountBalanceが表示されます。また、御社のソリューションを使用した場合、ゼロによる除算の エラーは発生しませんが、AccountBalanceがゼロのままなので、インジケータは決して動作しません。

この問題を抱えているのは私だけなのでしょうか?新しいMetaTraderの一般的なデータインポートの問題だと思うのですが...。