В код не вникал.Вот вам образец по лимитникам:
//в глоб. переменные: extern int MAGIC =51122; extern int sl =55; // Размер стоплосса extern int tp = 25; // Размер тейкпрофита #include <stdlib.mqh> #include <stderror.mqh> int ticket; //------------------------------ //вот установка селллим: if ( если условия соотв. - выставляем ){ double p_Bid =Bid+DistanceSet*Point; //цена установки ордера //на расстоянии DistanceSet от текущей цены double ld_Stop_=0, ld_Take_=0; if (sl!=0) ld_Stop_=p_Bid+sl*Point;//задаем стоплосс if (tp!=0) ld_Take_=p_Bid-tp*Point;//задаем тейкпрофит ticket= OrderSend(Symbol(),OP_SELLLIMIT,Lots(),p_Bid,10, ld_Stop_,ld_Take_,0,MAGIC, 0, DarkGreen); if(ticket<0){Print("Ошибка установки ордера SELLLIMIT ",GetLastError());return(0);} } //вот байлим if ( если условия соотв. - выставляем ) { double ld_Stop=0, ld_Take=0; double p_Ask=Ask-DistanceSet*Point;//цена установки ордера //на расстоянии DistanceSet от текущей цены if (sl!=0) ld_Stop=p_Ask-sl*Point; if (tp!=0) ld_Take=p_Ask+tp*Point; ticket= OrderSend(Symbol(),OP_BUYLIMIT,Lots(),p_Ask,10, ld_Stop,ld_Take,0 ,MAGIC, 0, DarkBlue); if(ticket<0){Print("Ошибка установки ордера BUYLIMIT ",GetLastError());return(0);} }
extern double lots=0.01; //количество лотов extern int range = 100; //диапазон extern int stoploss=30; extern int slippage=0; double equator,interval; int cnt,TicketBuyLimit,TicketSellLimit,TicketBuy,TicketSell; int init(){ interval=range*Point; equator=Bid; return(0); }//init() int start(){ // если нет какого-то отложенного ордера, нужно его отложить if(TicketBuyLimit<1)TicketBuyLimit=OrderSend(Symbol(),OP_BUYLIMIT,lots,equator-interval, slippage,Bid-stoploss*Point,equator,"OP_BUYLIMIT", 666,0,Red); if(TicketSellLimit<1)TicketSellLimit=OrderSend(Symbol(),OP_SELLLIMIT,lots,equator+interval, slippage,Ask+stoploss*Point,equator,"OP_SELLLIMIT",666,0,Blue); // --------------------------------------------------------- // если ордер поменял свой тип с BUYLIMIT на BUY, // значит цена опустилась на interval пунктов и нужно открывать новый BUYLIMIT if(OrderSelect(TicketBuyLimit, SELECT_BY_TICKET)==true){ if(OrderType()==OP_BUY){ TicketBuy=TicketBuyLimit; TicketBuyLimit=0; equator=OrderOpenPrice(); } } // --------------------------------------------------------- // если ордер поменял свой тип с SELLLIMIT на SELL, // значит цена поднялась на interval пунктов и нужно открывать новый BUYLIMIT if(OrderSelect(TicketSellLimit, SELECT_BY_TICKET)==true){ if(OrderType()==OP_SELL){ TicketSell=TicketSellLimit; TicketSellLimit=0; equator=OrderOpenPrice(); } } // --------------------------------------------------------- // если ордер BUY закрылся по тейкпрофиту, // значит цена поднялась на interval пунктов и нужно открывать новый BUYLIMIT // а так же выбрать текущий TicketBuy (ближайший открытый ордер BUY) if(OrderSelect(TicketBuy, SELECT_BY_TICKET)==true){ if(OrderCloseTime()>0){ OrderDelete(TicketBuyLimit); TicketBuyLimit=0; TicketBuy=0; equator=OrderClosePrice(); for(cnt=0;cnt<OrdersTotal();cnt++){ if(OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES)==true){ if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderOpenPrice()+5>equator && OrderOpenPrice()-5<equator)TicketBuy=OrderTicket(); } } } } // --------------------------------------------------------- // если ордер SELL закрылся по тейкпрофиту, // значит цена опустилась на interval пунктов и нужно открывать новый SELLLIMIT // а так же выбрать текущий TicketSell (ближайший открытый ордер SELL) if(OrderSelect(TicketSell, SELECT_BY_TICKET)==true){ if(OrderCloseTime()>0){ OrderDelete(TicketSellLimit); TicketSellLimit=0; TicketSell=0; equator=OrderClosePrice(); for(cnt=0;cnt<OrdersTotal();cnt++){ if(OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES)==true){ if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderOpenPrice()+5>equator && OrderOpenPrice()-5<equator)TicketSell=OrderTicket(); } } } } // --------------------------------------------------------- return(0); }//start()
В вашей версии, vasya_vasya, журнал иногда будет возвращать ошибку 130, если пользователь задаст стоплосс в СВОЙСТВАХ ЭКСПЕРТА равным нулю.
В вашей версии, vasya_vasya, журнал иногда будет возвращать ошибку 130, если пользователь задаст стоплосс в СВОЙСТВАХ ЭКСПЕРТА равным нулю.
Вместо нуля пусть задает 5000, как правило мысленный стоп лосс никогда не превышает эту величину. Можно поставить и 10000 в зависимости от направления сделки и цены самой валюты.
Писать лишнее условие в таком красивом коде смысла не виу, так как оно действительно лишнее, а для автора скорее всего это не понадобится.
Ни в дном своем эксперте не думал, чтоб заменить +5000 пунктов на нулевой стоп. В большинстве случаев 5000 пунктов хватит чтобы дойти до маржин кола.
Вместо нуля пусть задает 5000, как правило мысленный стоп лосс никогда не превышает эту величину. Можно поставить и 10000 в зависимости от направления сделки и цены самой валюты.
Писать лишнее условие в таком красивом коде смысла не виу, так как оно действительно лишнее, а для автора скорее всего это не понадобится.
Ни в дном своем эксперте не думал, чтоб заменить +5000 пунктов на нулевой стоп. В большинстве случаев 5000 пунктов хватит чтобы дойти до маржин кола.
ДЕКОМПЛЯЦИЯ ЗАПРЕЩЕНА!

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уважаемые, сам я в данной теме не шарю, так что прошу Вас помочь прописать возможность установки стоп-лосса в данном советнике. Заранее спасибо.
extern double lots=0.01; //количество лотов
extern int range = 100; //диапазон
double equator,interval;
int cnt,TicketBuyLimit,TicketSellLimit,TicketBuy,TicketSell;
int init(){
interval=range*Point;
equator=Bid;
return(0);
}//init()
int start(){
// если нет какого-то отложенного ордера, нужно его отложить
if(TicketBuyLimit<1)TicketBuyLimit=OrderSend(Symbol(),OP_BUYLIMIT,lots,equator-interval,
0,0,equator,"OP_BUYLIMIT", 666,0,Red);
if(TicketSellLimit<1)TicketSellLimit=OrderSend(Symbol(),OP_SELLLIMIT,lots,equator+interval,
0,0,equator,"OP_SELLLIMIT",666,0,Blue);
// ---------------------------------------------------------
// если ордер поменял свой тип с BUYLIMIT на BUY,
// значит цена опустилась на interval пунктов и нужно открывать новый BUYLIMIT
if(OrderSelect(TicketBuyLimit, SELECT_BY_TICKET)==true){
if(OrderType()==OP_BUY){
TicketBuy=TicketBuyLimit;
TicketBuyLimit=0;
equator=OrderOpenPrice();
}
}
// ---------------------------------------------------------
// если ордер поменял свой тип с SELLLIMIT на SELL,
// значит цена поднялась на interval пунктов и нужно открывать новый BUYLIMIT
if(OrderSelect(TicketSellLimit, SELECT_BY_TICKET)==true){
if(OrderType()==OP_SELL){
TicketSell=TicketSellLimit;
TicketSellLimit=0;
equator=OrderOpenPrice();
}
}
// ---------------------------------------------------------
// если ордер BUY закрылся по тейкпрофиту,
// значит цена поднялась на interval пунктов и нужно открывать новый BUYLIMIT
// а так же выбрать текущий TicketBuy (ближайший открытый ордер BUY)
if(OrderSelect(TicketBuy, SELECT_BY_TICKET)==true){
if(OrderCloseTime()>0){
OrderDelete(TicketBuyLimit);
TicketBuyLimit=0;
TicketBuy=0;
equator=OrderClosePrice();
for(cnt=0;cnt<OrdersTotal();cnt++){
if(OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES)==true){
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY &&
OrderOpenPrice()+5>equator && OrderOpenPrice()-5<equator)TicketBuy=OrderTicket();
}
}
}
}
// ---------------------------------------------------------
// если ордер SELL закрылся по тейкпрофиту,
// значит цена опустилась на interval пунктов и нужно открывать новый SELLLIMIT
// а так же выбрать текущий TicketSell (ближайший открытый ордер SELL)
if(OrderSelect(TicketSell, SELECT_BY_TICKET)==true){
if(OrderCloseTime()>0){
OrderDelete(TicketSellLimit);
TicketSellLimit=0;
TicketSell=0;
equator=OrderClosePrice();
for(cnt=0;cnt<OrdersTotal();cnt++){
if(OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES)==true){
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL &&
OrderOpenPrice()+5>equator && OrderOpenPrice()-5<equator)TicketSell=OrderTicket();
}
}
}
}
// ---------------------------------------------------------
return(0);
}//start()