Автор Тема: Стратегия торговли на прорывах  (Прочитано 9022 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн saw

  • не забывай ее.....
  • Thank You
  • -Given:
  • -Receive:
  • Сообщений: 274
  • +5/-5
  • помни о ней.......
    • Просмотр профиля
Re: Стратегия торговли на прорывах
« Ответ #15 : 01.06.2009 22:35 »
:-D    Знакомая до боли стратегия.... Но в чистом виде неработает абсолютно! Вот вам советничег!
 //+------------------------------------------------------------------+
//|                                                 VininE Game9.mq4 |
//|                      Copyright © 2008, Victor Nicolaev aka Vinin |
//|                                           skype: victor.nicolaev |
//|                                            e-mail: vinin@mail.ru |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2009 Victor Nicolaev"
#property link      "vinin@mail.ru"

// Советник сделан только для проверки идеи. На реал просьба не ставить.
// Автор за работу советника в реальных условиях отвественности не несет

extern int HourStart= 0;   // Время установки отложенных ордеров
extern int HourVitas= 4;   // Время жизни отложенника
extern int HourCalc = 4;   // Количество часов для расчета уровней
extern int WorkDay  =-1;   // 1..5 Рабочий день (-1 все дни)
extern int reversi  = 0;   // 0 - работа на пробой, 1- на откат


extern string sparam2="Параметры MM";
extern bool bProcent=false;
extern int TP=500;
extern int SL=500;
extern double Lots=0.1;
extern int Magic=20090512;

string _comment;
int Order_Count[6];
bool bOpen=false;
string sOP[]={"BUY","SELL","BUYSTOP","SELLSTOP","BUYLIMIT","SELLLIMIT"};

double LevelHigh, LevelLow;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()  {
   _comment=WindowExpertName();
return(0);}

int deinit(){return(0);}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   if (WorkDay>=0 && WorkDay!=TimeDayOfWeek(Time[0])) return(0);
   static int PrevTime=0;
   if (PrevTime==iTime(Symbol(),PERIOD_H1,0)) return(0);
   PrevTime=iTime(Symbol(),PERIOD_H1,0);
   if (TimeHour(iTime(Symbol(),PERIOD_H1,0))==HourStart && bOpen) {
      Order_Count_Calculate(Symbol(),Magic);
      CalculateLevel();
      if (reversi==0) {
         if (Order_Count[OP_BUYSTOP]==0 )  Order_Open(Symbol(), Magic,OP_BUYSTOP  );
         if (Order_Count[OP_SELLSTOP]==0)  Order_Open(Symbol(), Magic,OP_SELLSTOP );
      } else {
         if (Order_Count[OP_BUYLIMIT]==0 ) Order_Open(Symbol(), Magic,OP_BUYLIMIT );
         if (Order_Count[OP_SELLLIMIT]==0) Order_Open(Symbol(), Magic,OP_SELLLIMIT);
      }
      bOpen=false;
   } else bOpen=true;
   
   return(0);
}

void CalculateLevel(){
   double StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
   LevelHigh=iHigh(Symbol(),PERIOD_H1,iHighest(Symbol(),PERIOD_H1,MODE_HIGH,HourCalc,1))+StopLevel;
   LevelLow =iLow( Symbol(),PERIOD_H1,iLowest( Symbol(),PERIOD_H1,MODE_LOW, HourCalc,1))-StopLevel;
}


//===============================================================================
// Функция возвращаюшая количество ордеров определенного типа исхода из заданных ограничений
//===============================================================================
int Order_Count_Calculate(string _Symbol, int Magic=-1, int OP=-1){
   ArrayInitialize(Order_Count,0);
   for (int i = OrdersTotal() - 1;  i >= 0;  i--) {
      if (!Order_My(i,_Symbol, Magic, OP)) continue;
      Order_Count[OrderType()]++;
   }
   if (OP!=-1) return(Order_Count[OP]);
}


bool Order_My(int pos, string _Symbol="", int Magic=-1, int OP=-1){
   if (!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) return(false);
   if (!(OrderSymbol() == _Symbol || _Symbol==""))    return(false);
   if (!(OrderMagicNumber() == Magic || Magic==-1))   return(false);
   if (!(OrderType()==OP || OP==-1))                  return(false);
   return(true);
}

int Order_Open(string _Symbol, int Magic, int OP){
   GetLastError();
   double _Ask  = MarketInfo(_Symbol,MODE_ASK);
   double _Bid  = MarketInfo(_Symbol,MODE_BID);
   double _Point= MarketInfo(_Symbol,MODE_POINT);
   double _Spred= MarketInfo(_Symbol,MODE_SPREAD);
   double _StopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL);
   
   datetime _EX=Time[0]+HourVitas*60*60;

   double Price;
   double _TP;
   double _SL;
   


   switch(OP) {
      case OP_BUY:         
         Price=_Ask;      _EX=0;break;
      case OP_SELL:       
         Price=_Bid;      _EX=0; break;
      case OP_BUYLIMIT:   
         Price=LevelLow; 
         if (Price>_Ask -_StopLevel*_Point) {
            Price=_Ask;
            OP=OP_BUY;
            _EX=0;
         }
         break;
       
      case OP_SELLLIMIT:   
         Price=LevelHigh; 
         if (Price<_Bid +_StopLevel*_Point) {
            Price=_Bid;
            OP=OP_SELL;
            _EX=0;
         }
         break;
      case OP_BUYSTOP:     
         Price=LevelHigh; 
         if (Price<_Ask +_StopLevel*_Point) {
            Price=_Ask;
            OP=OP_BUY;
            _EX=0;
         }
         break;
      case OP_SELLSTOP:   
         Price=LevelLow;
         if (Price>_Bid -_StopLevel*_Point) {
            Price=_Bid;
            OP=OP_SELL;
            _EX=0;
         }
         break;

      default: return(0);
   }
   if (OP%2==0)  {
      if (bProcent) {
         _TP=Price+NormalizeDouble((LevelHigh-LevelLow)/100.0*TP,Digits);
         _SL=Price-NormalizeDouble((LevelHigh-LevelLow)/100.0*SL,Digits);
      }else {
         _TP=Price+TP*_Point;
         _SL=Price-(SL+_Spred)*_Point;
      }
   } else  {
      if (bProcent) {
         _TP=Price-NormalizeDouble((LevelHigh-LevelLow)/100.0*TP,Digits);
         _SL=Price+NormalizeDouble((LevelHigh-LevelLow)/100.0*SL,Digits);
      }else {
         _TP=Price-TP*_Point;
         _SL=Price+(SL+_Spred)*_Point;
      }
   }
   int res;
   res=OrderSend(_Symbol, OP, Lots, Price, _Spred, _SL, _TP, _comment, Magic, _EX);
   if (res<0) {
      int err=GetLastError();
      if (err>0) {
         Print("Error=",err," OP=",sOP[OP]," Ask=",_Ask," Bid=",_Bid," Price=",Price);
         return(-1);
      }
   }
   return(res);
}


double iif(bool a, double b, double c){if(a) return(b);return(c);}

Это вы имеете ввиду, тс которая описана выше, профит 10 стоп 20: А если пользовать 10 пар?

Оффлайн Tvorec

  • Thank You
  • -Given:
  • -Receive:
  • Сообщений: 12
  • +0/-0
    • Просмотр профиля
Re: Стратегия торговли на прорывах
« Ответ #16 : 02.06.2009 09:09 »
:-D    Знакомая до боли стратегия.... Но в чистом виде неработает абсолютно! Вот вам советничег!
 //+------------------------------------------------------------------+
//|                                                 VininE Game9.mq4 |
//|                      Copyright © 2008, Victor Nicolaev aka Vinin |
//|                                           skype: victor.nicolaev |
//|                                            e-mail: vinin@mail.ru |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2009 Victor Nicolaev"
#property link      "vinin@mail.ru"

// Советник сделан только для проверки идеи. На реал просьба не ставить.
// Автор за работу советника в реальных условиях отвественности не несет

extern int HourStart= 0;   // Время установки отложенных ордеров
extern int HourVitas= 4;   // Время жизни отложенника
extern int HourCalc = 4;   // Количество часов для расчета уровней
extern int WorkDay  =-1;   // 1..5 Рабочий день (-1 все дни)
extern int reversi  = 0;   // 0 - работа на пробой, 1- на откат


extern string sparam2="Параметры MM";
extern bool bProcent=false;
extern int TP=500;
extern int SL=500;
extern double Lots=0.1;
extern int Magic=20090512;

string _comment;
int Order_Count[6];
bool bOpen=false;
string sOP[]={"BUY","SELL","BUYSTOP","SELLSTOP","BUYLIMIT","SELLLIMIT"};

double LevelHigh, LevelLow;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()  {
   _comment=WindowExpertName();
return(0);}

int deinit(){return(0);}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   if (WorkDay>=0 && WorkDay!=TimeDayOfWeek(Time[0])) return(0);
   static int PrevTime=0;
   if (PrevTime==iTime(Symbol(),PERIOD_H1,0)) return(0);
   PrevTime=iTime(Symbol(),PERIOD_H1,0);
   if (TimeHour(iTime(Symbol(),PERIOD_H1,0))==HourStart && bOpen) {
      Order_Count_Calculate(Symbol(),Magic);
      CalculateLevel();
      if (reversi==0) {
         if (Order_Count[OP_BUYSTOP]==0 )  Order_Open(Symbol(), Magic,OP_BUYSTOP  );
         if (Order_Count[OP_SELLSTOP]==0)  Order_Open(Symbol(), Magic,OP_SELLSTOP );
      } else {
         if (Order_Count[OP_BUYLIMIT]==0 ) Order_Open(Symbol(), Magic,OP_BUYLIMIT );
         if (Order_Count[OP_SELLLIMIT]==0) Order_Open(Symbol(), Magic,OP_SELLLIMIT);
      }
      bOpen=false;
   } else bOpen=true;
   
   return(0);
}

void CalculateLevel(){
   double StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
   LevelHigh=iHigh(Symbol(),PERIOD_H1,iHighest(Symbol(),PERIOD_H1,MODE_HIGH,HourCalc,1))+StopLevel;
   LevelLow =iLow( Symbol(),PERIOD_H1,iLowest( Symbol(),PERIOD_H1,MODE_LOW, HourCalc,1))-StopLevel;
}


//===============================================================================
// Функция возвращаюшая количество ордеров определенного типа исхода из заданных ограничений
//===============================================================================
int Order_Count_Calculate(string _Symbol, int Magic=-1, int OP=-1){
   ArrayInitialize(Order_Count,0);
   for (int i = OrdersTotal() - 1;  i >= 0;  i--) {
      if (!Order_My(i,_Symbol, Magic, OP)) continue;
      Order_Count[OrderType()]++;
   }
   if (OP!=-1) return(Order_Count[OP]);
}


bool Order_My(int pos, string _Symbol="", int Magic=-1, int OP=-1){
   if (!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) return(false);
   if (!(OrderSymbol() == _Symbol || _Symbol==""))    return(false);
   if (!(OrderMagicNumber() == Magic || Magic==-1))   return(false);
   if (!(OrderType()==OP || OP==-1))                  return(false);
   return(true);
}

int Order_Open(string _Symbol, int Magic, int OP){
   GetLastError();
   double _Ask  = MarketInfo(_Symbol,MODE_ASK);
   double _Bid  = MarketInfo(_Symbol,MODE_BID);
   double _Point= MarketInfo(_Symbol,MODE_POINT);
   double _Spred= MarketInfo(_Symbol,MODE_SPREAD);
   double _StopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL);
   
   datetime _EX=Time[0]+HourVitas*60*60;

   double Price;
   double _TP;
   double _SL;
   


   switch(OP) {
      case OP_BUY:         
         Price=_Ask;      _EX=0;break;
      case OP_SELL:       
         Price=_Bid;      _EX=0; break;
      case OP_BUYLIMIT:   
         Price=LevelLow; 
         if (Price>_Ask -_StopLevel*_Point) {
            Price=_Ask;
            OP=OP_BUY;
            _EX=0;
         }
         break;
       
      case OP_SELLLIMIT:   
         Price=LevelHigh; 
         if (Price<_Bid +_StopLevel*_Point) {
            Price=_Bid;
            OP=OP_SELL;
            _EX=0;
         }
         break;
      case OP_BUYSTOP:     
         Price=LevelHigh; 
         if (Price<_Ask +_StopLevel*_Point) {
            Price=_Ask;
            OP=OP_BUY;
            _EX=0;
         }
         break;
      case OP_SELLSTOP:   
         Price=LevelLow;
         if (Price>_Bid -_StopLevel*_Point) {
            Price=_Bid;
            OP=OP_SELL;
            _EX=0;
         }
         break;

      default: return(0);
   }
   if (OP%2==0)  {
      if (bProcent) {
         _TP=Price+NormalizeDouble((LevelHigh-LevelLow)/100.0*TP,Digits);
         _SL=Price-NormalizeDouble((LevelHigh-LevelLow)/100.0*SL,Digits);
      }else {
         _TP=Price+TP*_Point;
         _SL=Price-(SL+_Spred)*_Point;
      }
   } else  {
      if (bProcent) {
         _TP=Price-NormalizeDouble((LevelHigh-LevelLow)/100.0*TP,Digits);
         _SL=Price+NormalizeDouble((LevelHigh-LevelLow)/100.0*SL,Digits);
      }else {
         _TP=Price-TP*_Point;
         _SL=Price+(SL+_Spred)*_Point;
      }
   }
   int res;
   res=OrderSend(_Symbol, OP, Lots, Price, _Spred, _SL, _TP, _comment, Magic, _EX);
   if (res<0) {
      int err=GetLastError();
      if (err>0) {
         Print("Error=",err," OP=",sOP[OP]," Ask=",_Ask," Bid=",_Bid," Price=",Price);
         return(-1);
      }
   }
   return(res);
}


double iif(bool a, double b, double c){if(a) return(b);return(c);}


Есть вкладка дополнительные опции, там и прикрепляешь советничка, скинь его. Спасибо.


Оффлайн drel500

  • Thank You
  • -Given:
  • -Receive:
  • Сообщений: 4
  • +0/-0
    • Просмотр профиля
Re: Стратегия торговли на прорывах
« Ответ #17 : 02.06.2009 11:02 »
Да это именно по этой стратегии советник.. Только немного с расширенными настройками.... Если кто то непонимает значение переменных то я могу описать...

Оффлайн FXsensey

  • Thank You
  • -Given:
  • -Receive:
  • Сообщений: 84
  • +2/-2
  • Мой Skype: Aprelskiy_Kot
    • Просмотр профиля
    • http://specular-fx.blogspot.com/
Re: Стратегия торговли на прорывах
« Ответ #18 : 02.06.2009 20:33 »
drel500, опиши если не сложно.

Оффлайн drel500

  • Thank You
  • -Given:
  • -Receive:
  • Сообщений: 4
  • +0/-0
    • Просмотр профиля
Re: Стратегия торговли на прорывах
« Ответ #19 : 02.06.2009 21:42 »
 ^-^
 Время установки отложенных ордеров - это время в котрое будет установлен ордер (от 0 до 24 (в часах))
 Время жизни отложенника - это время измеряется в часах, от 1 до 24.... Тоесть это время выраженное в часах величина котрого соответствует времени жизни отложенника.... Например если поставить параметр 2 то несработавший отложенник будет удален через два часа...
 Количество часов для рассчета уравней - это параметр выражен изадается так же в часах.... Отложенники устанавливаются на максимальные и минимальные границы котрые цена достигала столько то часов назад.... Как раз таки сколько часов назад нужно оценивать максимальные и минимальные достижения цены на которые установятся отложки в этом параметре и задается.... Для примера если вы поставите сдесь цифру два а в первой переменной (время установки отложенника) поставите цифру 10 то это будет означать что ордера будут установлены ровно в десять часов а место установки этих ордеров будет максимум и минимум цены которые она достигала два часа назад... тоесть с 8 до 10.....
 1..5 Рабочий день (-1 все дни) - ну сдесь я думаю что все понятно....
 0 - работа на пробой, 1- на откат - сдесь так же...
 extern bool bProcent=false - сдесь ставим фалсе....  ^-^
 

Оффлайн saw

  • не забывай ее.....
  • Thank You
  • -Given:
  • -Receive:
  • Сообщений: 274
  • +5/-5
  • помни о ней.......
    • Просмотр профиля
Re: Стратегия торговли на прорывах
« Ответ #20 : 02.06.2009 22:50 »
занялся я тестом, на сегодня пока результаты неочень, минуса