Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Evgeniy Scherbina
2434
Evgeniy Scherbina  

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

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

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

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

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


Ihor Herasko
16447
Ihor Herasko  
Evgeniy Scherbina:

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

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

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

Vladimir Karputov
Модератор
85664
Vladimir Karputov  
Evgeniy Scherbina:

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

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

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

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

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


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

Evgeniy Scherbina
2434
Evgeniy Scherbina  

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

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");
Evgeniy Scherbina
2434
Evgeniy Scherbina  
Ihor Herasko:

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

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

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

Vladimir Karputov
Модератор
85664
Vladimir Karputov  

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

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

Evgeniy Scherbina
2434
Evgeniy Scherbina  
Vladimir Karputov:

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

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

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

Evgeniy Scherbina
2434
Evgeniy Scherbina  
Vladimir Karputov:

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

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

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

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

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

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

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

Vladimir Karputov
Модератор
85664
Vladimir Karputov  
Evgeniy Scherbina:

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

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

Vladimir Karputov
Модератор
85664
Vladimir Karputov  
Evgeniy Scherbina:

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

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

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

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

Evgeniy Scherbina
2434
Evgeniy Scherbina  
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;
          }
        }
      }
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий