Стоимость предыдущего тика - страница 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. Эй, это мой первый день в этом деле...
Моя цель - определить разницу между текущим 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 всегда был заполнен, но это не так на первом тике. Меня интересует логика, которая не требует, чтобы tick_prev был заполнен на первом тике, но в остальном все работает.
 
rdone:
Как это часто бывает, код делал то, что должен был делать, а не то, что я хотел. Логика требует, чтобы tick_prev всегда был заполнен, но это не так на первом тике. Меня интересует логика, которая не требует, чтобы 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 всегда был заполнен, но это не так на первом тике. Меня интересует логика, которая не требует, чтобы tick_prev был заполнен на первом тике, но в остальном все работает.
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 балл. Поэтому если вы сравниваете только два тика, вы можете сделать свой код более компактным и просто создать подкласс 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
      );
   }
}