//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
//------------------------------------------------------------------
//
//-----------------------условия марина------------------------
extern double LotSize = 1.0; // Величина торгуемого лота
extern bool MM = true; // использовать ли мартингейл
extern double LotExponent = 7; // на сколько умножать убыточный лот
extern int LotExponentStart = 1; // после какой по счёту убыточной сделки включать мартингейл
extern int LotExponentMax = 3; // сколько раз умножать лот
//-------------------------------------------------------------------
extern int ma1per=5;
extern int ma2per=20;
extern int ma3per=50;
extern int ma4per=50;
extern string Name_Expert = "Rsi Trader";
extern bool UseAutoMagic = true;
extern int ManualMagic = 28282828;
extern double StopLoss = 100;
extern double TakeProfit = 100;
extern int Slippage = 5;
extern double Lots = 0.1;
extern double MaximumRisk = 0;
extern double DecreaseFactor = 3;
//
bool dummyResult;
string s_symbol;
int MAGIC;
int digit,STOPLEVEL;
double point = 1;
//
int init()
{
s_symbol = Symbol();
digit = MarketInfo(s_symbol,MODE_DIGITS);
if (digit==2 || digit==4) point = 1;
if (digit==3 || digit==5) point = 10;
if (digit==6) point = 100;
if (UseAutoMagic) MAGIC = ManualMagic;
else MAGIC = ManualMagic;
return(0);
}
//
//
int start()
{
double ma1 = iMA (NULL,0,ma1per,0,MODE_EMA,PRICE_CLOSE,1);
double ma2 = iMA (NULL,0,ma2per,0,MODE_EMA,PRICE_CLOSE,1);
double ma3 = iMA (NULL,0,ma3per,0,MODE_EMA,PRICE_CLOSE,1);
double ma4 = iMA (NULL,0,ma4per,0,MODE_EMA,PRICE_CLOSE,1);
//
if (!ExistPositions())
{
if(ma1<ma2 && ma2>ma3 && ma3>ma4 )
{
OpenBuy();
return(0);
}
if(ma1>ma2 && ma2<ma3 && ma3<ma4 )
{
OpenSell();
return(0);
}
}
return (0);
}
//
bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == s_symbol && OrderMagicNumber() == MAGIC) {
return(true);
}
}
}
return(false);
}
//
void OpenBuy()
{
double lbStop = 0; if (StopLoss>0) lbStop = NormalizeDouble(Ask-StopLoss *Point*point,digit);
double lbTake = 0; if (TakeProfit>0) lbTake = NormalizeDouble(Ask+TakeProfit*Point*point,digit);
dummyResult = OrderSend(s_symbol,OP_BUY,LotsOptimized(StopLoss),NormalizeDouble(Ask,Digits),Slippage,lbStop,lbTake,Name_Expert,MAGIC,0);
}
void OpenSell()
{
double lsStop = 0; if (StopLoss>0) lsStop = NormalizeDouble(Bid+StopLoss *Point*point,digit);
double lsTake = 0; if (TakeProfit>0) lsTake = NormalizeDouble(Bid-TakeProfit*Point*point,digit);
dummyResult = OrderSend(s_symbol,OP_SELL,LotsOptimized(StopLoss),NormalizeDouble(Bid,Digits),Slippage,lsStop,lsTake,Name_Expert,MAGIC,0);
}
//
double LotsOptimized(double stopLoss)
{
double lot_min = MarketInfo(s_symbol,MODE_MINLOT);
double lot_max = MarketInfo(s_symbol,MODE_MAXLOT);
double lot_step = MarketInfo(s_symbol,MODE_LOTSTEP);
double contract = MarketInfo(s_symbol,MODE_LOTSIZE);
double lot = Lots;
int orders = HistoryTotal(); // history orders total
int losses = 0; // number of losses orders without a break
//
//
//
//
//
if(lot_min < 0.0 || lot_max <= 0.0 || lot_step <= 0.0)
{
Print("CalculateVolume: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]");
return(0);
}
if(AccountLeverage()<=0)
{
Print("CalculateVolume: invalid AccountLeverage() [",AccountLeverage(),"]");
return(0);
}
//
//
//
//
//
if (MaximumRisk > 0 && stopLoss>0)
{
double pipMultiplier=1;
int tdigit = MarketInfo(s_symbol,MODE_DIGITS);
if (tdigit==2 || tdigit==4) pipMultiplier = 1;
if (tdigit==3 || tdigit==5) pipMultiplier = 10;
if (tdigit==6) pipMultiplier = 100;
double _point = MarketInfo(s_symbol,MODE_POINT);
lot = AccountFreeMargin()*(MaximumRisk/100.0)/(stopLoss*pipMultiplier*MarketInfo(s_symbol,MODE_TICKVALUE));
}
//+++++++++++++++++++++++++++++++++мартин надо исправить +++++++++++++++++++++++++++++++++++++++++++
if (MM)
{
lots = LotSize;
int ct = 0;
for (int c=1;c<=OrdersTotal();c++)
{
OrderSelect(OrdersTotal()-c,SELECT_BY_POS,MODE_TRADES);
if (OrderMagicNumber() != MAGIC) continue;
ct+=1; break;
}
if (ct == 0)
{
int clt = 0;
for (int co=1;co<=OrdersHistoryTotal();co++)
{
OrderSelect(OrdersHistoryTotal()-co,SELECT_BY_POS,MODE_HISTORY);
if (OrderMagicNumber() != MAGIC) continue;
if (OrderProfit() < 0) { clt+=1; if (clt < LotExponentStart+LotExponentMax) { lot = OrderLots(); } } else break;
}
if (clt >= LotExponentStart && LotExponentMax != 0)
{
clt = 0;
int mult = 0;
for (int co2=1;co2<=OrdersHistoryTotal();co2++)
{
OrderSelect(OrdersHistoryTotal()-co2,SELECT_BY_POS,MODE_HISTORY);
if (OrderMagicNumber() != MAGIC) continue;
if (OrderProfit() < 0) { clt+=1; if (clt >= LotExponentStart) { lot*=LotExponent; mult+=1; } }
if (OrderProfit() >= 0) break;
}
if (mult <= LotExponentMax) lots = lot;
}
}
}
//+++++++++++++++++ конец мартина ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!= s_symbol || OrderType() > OP_SELL) continue;
//
//
//
//
//
if(OrderProfit() > 0) break;
if(OrderProfit() < 0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot - lot * losses/DecreaseFactor,2);
}
//
//
//
//
//
lot=NormalizeDouble(lot/lot_step,0)*lot_step;
if(lot<lot_min) lot=lot_min;
if(lot>lot_max) lot=lot_max;
return(lot);
}
//*******************************************