//Закрывает позицю по типу, при type=1 зароет последний buy, при type=2 зароет последний sell.
//Переменная для названия магиг номера - MG; Запишет ошибку в журнал в случае таковой.
int yOrderClose(int type)
{
int err;
for(int i=1; i<=OrdersTotal(); i++)
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1 && OrderMagicNumber()==MG)
{
err=OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
if(err<0){Print("OrderClose()- Ошибка закрытия OP_BUY. OrderTicket "+OrderTicket()+" OrderLots() "+OrderLots()+" Bid "+Bid+" "+GetLastError());return(-1);}
}
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==2 && OrderMagicNumber()==MG)
{
err=OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
if(err<0){Print("OrderClose()- Ошибка закрытия OP_SELL. OrderTicket "+OrderTicket()+" OrderLots() "+OrderLots()+" Ask "+Ask+" "+GetLastError());return(-1);}
}
}
}
return(0);
}
//если часто применяется вызов простой скользящей средней, удобнее вызывать просто yMa(период средней), значительно сокращает размер кода.
double yMa(int per) {
int timeframe =1440 ;
int period =per ;
int ma_shift =0 ;
int ma_method =MODE_SMA ;
int applied_price =PRICE_CLOSE ;
int shift =1 ;
double ma =iMA(NULL,timeframe,period,ma_shift,ma_method,applied_price,shift);
return(ma) ;
}
//Функция поиска максимума/минимума за заданное количество баров type-максимум или минимум, barsearch -количество баров
double yMaxDayPrice(int type,int barsearch) {
int timeframe =1440 ;
double minmax;
if(type==2){
minmax =Low[iLowest(timeframe,0,MODE_LOW,barsearch,0)];
}
if(type==1){
minmax =High[iHighest(timeframe,0,MODE_HIGH,barsearch,0)];
}
return(minmax);
}
//установка ордеров OP_BUYSTOP или OP_SELLSTOP, type - тип ордера 1-BUYSTOP , 2 - SELLSTOP, open - цена открытия, stop - стоп лосс.
int ySendStopOrder(int type,double open,double stop)
{double op,sl,tp;int err;
if(type==1)
{
op=open;sl=stop;
err=OrderSend(Symbol(),OP_BUYSTOP,Lots,NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),0,"57 FORTRADER.RU",MG,0,Red);
if(err<0){Print("OrderSend()- Ошибка OP_BUYSTOP. op "+op+" sl "+sl+" tp "+tp+" "+GetLastError());return(-1);}
}
if(type==2)
{
op=open;sl=stop;
err=OrderSend(Symbol(),OP_SELLSTOP,Lots,NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),0,"57 FORTRADER.RU",MG,0,Red);
if(err<0){Print("OrderSend()- Ошибка OP_SELLSTOP. op "+op+" sl "+sl+" tp "+tp+" "+GetLastError());return(-1);}
}
return(0);
}
//проверяет есть ли стоп ордера BUYSTOP SELLSTOP
int yChStopPos(int type)
{int i;
for( i=1; i<=OrdersTotal(); i++)
{
if(OrderSelect(i-1,SELECT_BY_POS)==true)
{
if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol() && type==1){return(1);}
if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol() && type==2){return(1);}
}
}
return(0);
}
//удаляет отложенные стоп ордера SELLSTOP или BUYSTOP по type
int yDeleteOrder(int type)
{
for( int i=1; i<=OrdersTotal(); i++)
{
if(OrderSelect(i-1,SELECT_BY_POS)==true)
{
if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol() && type==2)
{
OrderDelete(OrderTicket());
}//if
if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol() && type==1)
{
OrderDelete(OrderTicket());
}//if
}//if
}
return(0);
}
//функция трейлингстопа с шагом.
extern int TrailingStop=40;
extern int TrailingStep=5;
int yTrailingStop()
{int i;bool err;
for( i=1; i<=OrdersTotal(); i++)
{
if(OrderSelect(i-1,SELECT_BY_POS)==true)
{
if(TrailingStop>0 && OrderType()==OP_BUY && OrderSymbol()==Symbol())
{
if(Bid-OrderOpenPrice()>=TrailingStop*Point*mn && TrailingStop>0 && (Bid-Point*TrailingStop*mn)>OrderStopLoss())
{
if(((Bid-Point*TrailingStop*mn)-OrderStopLoss())>=TrailingStep*Point*mn)
{
Print("ТРЕЙЛИМ");
err=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop*mn,OrderTakeProfit(),0,Green);
if(err==false){return(-1);}
GlobalVariableSet(DoubleToStr(OrderTicket(),0),Bid);
}//if(Bid>=OrderStopLoss()
}//if(Bid-OrderOpenPrice()
}//if(BBUSize>0
}//if(OrderSelect(i
if(OrderSelect(i-1,SELECT_BY_POS)==true)
{
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() )
{
if(OrderOpenPrice()-Ask>=TrailingStop*Point*mn && TrailingStop>0 && OrderStopLoss()>(Ask+TrailingStop*Point*mn))
{
if((OrderStopLoss()-(Ask+TrailingStop*Point*mn))>TrailingStep*Point*mn)
{
Print("ТРЕЙЛИМ");
err=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point*mn,OrderTakeProfit(),0,Green);
if(err==false){return(-1);}
}//if(Ask<=OrderStopLoss()
}//if(OrderOpenPrice()
}//if(BBUSize>0
}// if(OrderSelect
}// for( i=1;
return(0);
}
if(DayOfWeek()==5 && Hour()==timeopen&& yMa(maper10) > yMa(maper40) && yChStopPos(1)==0){
max9day= yMaxDayPrice(1, maxdays);
ySendStopOrder(1,max9day+indent*Point*mn,max9day-StopLoss*Point*mn);
}
if(DayOfWeek()==5 && Hour()==timeopen&& yMa(maper10) < yMa(maper40) && yChStopPos(2)==0){
max9day= yMaxDayPrice(2, maxdays);
ySendStopOrder(2,max9day-indent*Point*mn,max9day+StopLoss*Point*mn);
}
if(Hour()==timeclose){yOrderClose(1);yOrderClose(2);yDeleteOrder(1);yDeleteOrder(2);}
yTrailingStop();
Извиняюсь что залез в Вашу тему, если Вы против могу и не появляться здесь...Код://Закрывает позицю по типу, при type=1 зароет последний buy, при type=2 зароет последний sell. //Переменная для названия магиг номера - MG; Запишет ошибку в журнал в случае таковой. int yOrderClose(int type) { int err; for(int i=1; i<=OrdersTotal(); i++) { if (OrderSelect(i-1,SELECT_BY_POS)==true) { if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1 && OrderMagicNumber()==MG) { err=OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); if(err<0){Print("OrderClose()- Ошибка закрытия OP_BUY. OrderTicket "+OrderTicket()+" OrderLots() "+OrderLots()+" Bid "+Bid+" "+GetLastError());return(-1);} } if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==2 && OrderMagicNumber()==MG) { err=OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); if(err<0){Print("OrderClose()- Ошибка закрытия OP_SELL. OrderTicket "+OrderTicket()+" OrderLots() "+OrderLots()+" Ask "+Ask+" "+GetLastError());return(-1);} } } } return(0); }
// Функция закрывает последний ордер или удаляет последний отложенный
// параметр type может принимать значения OP_BUY, OP_SELL, OP_BUYSTOP,OP_SELLSTOP, OP_BUYLIMIT, OP_SELLLIMIT
// Если в ордерах не применяется Magic Number, то параметр mg можно не передавать.
bool Close_LastOrder_by_type( int type, int mg = 0)
{
// ищем самый последний ордер
datetime time=0;
int ticket=-1,i;
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==type && OrderSymbol()==Symbol() && OrderMagicNumber()==mg)
{
if(OrderOpenTime()>time)
{
time=OrderOpenTime();
ticket=OrderTicket();
}
}
}
}
if(OrderTicket()!=ticket)OrderSelect(ticket,SELECT_BY_TICKET);
if(OrderType()<=1)return(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3));
else return(OrderDelete(OrderTicket()));
}
Здесь буду выкладывать свои функции, которые применяю для разработки советников. Если кому нужно применяйте, задавайте вопросы. Критика приветствуется.
// Функция проверяет закрылся ли ордер по стопу. Если ордер закрылся по стопу возвращает true
// в ином случае вернёт false
bool IsClosed_by_StopLoss(int type, int mn, string sym)
{
if(FindOrder_by_type(type,mn, sym)
|| OrdersHistoryTotal()==0
)return(false);// Если ордер ещё открыт выходим
datetime order_open_time=0;
int ticket=-1, i;
//Находим последний ордер по указанным входным параметрам
for( i= OrdersHistoryTotal()-1; i >= 0 ; i-- )
{
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
if( OrderType()==type && OrderMagicNumber() == mn && sym==OrderSymbol() )
if( order_open_time < OrderOpenTime() )
{
order_open_time = OrderOpenTime();
ticket = OrderTicket();
}
}
if( ticket == -1 )return(false);
if( OrderTicket() != ticket )OrderSelect(ticket,SELECT_BY_TICKET);
if( OrderClosePrice() == OrderStopLoss() )return(true);
return(false);
}
//---- Ищет ордера по типу, в случае успеха возвращает true ----//
bool FindOrder_by_type(int type, int mn, string sym)
{
for(int i= OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderMagicNumber() == mn && type == OrderType() && sym==OrderSymbol())
return(true);
}
return(false);
}
how about this onevladicho сказал(а):Код:enum searchMinMaxBy { BY_MIN = 0, BY_MAX }; double MinMaxDayPrice(string symbol, searchMinMaxBy searchBy, int barSearch, int timeFrame = 0, int startFrom = 0) { double extremum = 0.0; switch (searchBy) { case BY_MIN: extremum = Low[iLowest(symbol, timeFrame, MODE_LOW, barSearch, 0)]; case BY_MAX: extremum = High[iHighest(symbol, timeFrame, MODE_HIGH, barSearch, 0)]; } return (extremum); } }