//+------------------------------------------------------------------+
//| 789v2.mq4 |
//+------------------------------------------------------------------+
#property version "1.00"
#property strict
//-----Входные данные
extern int SL = 100; //Стоплос
extern int TP = 450; //Тейкпрофит
extern int MG = 456789;//Магик
extern int SP = 30; //Слиппейдж
extern double LT = 0.01; //Объем сделки
extern double ak = 0.01; //ариф коэф
extern int gk = 3; //геом коэф
extern color clolor_buy = clrAliceBlue;//Цвет ордеров бай
extern color color_sell = clrAliceBlue;//Цвет ордеров селл
extern color celevoj_prof = clrAliceBlue;//Цвет целевого профита
extern color one_liniay = clrAliceBlue;//Цвет первой линии
extern color two_liniay = clrAliceBlue;//Цвет второй линии
class LastOrder
{
private:
int order_tiket;
datetime last_time;
public:
int FindLastOrdrer(int type = -1)
{
int ticket = -1;
datetime dt = 0;
int cnt = HistoryTotal();
for(int i=0; i < cnt; i++)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() != 456789) continue;
if(type != -1 && OrderType() != type) continue;
if(OrderCloseTime() > dt)
{
dt = OrderCloseTime();
ticket = OrderTicket();
}
}
order_tiket = ticket;
return order_tiket;
}
} LO;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class Lot
{
private:
double lt;
public:
double fiks_lot()
{
return lt=0.01;
}
double dannij_lot(double lot)
{
lt=lot;
return lt;
}
double min_lot()
{
lt = MarketInfo(_Symbol,MODE_MINLOT);
return lt;
}
double max_lot()
{
lt = MarketInfo(_Symbol,MODE_MAXLOT);
return lt;
}
double balance_lot()
{
lt = NormalizeDouble(MathCeil(AccountBalance()/100)/100,2);
return lt;
}
double eqitity_lot()
{
lt = NormalizeDouble(MathCeil(AccountEquity()/100)/100,2);
return lt;
}
double ArifPlus(int ticket, double koef)
{
if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
{
if(OrderLots()+ koef > min_lot() || OrderLots()+ koef > max_lot())
{
double profit = OrderProfit()+OrderCommission()+OrderSwap();
if(profit>0.00001)
lt = OrderLots()+ koef;
else
lt = OrderLots();
}
}
return lt;
}
double GeomPlus(int ticket, double koef)
{
if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
{
double profit = OrderProfit()+OrderCommission()+OrderSwap();
if(OrderLots()* koef > min_lot() || OrderLots()* koef > max_lot())
{
if(profit>0.00001)
lt = OrderLots()* koef;
else
lt = OrderLots();
}
}
return lt;
}
} VL;
enum order_lot
{
fiks_lot,//фиксированый
dannij_lot,//данный лот
min_lot,//минимальный
max_lot,//максимальный
balance_lot,//лот баланса
eqity_lot,//лот по эквити
arif_lot,//лот ариф
geom_lot//лот геом
};
sinput order_lot o_lot = 0;//Вид лота
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if(OrdersTotal()==0)
{
Comment(LO.FindLastOrdrer());//это строка работает.
int ticketss = OrderSend(_Symbol,OP_SELL,Ust_lot(),Bid,30,NormalizeDouble(Ask+700*Point,Digits),NormalizeDouble(Bid-1400*Point,Digits),NULL,456789,0,color_sell);
}
}
//+------------------------------------------------------------------+
double Ust_lot(double lot= 0.03)
{
switch(o_lot)
{
case 0://фиксированный лот
lot = 0.01;
break;
case 1://данный лот
lot = VL.dannij_lot(0.05);
break;
case 2://минимальный лот
lot = VL.min_lot();
break;
case 3://максимальный лот
lot = VL.max_lot();
break;
case 4://лот по балансу
lot = VL.balance_lot();
break;
case 5://лот по эквити
lot = VL.eqitity_lot();
break;
case 6:
lot = VL.ArifPlus(LO.FindLastOrdrer(),ak);// строка 160 работает правильно а это 188 не возвращает нужное число
break;
case 7:
lot = VL.GeomPlus(LO.FindLastOrdrer(),gk);
break;
}
return lot;
}