Помогите прописать Стоп лосс

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Евгений
17
Евгений  

Уважаемые, сам я в данной теме не шарю, так что прошу Вас помочь прописать возможность установки стоп-лосса в данном советнике. Заранее спасибо.

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()

Rid
3170
Rid  

В код не вникал.Вот вам образец по лимитникам:

//в глоб. переменные:
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);} 
}
Евгений
17
Евгений  
rid >>:

В код не вникал.Вот вам образец по лимитникам:




угу, спасибо, бум разбираться :-)

Rid
3170
Rid  
В коде выше была ошибка(неточность) . Исправил.
Vasiliy Orlov
1134
Vasiliy Orlov  
Вот
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()
Rid
3170
Rid  

В вашей версии, vasya_vasya, журнал иногда будет возвращать ошибку 130, если  пользователь задаст стоплосс  в СВОЙСТВАХ ЭКСПЕРТА равным нулю. 

Vasiliy Orlov
1134
Vasiliy Orlov  
rid писал(а) >>

В вашей версии, vasya_vasya, журнал иногда будет возвращать ошибку 130, если пользователь задаст стоплосс в СВОЙСТВАХ ЭКСПЕРТА равным нулю.

Вместо нуля пусть задает 5000, как правило мысленный стоп лосс никогда не превышает эту величину. Можно поставить и 10000 в зависимости от направления сделки и цены самой валюты.

Писать лишнее условие в таком красивом коде смысла не виу, так как оно действительно лишнее, а для автора скорее всего это не понадобится.

Ни в дном своем эксперте не думал, чтоб заменить +5000 пунктов на нулевой стоп. В большинстве случаев 5000 пунктов хватит чтобы дойти до маржин кола.

Евгений
17
Евгений  
vasya_vasya >>:

Вместо нуля пусть задает 5000, как правило мысленный стоп лосс никогда не превышает эту величину. Можно поставить и 10000 в зависимости от направления сделки и цены самой валюты.

Писать лишнее условие в таком красивом коде смысла не виу, так как оно действительно лишнее, а для автора скорее всего это не понадобится.

Ни в дном своем эксперте не думал, чтоб заменить +5000 пунктов на нулевой стоп. В большинстве случаев 5000 пунктов хватит чтобы дойти до маржин кола.


Спасибо большое.
Artem Angelovsky
29
Artem Angelovsky  

ДЕКОМПЛЯЦИЯ ЗАПРЕЩЕНА!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий