Как измерить длину ТЕКУЩЕЙ свечи для любого инструмента?

 

Мне нужно знать, можно ли входить в рынок. Для этого я должен убедиться, что рынок не проделал 100 пунктов за пару секунд, и по сути мой вход будет немного запоздавшим.

Я использую функцию CopyRates. Но эта функция показывает корректно только цену "open", а вот цены "high" и "low" сильно опаздывают. Например, через 30 секунд после открытия свечи по графику я вижу свечу длиной 80 пунктов, а функция CopyRates показывает только 30 пунктов. Естественно, если я доверяю этой функции то я вхожу в рынок, ведь это всего 30 пунктов. Но ведь на самом деле рынок прошел уже 80 пунктов, и входить как-то поздновато.

Длину свечи я вычисляю так: (rates.high - rates.open) для сделки "бай" и (rates.open - rates.low) для сделки "селл". В общем, это кажется простым и подходит для любого инструмента, а не только для текущего графика!

Так как правильно вычислить длину ТЕКУЩЕЙ свечи для любого инструмента?

Сделаю картинку для наглядности, а то ведь я знаю какие здесь все деловые и не досуг вникать в суть чужих забот...


 
Evgeniy Scherbina:

Я использую функцию CopyRates. Но эта функция показывает корректно только цену "open", а вот цены "high" и "low" сильно опаздывают. Например, через 30 секунд после открытия свечи по графику я вижу свечу длиной 80 пунктов, а функция CopyRates показывает только 30 пунктов. Естественно, если я доверяю этой функции то я вхожу в рынок, ведь это всего 30 пунктов. Но ведь на самом деле рынок прошел уже 80 пунктов, и входить как-то поздновато.

Дело в коде, который используете. Функция CopyRates возвращает верные значения для любого бара, текущего в том числе. Проверялось. 

Скорее всего, Вы не проверяете результат запроса, не дожидаетесь обновления данных, используя устаревшую информацию.

 
Evgeniy Scherbina:

Мне нужно знать, можно ли входить в рынок. Для этого я должен убедиться, что рынок не проделал 100 пунктов за пару секунд, и по сути мой вход будет немного запоздавшим.

Я использую функцию CopyRates. Но эта функция показывает корректно только цену "open", а вот цены "high" и "low" сильно опаздывают. Например, через 30 секунд после открытия свечи по графику я вижу свечу длиной 80 пунктов, а функция CopyRates показывает только 30 пунктов. Естественно, если я доверяю этой функции то я вхожу в рынок, ведь это всего 30 пунктов. Но ведь на самом деле рынок прошел уже 80 пунктов, и входить как-то поздновато.

Длину свечи я вычисляю так: (rates.high - rates.open) для сделки "бай" и (rates.open - rates.low) для сделки "селл". В общем, это кажется простым и подходит для любого инструмента, а не только для текущего графика!

Так как правильно вычислить длину ТЕКУЩЕЙ свечи для любого инструмента?

Сделаю картинку для наглядности, а то ведь я знаю какие здесь все деловые и не досуг вникать в суть чужих забот...


MQL5 код в студию, пожалуйста.

 

Если проходим эту проверку, то дальше открывается сделка:

if(IsVisual() && trade_btns_state[3] == "on"){
      double diff, point;
      MqlRates rates[]; 
      ArraySetAsSeries(rates, true); 
      int copied = CopyRates(symbol, PERIOD_M1, 0, 1, rates); 
      if(copied>0){ 
        Print("Скопировано баров: "+copied); 
        string format="open = %G, high = %G, low = %G, close = %G, volume = %d"; 
        string out; 
        int size=fmin(copied, 10); 
        for(int i=0; i<size; i++) { 
          out = i + ":" + TimeToString(rates[i].time); 
          out = out + " " + StringFormat(format, 
                                         rates[i].open, 
                                         rates[i].high, 
                                         rates[i].low, 
                                         rates[i].close, 
                                         rates[i].tick_volume); 
          Print(out); 
        } 
       
       
        point = SymbolInfoDouble(symbol, SYMBOL_POINT);
        Print("Шаг 2: point=" + (string) point);
      
      
        if(order_type == ORDER_TYPE_BUY){
          Print("Шаг 3: совершаем бай");
          diff = rates[0].high - rates[0].open;
          diff = (diff / point) / decimal;
          Print("Шаг 4: rates[0].high=" + (string) rates[0].high + ", rates[0].open" + (string) rates[0].open + ", diff=" + (string) diff);
          
          
          if(diff >= slip){
            output_errors("Slip exceeds " + IntegerToString(slip) + " >> exit", true);
            return;
          }else Print("Шаг 5: все зыко, это сделка");
        
        
        }else if(order_type == ORDER_TYPE_SELL){
          diff = rates[0].open - rates[0].low;
          diff = (diff / point) / decimal;
          
          
          if(diff >= slip){
            output_errors("Slip exceeds " + IntegerToString(slip) + " >> exit", true);
            return;
          }
        }
      }
    }else Print("Шаг 1: off");
 
Ihor Herasko:

Дело в коде, который используете. Функция CopyRates возвращает верные значения для любого бара, текущего в том числе. Проверялось. 

Скорее всего, Вы не проверяете результат запроса, не дожидаетесь обновления данных, используя устаревшую информацию.

Как обновить данные?

 

Код нужен для того, чтобы понять каким образом ВЫ учитываете реальный скачок котировок на USDCAD,M30 в 15:30

Тики просматривались при помощи индикатора LifeHack Ticks запущенного в тестере в режиме генерации тиков "Все тики на основе реальных данных".

 
Vladimir Karputov:

Код нужен для того, чтобы понять каким образом ВЫ учитываете реальный скачок котировок на USDCAD,M30 в 15:30

Тики просматривались при помощи индикатора LifeHack Ticks запущенного в тестере в режиме генерации тиков "Все тики на основе реальных данных".

Код который я привел выше исполняется в OnTick

 
Vladimir Karputov:

Код нужен для того, чтобы понять каким образом ВЫ учитываете реальный скачок котировок на USDCAD,M30 в 15:30

Тики просматривались при помощи индикатора LifeHack Ticks запущенного в тестере в режиме генерации тиков "Все тики на основе реальных данных".

Не уверен что мне нужны тики. Мне нужны всегда актуальные максимальные и минимальные значения.

А если тики, тогда уж мне проще в OnTick записывать все значения вручную и потом их и проверять. Сейчас я к этому склоняюсь, потому что ответа на мой вопрос нет нигде на форуме.

Например вот так:

rates[0] = "USDCAD,1.2206,1.2286"

И обновлять эту инфу в OnTick: если текущее значение больше максимального - записать его, и если меньше минимального - записать и его.

 
Evgeniy Scherbina:

Код который я привел выше исполняется в OnTick

Не компилируется. В общем видео выложил - сами должны понимать, что если цена за ТРИ тика улетает на 0,00285 - успеете ли вскочить на подножку поезда движущегося со скоростью пули...

 
Evgeniy Scherbina:

Не уверен что мне нужны тики. Мне нужны всегда актуальные максимальные и минимальные значения.

А если тики, тогда уж мне проще в OnTick записывать все значения вручную и потом их и проверять. Сейчас я к этому склоняюсь, потому что ответа на мой вопрос нет нигде на форуме.

Индикатор запущенный в тестере стратегий в режиме генерации тиков "Все тики на основе реальных тиков" - показывает РЕАЛЬНУЮ картинку, как поступали тики. Индикатор визуализирует историю. Здесь OnTick() вообще не при чём. 

Это индикатор и он в тестере стратегий в режиме генерации тиков "Все тики на основе реальных тиков" показывает ВАМ реальную картину в тиковой истории. 

 
Vladimir Karputov:

Не компилируется. В общем видео выложил - сами должны понимать, что если цена за ТРИ тика улетает на 0,00285 - успеете ли вскочить на подножку поезда движущегося со скоростью пули...

double diff, point;
int order_type = 0;
int slip = 60;


      MqlRates rates[]; 
      ArraySetAsSeries(rates, true); 
      int copied = CopyRates("USDCAD", PERIOD_M1, 0, 1, rates); 
      if(copied>0){ 
        Print("Скопировано баров: "+copied); 
        string format="open = %G, high = %G, low = %G, close = %G, volume = %d"; 
        string out; 
        int size=fmin(copied, 10); 
        for(int i=0; i<size; i++) { 
          out = i + ":" + TimeToString(rates[i].time); 
          out = out + " " + StringFormat(format, 
                                         rates[i].open, 
                                         rates[i].high, 
                                         rates[i].low, 
                                         rates[i].close, 
                                         rates[i].tick_volume); 
          Print(out); 
        } 
       
       
        point = SymbolInfoDouble("USDCAD", SYMBOL_POINT);
        Print("Шаг 2: point=" + (string) point);
      
      
        if(order_type == 0){
          Print("Шаг 3: совершаем бай");
          diff = rates[0].high - rates[0].open;
          diff = (diff / point) / decimal;
          Print("Шаг 4: rates[0].high=" + (string) rates[0].high + ", rates[0].open" + (string) rates[0].open + ", diff=" + (string) diff);
          
          
          if(diff >= slip){
            output_errors("Slip exceeds " + IntegerToString(slip) + " >> exit", true);
            return;
          }else Print("Шаг 5: все зыко, это сделка");
        
        
        }else if(order_type == 1){
          diff = rates[0].open - rates[0].low;
          diff = (diff / point) / decimal;
          
          
          if(diff >= slip){
            output_errors("Slip exceeds " + IntegerToString(slip) + " >> exit", true);
            return;
          }
        }
      }
Причина обращения: