Группа "Стол заказов MQL"

Рейтинг 2073



РЕКОМЕНДУЮ




Лучшее от axe44



Крутые памм-счета Комментариев 6
2017-10-24 11:58:58Рейтинг 0

БКС Комментариев 8
2017-08-11 02:57:12Рейтинг 0

торги
2017-01-26 00:01:37Рейтинг 0

HelloDual v3.0 Комментариев 3
2017-11-19 02:21:03Рейтинг 0

Создание советников бесплатно Комментариев 2
2017-07-16 22:54:20Рейтинг 0

Тест

Здравствуйте.
Немного туплю, поэтому прошу иногда помощи.
Все знают про функцию onTester(), но как ею пользоваться?
Особо в программах не видел.
Не набросаете пример с вызовом функции теста с изменяемыми параметрами, записью и вызова этих записей. Как бы ничего сложного, а просто показать примеры.
Спасибо.
  • 0
  • Просмотров: 3179
  • 29 марта 2017, 17:30
  • axe44
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
платформа МТ4 Дописать эксперта ATM
29 марта 2017
29 марта 2017

Комментарии (9)

+
0
Здесь подробнее о функции: www.mql5.com/ru/docs/basis/function/events
За примерами обращайтесь на форум мкл. Если нужно написать что то конкретное, простое ТЗ рассмотрю.
avatar

  34  AM2 Сообщений: 15826 - Андрей

  • 29 марта 2017, 18:03
+
+1
Вот эксперт пробойник:


//+------------------------------------------------------------------+
//|                                                       ProBoy.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 50;       // лось
extern int TakeProfit    = 70;       // язь
extern int TrailingStop  = 35;       // трал
extern int BarsCount     = 20;       // баров для расчета
extern int Expiration    = 10;       // 
extern int Delta         = 100;      // дельта
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*3600,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double h = High[iHighest(NULL,0,MODE_HIGH,BarsCount,0)];
   double l = Low[iLowest(NULL,0,MODE_LOW,BarsCount,0)];

   if(t!=Time[0] && (CountOrders(0)<1 && CountOrders(1)<1))
     {
      if(CountOrders(4)<1 && Bid<h) PutOrder(4,h+Delta*Point);
      if(CountOrders(5)<1 && Ask>l) PutOrder(5,l-Delta*Point);
      t=Time[0];
     }

   if(CountOrders(0)>0 || CountOrders(1)>0) DelOrder();
  }
//+------------------------------------------------------------------+
double OnTester()
  {
   return(TesterStatistics(STAT_PROFIT));
  }
//+------------------------------------------------------------------+



В нем в графу с результаттами тестирования можно поместить свой критерий оптимизации. который считается в функции онтестер:


double OnTester()
  {
   return(TesterStatistics(STAT_PROFIT)/2);
  }


И получим такой результат:



Более подробно в статье: www.mql5.com/ru/articles/286
avatar

  34  AM2 Сообщений: 15826 - Андрей

  • 29 марта 2017, 19:37
+
0
Спасибо.
Очень хорошо.
Такое тех задание. Из советника вызываем тестер стратегий и подбираем оптимальные параметры стоп, профит, безубыток для советника.
Так можно? Палку не перегнул?
Как бы в любом случаи спасибо, а то на форумах только общие понятия знают.
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 29 марта 2017, 20:44
+
0
Палку не перегнул?

Сами все прекрасно понимаете :) 
avatar

  34  AM2 Сообщений: 15826 - Андрей

  • 30 марта 2017, 06:17
+
0
Во-во.
Как, мне тогда понять? Там по тем ссылкам пример, кода функция вызывается в ручную.
Но как вызвать функцию из самого советника?
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 30 марта 2017, 07:54
+
+1
Простой пример:
//+------------------------------------------------------------------+
//|                                                 EA_simple_MA.mq4 |
//|                                                              Oxy |
//|                                   http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link      "http://oxy.opentraders.ru/bio/"
#property version   "1.00"
#property strict
//------- external parameters ---------------------------------------+
extern int                MA_period         = 36;                             // MA период
extern ENUM_MA_METHOD     MA_method         = MODE_SMA;                       // MA метод усреднения
extern ENUM_APPLIED_PRICE MA_app_price      = PRICE_CLOSE;                    // MA тип цены 
extern double             Lot               = 0.1;                            // Лот
extern int                StopLoss          = 200;                            // Stop Loss, 0 - без
extern int                TakeProfit        = 200;                            // Take Profit, 0 - без
extern int                MagicNumber       = 1;                              // Magic
extern int                Slippage          = 30;                             // Slippage
//------- global variables ------------------------------------------+
datetime prevTime    = 0;
int      NUM_OpenPos = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
double OnTester() 
  {
    // Здесь мы произведем расчеты по окончании тестирования, если надо
    // НО в данном случае мы просто в тестере вернем количество открытых позиций
    return(NUM_OpenPos);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    if(HaveAnyOpenPosition()) {prevTime=Time[0]; return;}
    if(prevTime==Time[0]) return;
    
    double _ma = iMA(Symbol(), 0, MA_period, 0, MA_method, MA_app_price, 0);
    if(Open[0]<_ma && Bid>_ma) { // BUY
      if(BuyPosition(Lot, StopLoss, TakeProfit)) NUM_OpenPos++; 
    }
    if(Open[0]>_ma && Ask<_ma) { // SELL
      if(SellPosition(Lot, StopLoss, TakeProfit)) NUM_OpenPos++;
    } 
  }
//+------------------------------------------------------------------+
bool HaveAnyOpenPosition() {
  int i, k = OrdersTotal ();
  for (i=k-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {
        if(OrderType()==OP_BUY || OrderType()==OP_SELL) return (true);
      }
    }
  }
  return (false);
}
//+------------------------------------------------------------------+
//| BUY                                                              |
//+------------------------------------------------------------------+
bool BuyPosition(double _lot, int _sl=0, int _tp=0, string _comment=NULL) {
  double sl=0,tp=0;
  
  RefreshRates(); 
  if(_sl>0) sl=Ask-(double)_sl*Point;
  if(_tp>0) tp=Ask+(double)_tp*Point;
  if (OrderSend(Symbol(), OP_BUY, _lot, NormalizeDouble(Ask,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), _comment, MagicNumber)==-1) {
    Print("Failed OP_BUY !"); return(false);
  }
  return(true);
}
//+------------------------------------------------------------------+
//| SELL                                                             |
//+------------------------------------------------------------------+
bool SellPosition(double _lot, int _sl=0, int _tp=0, string _comment=NULL) {
  double sl=0,tp=0;
  
  RefreshRates();
  if(_sl>0) sl=Bid+(double)_sl*Point;
  if(_tp>0) tp=Bid-(double)_tp*Point;
  if (OrderSend(Symbol(), OP_SELL, _lot, NormalizeDouble(Bid,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), _comment, MagicNumber)==-1) {
    Print("Failed OP_SELL !"); return(false);
  }
  return(true);
}
//+------------------------------------------------------------------+


avatar

  27  Oxy Сообщений: 3413 - ..ιllιlι.lι.ιllι.ιlι..

  • 30 марта 2017, 12:19
+
0
Если к данному советнику прикрутить небольшой мартин, чуть изменить входящие настройки, то за этот год:

С учетом, что настройки были подобраны «на глаз» :D 
avatar

  27  Oxy Сообщений: 3413 - ..ιllιlι.lι.ιllι.ιlι..

  • 30 марта 2017, 12:27
+
0
Милая Оху, получается и ты не знаешь как вставить функцию вызова онТестер в командную строку онТик, что бы тестирование и получение результата было без участие человека.
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 30 марта 2017, 21:00
+
+1
и ты не знаешь как вставить функцию вызова онТестер в командную строку онТик
А зачем мне это знать, если прямая обязанность функции OnTester() в языке mql4 в другом, а не в том, в чем вы придумали :D 
avatar

  27  Oxy Сообщений: 3413 - ..ιllιlι.lι.ιllι.ιlι..

  • 31 марта 2017, 09:51

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари