Как сделать что бы сова вместо стоповых ордеров ставила лимитовые?
Идея советника заключается в том, что стоп ордера дискретно времени перемещаются на заданном расстоянии от текущей цены.
Если цена достаточно резко поползла в одну сторону, то советник просто не успевает переместить ордер и он становится рыночным.
Далее включается тралл ордера.
Мне нужно что б вместо стоповых ордеров сова перемещала лимитовые. Пробовал в коде изменить все op_buystop и op_sellstop поменять на лимитовые=сова воще сдохла и перестала открывать и стоповые. Я не удивился и решил поинтересоваться у профи. Какие ещё параметры надо поменять?
Вот сова:
//+------------------------------------------------------------------+
//| TrailingStopLight.mq4 |
//| Copyright © 2012, Khlystov Vladimir |
//|
https://cmillion.narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012,
[email protected]"
#property link "https://cmillion.narod.ru"
#property show_inputs
//--------------------------------------------------------------------
extern int TimeModify = 30; //кол-во секунд раньше которого запрещено изменять ордер
extern int Step = 10; //расстояние от цены
extern double Lot = 0.1;
extern int Stoploss = 10, //стоплосс, если 0 то не изменяется
Takeprofit = 50; //тейкпрофит, если 0 то не изменяется
extern int TrailingStop = 5; //длинна тралла, если 0 то нет тралла
extern int TrailingStart = 10; //когда включать тралл, например после достижения 40 п прибыл
extern int StepTrall = 2; //шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int NoLoss = 0, //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
MinProfitNoLoss = 0; //минимальная прибыль при переводе вбезубыток
extern int TimeStart = 0 , //ограничение времени работы советника
TimeEnd = 24; //не открываем ордера и закрываем отложки если время не между TimeStart и TimeEnd
extern int slippage = 30; //Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
extern int Magic = 77; //магик
//extern int Key = 0;
//--------------------------------------------------------------------
int STOPLEVEL,TimeBarB,TimeBarS,AN;
//--------------------------------------------------------------------
int init()
{
AN = AccountNumber();
}
//--------------------------------------------------------------------
int deinit()
{
remove_objects("info");
}
//--------------------------------------------------------------------
int start()
{
if (!IsDemo() && !IsTesting() && 32395!=AN) {info();return;}
if (!IsTradeAllowed())
{
Comment("Торговля запрещена IsTradeAllowed");
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)
{
Comment("Торговля запрещена по времени ");
}
//---
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
double OSL,StLo,PriceB,PriceS,OOP,SL,TP;
int b,s,TicketB,TicketS,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)
{
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)
{
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 (TicketS==0 && TicketB>0) {OrderDelete(TicketB);return;}
if (TicketB==0 && TicketS>0) {OrderDelete(TicketS);return;}
if (!Trade)
{
if (b+s==0)
{
if (TicketS+TicketB>0) DeleteAll(-1);
return;
}
}
if (b+TicketB==0 && s==0)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid - Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit * Point,Digits); else TP=0;
if (OrderSend(Symbol(),OP_BUYSTOP,Lot,NormalizeDouble (Ask+Step * Point,Digits),slippage,SL,TP,"news",Magic,0,CLR_NO NE)!=-1) TimeBarB=TimeCurrent();
}
if (s+TicketS==0 && b==0)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask + Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit * Point,Digits); else TP=0;
if (OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDoubl e(Bid - Step * Point,Digits),slippage,SL,TP,"news",Magic,0,CLR_NO NE)!=-1) TimeBarS=TimeCurrent();
}
if (TicketB!=0)
{
if (TimeBarB<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Ask + Step * Point,Digits)-PriceB)/Point>StepTrall)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid - Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit * Point,Digits); else TP=0;
if (OrderModify(TicketB,NormalizeDouble(Ask + Step * Point,Digits),SL,TP,0,CLR_NONE)) TimeBarB=TimeCurrent();
}
}
if (TicketS!=0)
{
if (TimeBarS<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Bid - Step * Point,Digits)-PriceS)/Point>StepTrall)
{
if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask + Stoploss * Point,Digits); else SL=0;
if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit * Point,Digits); else TP=0;
if (OrderModify(TicketS,NormalizeDouble(Bid - Step * Point,Digits),SL,TP,0,CLR_NONE)) TimeBarS=TimeCurrent();
}
}
}
//--------------------------------------------------------------------
bool DeleteAll(int tip)
{
bool error=true;
int err,nn,OT,OMN;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
OMN = OrderMagicNumber();
if (OrderSymbol() == Symbol() && Magic==OrderMagicNumber())
{
OT = OrderType();
if (OT>1 && (OT==tip || tip==-1)) OrderDelete(OrderTicket());
}
}
}
break;
}
return(1);
}
//-------------------------------------------------------------------
bool info()
{
DrawLABELinfo("infofon01",0,100,100,200,"Webdings" ,White,"g");
DrawLABELinfo("infofon02",0,100,280,200,"Webdings" ,White,"g");
DrawLABELinfo("infofon03",0,323,100,200,"Webdings" ,White,"g");
DrawLABELinfo("infofon04",0,323,280,200,"Webdings" ,White,"g");
int Y=110;
DrawLABELinfo("infos"+Y, 0,110,Y,16,"Arial",Red,"Демо версия советника!");Y+=30;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Black,"Возможна работа на демо счете или в тестере");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Black,"Для работы на реале нужно ввести ключ (числовой код в поле Key)");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Black,"Ключ привязан к определенному номеру торгового счета.");Y+=30;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"Для получения бесплатного ключа Вы можете открыть счет в");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"дц InstaForex и зарегистрировать счет на rebate по ссылке:");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Blue,"https://www.getforexrebate.com/ru/register.php?id=3021023");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"При этом Вы будете получать 1,5 $ с каждого лота себе на счет!,");Y+=30;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"Или открыть счет в InstaForex с партнерским кодом BWAO");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"ссылка для открытия счета:");
DrawLABELinfo("infos1"+Y, 0,313,Y,11,"Arial",Blue,"https://instaforex.com/ru/?x=openaccaunt");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"При этом Вы сможете бесплатно получить ключи ко всем");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"советникам из ссылки:");
DrawLABELinfo("infos1"+Y, 0,270,Y,11,"Arial",Blue,"https://cmillion.ru/ru/_setki.php");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"Если у Вас другой брокер, то оплатите 50$ (1500руб)");
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"Способы оплаты:");
DrawLABELinfo("infos1"+Y, 0,235,Y,11,"Arial",Blue,"https://cmillion.narod.ru/info5.html");Y+=30;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Black,"После этого отправьте номер Вашего торгового счета");
DrawLABELinfo("infos1"+Y, 0,482,Y,11,"Arial",Blue,AccountNumber());Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Black,"на почтовый ящик
[email protected]");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Black,"В письме укажите реквизиты оплаты или способ регистрации счета.");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Black,"В ответном письме Вы получите ключ который Вы должны ввести");Y+=20;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Black,"в параметрах советника в поле KEY");Y+=30;
DrawLABELinfo("infos"+Y, 0,110,Y,11,"Arial",Red,"Открыть демо счет:");
DrawLABELinfo("infos1"+Y, 0,250,Y,11,"Arial",Blue,"https://instaforex.com/ru/?x=openaccaunt");
}
//--------------------------------------------------------------------
void DrawLABELinfo(string name, int CORNER, int X, int Y, int font_size, string font_name, color clr, string Name)
{
ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
ObjectSet(name, OBJPROP_CORNER, CORNER);
ObjectSet(Name, OBJPROP_COLOR, clr);
ObjectSet(Name, OBJPROP_BACK, false);
ObjectSet(name, OBJPROP_XDISTANCE, X);
ObjectSet(name, OBJPROP_YDISTANCE, Y);
ObjectSetText(name,Name,font_size,font_name,clr);
}
//+------------------------------------------------------------------+
int remove_objects(string PreName)
{
for(int k=ObjectsTotal()-1; k>=0; k--)
{
string Obj_Name=ObjectName(k);
string Head=StringSubstr(Obj_Name,0,StringLen(PreName));
if (Head==PreName)
{
ObjectDelete(Obj_Name);
}
}
Comment("");
return(0);
}
//--------------------------------------------------------------------+