Скачать MetaTrader 5

Тестер Стратегий - нет различия, какой таймфрейм ставить

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Форматируй текст в редакторе сообщений. Это удобно!
Артур
9
Артур 2011.02.07 19:35 

Хотел понять на каком таймфрейме советник работает лучше, но возникла проблема:

Тестируя советника на различных таймфреймах (в тестере стратегий; режим торговли - обычный, каждый тик), получаю одни и те же результаты (которые, похоже, совпадают с результатами для минутного таймфрейма). В режиме же реального времени советник работает по-разному (на разных таймфреймах).

Код советника (если нужен) - ниже. Заранее спасибо!

//+------------------------------------------------------------------+
//|                                             My_first_advisor.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
/*
        Советник работает с индикаторами MA и ADX. Ордер на покупку ставится, если MA возрастает (рассматри-
        ваются несколько последних баров), предыдущая цена закрытия бара больше значения MA, цена предыдуще-
        го закрытия бара больше MA, наблюдается обределенная волатильность рынка (с помощью ADX), 
        идет напраленное движение вверх(+DI > -DI). Для ордера на продажу - наоборот.
*/
//--- input parameters
input int      SL = 30;    // stop loss 
input int      TP = 70;          // take profit
input int      MA_period = 14;
input int      ADX_period = 18;
input int      Magic_number = 12345;
input int      Bars_enough = 60;
input int                Bars_num = 3;
input double   ADX_min = 22.0;
input double   Lot = 0.3;
//--- constants
double d = 1e-6;
//--- global variables
int ADX_handle, MA_handle, Stop_Loss, Take_Profit;
double pls_DI[], mns_DI[], ADX_val[], MA_val[];
MqlTick Prev_tick;
MqlTradeRequest Request; 
MqlTradeResult Result; 
MqlRates Rate[];

//--- compares two double numbers - equal to >
bool more(double a, double b) {
        return a - b > d;
}

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
//--- getting ADX handle
  ADX_handle = iADX(NULL, 0, ADX_period);
  MA_handle = iMA(_Symbol, _Period, MA_period, 0, MODE_EMA, PRICE_CLOSE);
  if ((ADX_handle < 0) || (MA_handle < 0)) {
    Alert("Ошибка индикатора №", GetLastError());
    ResetLastError();
    return 0;
  }
//--- initializing STP & TKP
  Stop_Loss = SL;
  Take_Profit = TP;
  if (_Digits == 3 || _Digits == 5) {
        Stop_Loss *= 10;
        Take_Profit *= 10;
  }
//--- setting indexation as in timeseries (when running -> time will decrease)
        ArraySetAsSeries(pls_DI, 1);
        ArraySetAsSeries(mns_DI, 1);
        ArraySetAsSeries(Rate, 1);
        ArraySetAsSeries(MA_val, 1);
        ArraySetAsSeries(ADX_val, 1);
//--- ending initialisation
  return(0);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
//--- are there enough bars?
        if (Bars(_Symbol, _Period) < Bars_enough) {
                Alert("Недостаточно баров для работы!");
                return;
        }
//--- does a new bar appear?
        datetime New_time[1];
        static datetime Old_time;
        bool New_Bar = false;
        if (CopyTime(_Symbol, _Period, 0, 1, New_time) > 0) {
                if (New_time[0] != Old_time) {
                        New_Bar = true;
                        if(MQL5InfoInteger(MQL5_DEBUGGING))
                                Print("Новый бар: ",New_time[0]," - Cтарый бар: ", Old_time);
                        Old_time = New_time[0];
                }                       
        } else {
                Alert("Ошибка копирования времени №", GetLastError(), "!");
                ResetLastError();
                return;
        }
        if (!New_Bar) return;
//--- are there enough bars?
        if (Bars(_Symbol, _Period) < Bars_enough) {
                Alert("Недостаточно баров для работы!");
                return;
        }
//--- getting Last_price
        if (!SymbolInfoTick(_Symbol, Prev_tick)) {
                Alert("Ошибка получения котировки №", GetLastError());
                ResetLastError();
                return;
        }
//--- getting bars history
        if (CopyRates(_Symbol, _Period, 0, Bars_num, Rate) < 0) {
                Alert("Ошибка копирования истории баров №", GetLastError());
                ResetLastError();
                return;
        }
//--- getting indicaror values (for every bar)
        if ((CopyBuffer(ADX_handle, 0, 0, Bars_num, ADX_val) < 0) ||
        (CopyBuffer(ADX_handle, 1, 0, Bars_num, pls_DI) < 0) ||
        (CopyBuffer(ADX_handle, 2, 0, Bars_num, mns_DI) < 0)) {
                Alert("Ошибка получения информации по индикатору ADX №", GetLastError());
                ResetLastError();
                return;
        }
        if (CopyBuffer(MA_handle, 0, 0, Bars_num, MA_val) < 0) {
                Alert("Ошибка получения информации по индикатору MA №", GetLastError());
                ResetLastError();
                return;
        }
//--- does an opened position already exist or we have a lot of positions
        if (PositionSelect(_Symbol)) {
                if(MQL5InfoInteger(MQL5_DEBUGGING))
                        Alert("Уже существует открытая позиция!");
                return;
        }
//--- shall we buy or not? (checking special conditions)
        bool Buying = true;
        for (int i = 0; (i < Bars_num - 2) && (Buying); i++)
                Buying &= more(MA_val[i], MA_val[i + 1]);
        Buying &= more(Rate[1].close, MA_val[1]);
        Buying &= more(ADX_val[0], ADX_min);
        Buying &= more(pls_DI[0], mns_DI[0]);
        if (Buying) {
        //--- making an order
                Request.action = TRADE_ACTION_DEAL;
                Request.price = NormalizeDouble(Prev_tick.ask, _Digits);
                Request.sl = NormalizeDouble(Prev_tick.ask - Stop_Loss * _Point, _Digits);
                Request.tp = NormalizeDouble(Prev_tick.ask + Take_Profit * _Point, _Digits);
                Request.symbol = _Symbol;
                Request.volume = Lot;
                Request.magic = Magic_number;
                Request.type = ORDER_TYPE_BUY;
                Request.type_filling = ORDER_FILLING_AON;
                Request.deviation = 33;
        //--- sending it
                OrderSend(Request, Result);
        //--- checking retcode
                if ((Result.retcode == 10009) || (Result.retcode == 10008)) {
                        Alert("Ордер на покупку исполнен!");
                        return;
                }       else {
                        Alert("Ошибка выполнения ордера №", GetLastError());
                        ResetLastError();
                        return;
                }
        }
//--- shall we sell or not?
        bool Selling = true;
        for (int i = 0; (i < Bars_num - 2) && (Selling); i++)
                Selling &= more(MA_val[i + 1], MA_val[i]);
        Selling &= more(MA_val[1], Rate[1].close);
        Selling &= more(ADX_val[0], ADX_min);
        Selling &= more(mns_DI[0], pls_DI[0]);
        if (Selling) {
        //--- making an order
                Request.action = TRADE_ACTION_DEAL;
                Request.price = NormalizeDouble(Prev_tick.ask, _Digits);
                Request.sl = NormalizeDouble(Prev_tick.ask + Stop_Loss * _Point, _Digits);
                Request.tp = NormalizeDouble(Prev_tick.ask - Take_Profit * _Point, _Digits);
                Request.symbol = _Symbol;
                Request.volume = Lot;
                Request.magic = Magic_number;
                Request.type = ORDER_TYPE_SELL;
                Request.type_filling = ORDER_FILLING_AON;
                Request.deviation = 33;
        //--- sending it
                OrderSend(Request, Result);
        //--- checking retcode
                if ((Result.retcode == 10009) || (Result.retcode == 10008)) {
                        Alert("Ордер на продажу исполнен!");
                        return;
                }       else {
                        Alert("Ошибка выполнения ордера №", GetLastError());
                        ResetLastError();
                        return;
                }
        }
}
//+------------------------------------------------------------------+
Виталий
56
Виталий 2011.02.07 23:09  
У меня аналогичное дело, пробовал в тестере советник на разных таймфреймах, результаты одинаковые. В самом советнике у меня есть переменная Timeframe, по умолчанию там стояло значение Current Period (т.е. период установленный в тестере). Только после того как я стал в этой переменной вручную вводить разные таймфреймы, советник в тестере стал показывать правильные результаты

Артур
9
Артур 2011.02.07 23:32  
Mal4iwka:
У меня аналогичное дело, пробовал в тестере советник на разных таймфреймах, результаты одинаковые. В самом советнике у меня есть переменная Timeframe, по умолчанию там стояло значение Current Period (т.е. период установленный в тестере). Только после того как я стал в этой переменной вручную вводить разные таймфреймы, советник в тестере стал показывать правильные результаты

Спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий