1
Торговые системы / Re: Стратегия торговли на прорывах
« : 02.06.2009 09:09 »Знакомая до боли стратегия.... Но в чистом виде неработает абсолютно! Вот вам советничег!
Код: [Выделить]//+------------------------------------------------------------------+
//| 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);}
Есть вкладка дополнительные опции, там и прикрепляешь советничка, скинь его. Спасибо.