前のティックの値 - ページ 4

 
Nicholiさん、より合理的なコードをありがとうございました。いくつかの実験の後、ask_diff を float として宣言すると、正しい桁数の差分が得られますが、型変換によるデータ損失の可能性に関するコンパイルエラーが発生することがわかりました。差分の精度が非常に小さいか、コンパイル時の警告が出るかのどちらかを選択しなければならないようです。後者の方が取引上の判断に適していると思いますが、ask_diffの小数点以下桁数を最大5桁にする解決策をお持ちの方はいらっしゃいますか?
 
rdone:
より合理的なコードを提供してくれたNicholiに感謝します。いくつかの実験の後、ask_diff を float として宣言すると、正しい桁数の差分が得られますが、型変換によるデータ損失の可能性に関するコンパイルエラーが発生することがわかりました。差分の精度が非常に小さいか、コンパイル時の警告が出るかのどちらかを選択しなければならないようです。後者の方が取引上の判断に適していると思いますが、ask_diffの小数点以下桁数を最大5桁にする解決策をお持ちの方はいらっしゃいますか?

のask_diffはint型にして、以下のような感じにします。

int diff = int(round((current.ask - last.ask) / _Point));
 
NormalizeDoubleとDoubleToStringを発見したんだ。ちょっと、初日なのに...。
 
rdone:
NormalizeDoubleとDoubleToStringを発見したんだ。おいおい、初日からこれかよ...。
私の目標は、現在のAskと前のAskの差を決定し(パート1)、それらの差の実行中の合計を保持することです(パート2)。パート1は機能しますが、パート2は以前のAskの金額を返すだけです。私は間違っている場所を参照してください、そして、いくつかのコース修正を提供できる人はいますか?
double ask_curr;
double ask_prev;
double ask_diff;
double diff_ask;
MqlTick tick_curr, tick_prev;
void OnTick()
  {
   if(SymbolInfoTick(Symbol(),tick_curr))
     {
      /* Part 1 */
      ask_curr = tick_curr.ask;
      ask_prev = tick_prev.ask;
      ask_diff = ask_curr - ask_prev;
      Print(DoubleToString(ask_diff,5));
      /* Part 2 */
      diff_ask = diff_ask + ask_diff;
      Print(DoubleToString(diff_ask,5));     
      tick_prev = tick_curr;
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
 
よくあることですが、コードは私が望んでいることではなく、想定していることを行っていました。このロジックはtick_prevが常にpopulatedであることを要求していますが、最初のティックではtrueではありません。私は、tick_prev が最初のティックでポピュレートされることを必要としないロジックに興味があるのですが、それ以外ではこれは動作します。
 
rdone:
よくあることですが、コードは私が望んでいることではなく、想定していることを行っていました。このロジックはtick_prevが常にpopulatedであることを要求していますが、最初のティックではtrueではありません。私は、tick_prevが最初のティックでポピュレートされることを必要としないロジックに興味がありますが、それ以外はこれで動作します。
そして今、コードで。
double ask_curr;
double ask_prev;
double ask_diff;
double diff_ask;
int notfirst;
MqlTick tick_curr, tick_prev;
void OnTick()
  {
   if(SymbolInfoTick(Symbol(),tick_curr))
     {
      if (notfirst > 0)
      {
      /* Part 1 */
      ask_curr = tick_curr.ask;
      ask_prev = tick_prev.ask;
      ask_diff = ask_curr - ask_prev;
      Print(DoubleToString(ask_diff,5));
      /* Part 2 */
      diff_ask = diff_ask + ask_diff;
      Print(DoubleToString(diff_ask,5));
      }
      tick_prev = tick_curr;
      notfirst = 1;  
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
 
rdone:
よくあることですが、コードは私が望んでいることではなく、想定していることを行っていました。このロジックはtick_prevが常にpopulatedであることを要求していますが、最初のティックではtrueではありません。私は、最初のティックでtick_prevがpopulatedであることを必要としないロジックに興味があるのですが、それ以外はこれで動作します。
double diff_ask=0;
MqlTick tick_curr, tick_prev={0};
void OnTick()
  {
   if(SymbolInfoTick(Symbol(),tick_curr))
     {
      /* Part 1 */
      diff_ask += tick_prev.ask!=0.0?(tick_curr.ask-tick_prev.ask):0.0;
      Print(DoubleToString(diff_ask,5));
      /* Part 2 */
      //diff_ask = diff_ask + ask_diff;
      //Print(DoubleToString(diff_ask,5));     
      tick_prev = tick_curr;
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
 
Ernst Van Der Merwe:
これは私が目指しているコーディングのレベルです。エルンストさん、ありがとうございました。
diff_ask += tick_prev.ask!=0.0?(tick_curr.ask-tick_prev.ask):0.0;
 
rdone:
これは、私が目指しているコーディングのレベルです。Ernstさん、ありがとうございました。

2倍が等しくなることはほとんどないので、点差を2倍として格納することはできません。整数値として保存したいのです。例えば、(1.00001 - 1.00000) / 0.00001 = 1 ポイントとなります。もし、2つのティックを比較するだけなら、MqlTickの サブクラスを作成して、ポイント差のためのint属性を追加するだけで、コードをよりコンパクトにすることができます。

struct MyTick : public MqlTick{int point_diff;} tick_curr={0}, tick_prev={0};
void OnStart()
{
   tick_prev = tick_curr;
   SymbolInfoTick(_Symbol, tick_curr);
   if(tick_prev.ask != 0.0){
      tick_curr.point_diff = int(round(
         (tick_curr.ask - tick_prev.ask) / _Point
      ));
      printf("%.5f -> %.5f: %d point diff",
         tick_prev.ask,
         tick_curr.ask,
         tick_curr.point_diff
      );
   }
}