Добавить лимитки в советник |
Добрый день уважаемые программисты. Прошу Вашей помощи. Нашел на просторах интернета советник торгующий стоповыми ордерами. Просьба добавить ему функцию смены на торговлю лимитными ордерами с теми же условиями. Зараннее БЛАГОДАРЕН. С уважением.
extern int Stoploss = 10,
Takeprofit = 50;
extern int TrailingStop = 10;
extern int TrailingStart = 0;
extern int StepTrall = 2;
extern int NoLoss = 0,
MinProfitNoLoss = 0;
extern int Magic = 77;
extern int Step = 10;
extern double Lot = 0.1;
extern int TimeModify = 30;
extern int slippage = 30;
extern int TimeStart = 0,
TimeEnd = 24;
//--------------------------------------------------------------------
datetime TimeBarB,TimeBarS;
//--------------------------------------------------------------------
int OnInit()
{
int STOPLEVEL=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);
if (Stoploss!=0 && Stoploss<STOPLEVEL) Stoploss=STOPLEVEL;
if (Takeprofit!=0 && Takeprofit<STOPLEVEL) Takeprofit=STOPLEVEL;
if (TrailingStop!=0 && TrailingStop<STOPLEVEL) TrailingStop=STOPLEVEL;
if (NoLoss!=0 && NoLoss<STOPLEVEL) NoLoss=STOPLEVEL;
if (Step!=0 && Step<STOPLEVEL) Step=STOPLEVEL;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTick()
{
double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
double OSL=0,StLo=0,PriceB=0,PriceS=0,OOP=0,SL=0,TP=0;
int b=0,s=0,TicketB=0,TicketS=0,OT;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
OT = OrderType();
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
SL=OSL;
if (OT==OP_BUY)
{
b++;
if (OSL<OOP && NoLoss!=0 && (Bid — OOP)/Point >= NoLoss)
{
StLo = NormalizeDouble(OOP+MinProfitNoLoss*Point,Digits);
if (StLo > OSL && StLo <= NormalizeDouble(Bid — STOPLEVEL * Point,Digits)) SL = StLo;
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (Bid — OOP)/Point >= TrailingStart)
{
StLo = NormalizeDouble(Bid — TrailingStop*Point,Digits);
if (StLo>=OOP && StLo > OSL+StepTrall*Point) SL = StLo;
}
if (SL > OSL)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print(«Error »,GetLastError()," Order Modify Buy SL ",OSL,"->",SL);
else Print(«Order Buy Modify SL »,OSL,"->",SL);
}
}
if (OT==OP_SELL)
{
s++;
if ((OSL>OOP || OSL==0) && NoLoss!=0 && (OOP — Ask)/Point >= NoLoss)
{
StLo = NormalizeDouble(OOP-MinProfitNoLoss*Point,Digits);
if ((StLo < OSL || OSL==0) && StLo >= NormalizeDouble(Ask + STOPLEVEL * Point,Digits)) SL = StLo;
}
if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (OOP — Ask)/Point >= TrailingStart)
{
StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits);
if (StLo<=OOP && (StLo < OSL-StepTrall*Point || OSL==0)) SL = StLo;
}
if ((SL < OSL || OSL==0) && SL!=0)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print(«Error »,GetLastError()," Order Modify Sell SL ",OSL,"->",SL);
else Print(«Order Sell Modify SL »,OSL,"->",SL);
}
}
if (OT==OP_BUYSTOP) {PriceB=OOP; TicketB=OrderTicket();}
if (OT==OP_SELLSTOP) {PriceS=OOP; TicketS=OrderTicket();}
}
}
}
if (b>0 && TicketS>0) if (!OrderDelete(TicketS)) return;
if (s>0 && TicketB>0) if (!OrderDelete(TicketB)) return;
if (b+s>0) return;
int TekHour = Hour();
bool Trade;
if ( TimeStart < TimeEnd && TekHour >= TimeStart && TekHour < TimeEnd ) Trade=true;
else
{
if ( TimeStart > TimeEnd && (TekHour >= TimeStart || TekHour < TimeEnd)) Trade=true; //торговля ночью
else Trade=false;
}
if (!Trade)
{
if (TicketS>0) if (!OrderDelete(TicketS)) return;
if (TicketB>0) if (!OrderDelete(TicketB)) return;
return;
}
double price=0;
if (b+TicketB==0)
{
price = NormalizeDouble(Ask+Step * Point,Digits);
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(price — Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(price + Takeprofit * Point,Digits); else TP=0;
if (OrderSend(Symbol(),OP_BUYSTOP,Lot,price,slippage,SL,TP,«news»,Magic,0,CLR_NONE)!=-1) TimeBarB=TimeCurrent();
}
if (s+TicketS==0)
{
price=NormalizeDouble(Bid — Step * Point,Digits);
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(price + Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(price — Takeprofit * Point,Digits); else TP=0;
if (OrderSend(Symbol(),OP_SELLSTOP,Lot,price,slippage,SL,TP,«news»,Magic,0,CLR_NONE)!=-1) TimeBarS=TimeCurrent();
}
if (TicketB!=0)
{
price = NormalizeDouble(Ask+Step * Point,Digits);
if (TimeBarB<TimeCurrent()-TimeModify && MathAbs(price-PriceB)/Point>StepTrall)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(price — Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(price + Takeprofit * Point,Digits); else TP=0;
if (OrderModify(TicketB,price,SL,TP,0,CLR_NONE)) TimeBarB=TimeCurrent();
}
}
if (TicketS!=0)
{
price=NormalizeDouble(Bid — Step * Point,Digits);
if (TimeBarS<TimeCurrent()-TimeModify && MathAbs(price-PriceS)/Point>StepTrall)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(price + Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(price — Takeprofit * Point,Digits); else TP=0;
if (OrderModify(TicketS,price,SL,TP,0,CLR_NONE)) TimeBarS=TimeCurrent();
}
}
}
-
0
- Просмотров: 1383
- 30 ноября 2020, 00:03
- Lotos017
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!
Комментарии (7)
35 AM2 Сообщений: 16426 - Андрей
Советник торгует на скачках рынка, при этом не использует никакие индикаторы.
Идея советника заключается в том, что лимитные ордера дискретно времени перемещаются на заданном расстоянии от текущей цены.
Если цена достаточно резко поползла в одну сторону, то советник просто не успевает переместить ордер и он становится рыночным. А встречный лимитный ордер закрывается.
Далее включается тралл ордера.
extern int Stoploss = 10, //стоплосс, если 0 то не изменяется
Takeprofit = 50; //тейкпрофит, если 0 то не изменяется
extern int TrailingStop = 10; //длинна тралла, если 0 то нет тралла
extern int TrailingStart = 0; //когда включать тралл, например после достижения 40 п прибыл
extern int StepTrall = 2; //шаг тралла — перемещать стоплосс не ближе чем StepTrall
extern int NoLoss = 0, //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
MinProfitNoLoss = 0; //минимальная прибыль при переводе вбезубыток
extern int Magic = 77; //магик
extern int Step = 10; //расстояние от цены
extern double Lot = 0.1;
extern int TimeModify = 30; //кол-во секунд раньше которого запрещено изменять ордер
extern int slippage = 30; //Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
5 Lotos017 Автор Сообщений: 70
5 Lotos017 Автор Сообщений: 70
20 alex30774 Сообщений: 770
(OrderSend(Symbol(),OP_BUYSTOP,Lot,price,slippage,SL,TP,«news»,Magic,0,CLR_NONE)!=-1)--SellLimit
(OrderSend(Symbol(),OP_SELLSTOP,Lot,price,slippage,SL,TP,«news»,Magic,0,CLR_NONE)!=-1)--BuyLimit
9 Servir Сообщений: 84
5 Lotos017 Автор Сообщений: 70
5 Lotos017 Автор Сообщений: 70
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий