前一个打钩的价值 - 页 4

 
谢谢Nicholi提供的更精简的代码。经过一些实验,我发现将 ask_diff 声明为 float 产生的差异具有正确的数字,但在编译时出现了类型转换可能造成数据丢失的错误。看起来我必须在我的差值中出现非常小的误差或有一个编译警告之间做出选择。后者对交易决策更有利,但有没有人有办法在ask_diff中获得最多五位小数的解决方案?
 
rdone:
谢谢Nicholi提供的更精简的代码。经过一些实验,我发现将 ask_diff 声明为 float 产生的差异具有正确的位数,但在编译时出现了类型转换可能造成数据丢失的错误。看起来我必须在我的差值中出现非常小的误差或有一个编译警告之间做出选择。后者对交易决策更有利,但有没有人有办法在ask_diff中获得最多五位小数的解决方案?

你的ask_diff应该是int类型,看起来像这样。

int diff = int(round((current.ask - last.ask) / _Point));
 
我刚刚发现NormalizeDouble和DoubleToString。嘿,这是我第一天做这个...
 
rdone:
我刚刚发现NormalizeDouble和DoubleToString。嘿,这是我第一天做这个...
我的目标是确定当前价格和前一个价格之间的差异(第1部分),然后保持这些差异的运行总量(第2部分)。第1部分是有效的,但第2部分只是返回前一次的报价金额。有谁能看出我在哪里出了问题,并提供一些纠正方法?
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总是被填充,但在第一个tick上却不是真的。我对一个不要求tick_prev在第一个tick上被填充的逻辑感兴趣,但除此之外,这个逻辑还能工作。
 
rdone:
正如经常发生的那样,代码在做它应该做的事,而不是我想做的事。该逻辑要求tick_prev总是被填充,但在第一个tick上却不是真的。我对一个不要求tick_prev在第一个tick上被填充的逻辑很感兴趣,但除此之外这都是可行的。
现在有了代码。
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总是被填充,但在第一个tick上却不是真的。我对一个不要求tick_prev在第一个tick上被填充的逻辑感兴趣,但除此之外,这个逻辑还能工作。
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:
这是我渴望达到的编码水平。谢谢你,恩斯特!

你不想把点差存储为一个双数,因为双数很少相等。你想把它存储为一个整数值。例如(1.00001 - 1.00000)/ 0.00001 = 1点。因此,如果你只是在比较两个ticks,那么你可以使你的代码更紧凑,只需子类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
      );
   }
}