Всем доброго дня.
Можно изменить в коде условие: «Советник открывает позицию в зависимости от закрытия прошлой позиции. Если позиции не было то в зависимости от направления прошлой свечи»
на возможность выставления 2-х отложенных ордеров на определенной дистанции от текущей цены и при срабатывании одного из ордеров 2-й удалялся. Весь остальной алгоритм остается без изменения. Сам подправлял, но рабочей версии не смог добиться.
#property description "Советник открывает позицию в зависимости от закрытия прошлой позиции. Если позиции не было то в зависимости от направления прошлой свечи"
#property description "При достижение Т/P следующий ордер открывается в эту же сторону"
#property description "При достижение S/L следующий открывается в противоположную сторону"
//+------------------------------------------------------------------
#property show_inputs
//+------------------------------------------------------------------
enum TT {BUY, SELL, BUYLIMIT, SELLLIMIT, BUYSTOP, SELLSTOP};
enum YN {No,Yes};
//+------------------------------------------------------------------
extern TT Type = BUY;
extern double Price = 0;
extern int Distance = 0;
extern int stoploss = 300,
takeprofit = 300;
extern double risk = 0.01; //процент от депозита для рассчета объема первой позиции
extern double KoeffMartin = 2.0;
extern int OkrLOT = 2;//округление лота
extern int slippage = 3;//Максимально допустимое отклонение цены для рыночных ордеров
extern int MagicNumb = 77;//Magic
double MINLOT,MAXLOT;
//+------------------------------------------------------------------+
int OnInit()
{
MAXLOT = MarketInfo(Symbol(),MODE_MAXLOT);
MINLOT = MarketInfo(Symbol(),MODE_MINLOT);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTick()
{
double OSL,OTP,OOP,SL,TP;
int tip;
double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
for (int i=0; i
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumb)
{
tip = OrderType();
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OTP = NormalizeDouble(OrderTakeProfit(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
SL=OSL;TP=OTP;
if (tip==OP_BUY)
{
if (OSL==0 && stoploss>=STOPLEVEL && stoploss!=0)
{
SL = NormalizeDouble(OOP - stoploss * Point,Digits);
}
if (OTP==0 && takeprofit>=STOPLEVEL && takeprofit!=0)
{
TP = NormalizeDouble(OOP + takeprofit * Point,Digits);
}
if (SL != OSL || TP != OTP)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify <<",GetLastError(),">> ");
}
}
if (tip==OP_SELL)
{
if (OSL==0 && stoploss>=STOPLEVEL && stoploss!=0)
{
SL = NormalizeDouble(OOP + stoploss * Point,Digits);
}
if (OTP==0 && takeprofit>=STOPLEVEL && takeprofit!=0)
{
TP = NormalizeDouble(OOP - takeprofit * Point,Digits);
}
if (SL != OSL || TP != OTP)
{
if (!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify <<",GetLastError(),">> ");
}
}
return;
}
}
}
tip=-1;
double Lot=0;
for (i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumb)
{
if (OrderProfit()<0)
{
Lot=lot(OrderLots(),KoeffMartin);
tip=OrderType();
}
else
{
Lot=lot(0,1);
if (OrderType()==OP_BUY) tip=OP_SELL;
if (OrderType()==OP_SELL) tip=OP_BUY;
}
break;
}
}
}
if (tip==-1)
{
Lot=lot(0,1);
if (Open[1]>Close[1]) tip=OP_BUY;
else tip=OP_SELL;
}
if (tip==OP_BUY) if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bi d,Digits),slippage,0,0,NULL,MagicNumb,Blue)!=-1) Comment("Open Sell");
if (tip==OP_SELL) if (OrderSend(Symbol(),OP_BUY ,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL ,MagicNumb,Blue)!=-1) Comment("Open Buy");
}
//--------------------------------------------------------------------
double lot(double l,double k)
{
double ML = AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
if (k==1) l = ML*risk/100;
else l = NormalizeDouble(l*k,OkrLOT);
if (l>ML) l = ML;
if (l>MAXLOT) l = MAXLOT;
if (l
return(l);
}
//-----------------------------------------------------------------
{
Lot=lot(0,1);
if (OrderType()==OP_BUY) tip=OP_SELL;
if (OrderType()==OP_SELL) tip=OP_BUY;
}
break;
}
}
}
if (tip==-1)
{
Lot=lot(0,1);
if (Open[1]>Close[1]) tip=OP_BUY;
else tip=OP_SELL;
}
if (tip==OP_BUY) if (OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bi d,Digits),slippage,0,0,NULL,MagicNumb,Blue)!=-1) Comment("Open Sell");
if (tip==OP_SELL) if (OrderSend(Symbol(),OP_BUY ,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL ,MagicNumb,Blue)!=-1) Comment("Open Buy");
}
//--------------------------------------------------------------------
double lot(double l,double k)
{
double ML = AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
if (k==1) l = ML*risk/100;
else l = NormalizeDouble(l*k,OkrLOT);
if (l>ML) l = ML;
if (l>MAXLOT) l = MAXLOT;
if (l
return(l);
}
//-----------------------------------------------------------------
Комментарии (5)
35 AM2 Сообщений: 16403 - Андрей
16 Aleh7999 Автор Сообщений: 92
35 AM2 Сообщений: 16403 - Андрей
16 Aleh7999 Автор Сообщений: 92
Если позиции не было то в зависимости от направления прошлой свечи.
Данный алгоритм нужно заменить на:
Покупка:
Выставляем 2-а отложенных ордера BuyStop по цене указанной в настройках и SellStop по цене указанной в настройках.
Как только цена достигает одного из стоп ордеров, он переходит в рыночную позицию с выставлением ТР и SL. Ордер который не сработал удаляется.
Весь остальной алгоритм остается без изменения т.е.: «При достижение Т/P следующий ордер открывается в эту же сторону»
«При достижение S/L следующий открывается в противоположную сторону»
16 Aleh7999 Автор Сообщений: 92
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий