#property copyright "eevviill"
#property link "
[email protected]"
extern string н_лс = "Настройки лота и стопов";
extern bool Использ_лот_от_дэпо = true;
extern double риск = 0.17;
extern double Лот = 0.1;
extern double лот_плюс_на_посл_ордер = 0;
extern double лот_коеф_на_посл_ордер = 1.5;
extern double сумарный_профит_вал_зак = 30;
extern bool использ_безубыток_эквити = false;
extern double коеф_безубыточности = 0.3; //активация от профита
extern bool использ_профит_от_эквити=false;
extern double эквити_для_расчёта = 20000; //каждое удвоение эквити умножает на 2 сумарный профит (20000=30 40000=60)
extern string пус1 = "";
extern string н_о = "Настройки ордера";
extern int шаг_между_ордерами = 30;
extern int проскальзывание = 2;
extern int меджик = 74335;
extern string коментарий = "Гойда";
extern int MaxAttempts = 14; //максимальное количество попыток открыть или закрыть ордер
extern string пус2 = "";
extern string н_rsi = "Настройки RSI";
extern int RSI_period = 14;
extern int RSI_верхний_уровень = 55; //для сел
extern int RSI_нижний_уровень = 45; //для бай
int кільк_бай,кільк_сел,сигнал_вхід;
static int попередній_час=0;
int лот_округлений=1;
double загальний_профіт_закр;
double point;
//////////////////////////////////////////////////////////////
int init()
{
попередній_час = Time[0];
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01) лот_округлений=2;
point=Point;
if(Digits==3 || Digits==5) {point*=10;проскальзывание*=10;}
эквити_для_расчёта=AccountEquity();
return;
}
////////////////////////////////////////////////////////////
int start()
{
//розрахунок лота від % депозиту
if(Использ_лот_от_дэпо) Лот=Лот_від_депо_ф();
//закриття всіх ордерів по загальному профіту в пунктах
загальний_профіт_закр=(Лот*10)*сумарный_профит_вал_зак;
if(использ_профит_от_эквити) загальний_профіт_закр=сумарный_профит_вал_зак*(AccountBalance()/эквити_для_расчёта);
if(Профіт_валюти_ф()>=загальний_профіт_закр) закриття_ордеру_ф();
//можливість відкриття і відкриття додаткових ордерів
перевірка_відкр_дод_ордерів();
//беззбитковість (в еквіті)
if(использ_безубыток_эквити)
{
if(Профіт_валюти_ф()>=загальний_профіт_закр*коеф_безубыточности) беззбитковість_ф();
}
//робота по відкриттю бара
if (Time[0] == попередній_час) {Sleep(50);return(0);}
попередній_час = Time[0];
//сигнал на вхід
сигнал_вхід =сигнал_вхід_ф();
//вхід
if(сигнал_вхід!=0) відкриття_ордеру_ф();
return(0);
}
//расчёт функций
/////////////////////////////////////////////////////////////////////////////////////////////
int сигнал_вхід_ф()
{
//объявление индикаторов
double RSI1 = iRSI(Symbol(),0,RSI_period,PRICE_CLOSE,1);
double RSI1_поп = iRSI(Symbol(),0,RSI_period,PRICE_CLOSE,2);
//сигнал для бай
if(RSI1_поп>RSI_нижний_уровень && RSI1<RSI_нижний_уровень) return(1);
//сигнал для сел
if(RSI1_поп<RSI_верхний_уровень && RSI1>RSI_верхний_уровень) return(-1);
return(0);
}
///////////////////////////////////////////////////////////////////////////////////////////////
void відкриття_ордеру_ф()
{
//подсчёт открытых позиций
підрахунок_відкр_ордерів();
int тікет_відкриття_ордеру=-1;
for (int j_op = 0; j_op < MaxAttempts; j_op++)
{
while(IsTradeContextBusy()) Sleep(1000);
if(сигнал_вхід>0 && кільк_бай==0 && кільк_сел==0) тікет_відкриття_ордеру=OrderSend(Symbol(),OP_BUY,NormalizeDouble(Лот,лот_округлений),Ask,проскальзывание,0,0,коментарий,меджик,0,Green);
if(сигнал_вхід<0 && кільк_сел==0 && кільк_бай==0) тікет_відкриття_ордеру=OrderSend(Symbol(),OP_SELL,NormalizeDouble(Лот,лот_округлений),Bid,проскальзывание,0,0,коментарий,меджик,0,OrangeRed);
if(тікет_відкриття_ордеру>-1)break;
}
}
///////////////////////////////////////////////////////////////////////////////////
double Профіт_валюти_ф()
{
double профіт;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==меджик)
{
профіт+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
return(профіт);
}
////////////////////////////////////////////////////////////////////////////////////
void підрахунок_відкр_ордерів()
{
кільк_бай=0;
кільк_сел=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS);
{
if(OrderMagicNumber()==меджик)
{
if(OrderType()==OP_BUY) кільк_бай++;
if(OrderType()==OP_SELL) кільк_сел++;
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
void закриття_ордеру_ф()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS);
{
if(OrderMagicNumber()==меджик)
{
if(OrderSymbol()==Symbol())
{
bool закрився_ордер=false;
for (int j_ex = 0;j_ex < MaxAttempts; j_ex++)
{
while(IsTradeContextBusy()) Sleep(1000);
if(OrderType()==OP_BUY ) закрився_ордер=OrderClose(OrderTicket(),OrderLots(),Bid,проскальзывание,Yellow);
if(OrderType()==OP_SELL) закрився_ордер=OrderClose(OrderTicket(),OrderLots(),Ask,проскальзывание,Yellow);
if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_BUYLIMIT) закрився_ордер=OrderDelete(OrderTicket(),CLR_NONE);
if(закрився_ордер==true)break;
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////
void перевірка_відкр_дод_ордерів()
{
підрахунок_відкр_ордерів();
if(кільк_бай!=0 || кільк_сел!=0)
{
/////////////////////////////////данні останнього ордеру
int тип_ост_ордера=-1;
double лот_ост_ордера=0;
double ціна_ост_ордера=0;
int тікет_відкриття_ордеру;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderMagicNumber()==меджик)
{
if(OrderSymbol()==Symbol())
{
тип_ост_ордера=OrderType();
лот_ост_ордера=NormalizeDouble(OrderLots(),лот_округлений);
ціна_ост_ордера=OrderOpenPrice();
break;
}
}
}
}
/////////////////////////////////данні передостаннього ордеру
double ціна_п_ост_ордера=0;
if(кільк_бай==0 || кільк_сел==0) ціна_п_ост_ордера=ціна_ост_ордера;
int вибір_ордера=0;
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderMagicNumber()==меджик)
{
if(OrderSymbol()==Symbol())
{
вибір_ордера++;
if(вибір_ордера==2)
{
ціна_п_ост_ордера=OrderOpenPrice();
break;
}
}
}
}
}
//////////якщо останній ордер бай
if(тип_ост_ордера==OP_BUY)
{
if(Ask<=ціна_п_ост_ордера-шаг_между_ордерами*point)
{
тікет_відкриття_ордеру=-1;
for (int j = 0; j < MaxAttempts; j++)
{
while(IsTradeContextBusy()) Sleep(1000);
тікет_відкриття_ордеру=OrderSend(Symbol(),OP_SELL,NormalizeDouble(лот_ост_ордера*лот_коеф_на_посл_ордер+лот_плюс_на_посл_ордер,лот_округлений),Bid,проскальзывание,0,0,коментарий,меджик,0,OrangeRed);
if(тікет_відкриття_ордеру>-1)break;
}
}
}
//////////якщо останній ордер сел
if(тип_ост_ордера==OP_SELL)
{
if(Bid>=ціна_п_ост_ордера+шаг_между_ордерами*point)
{
тікет_відкриття_ордеру=-1;
for (j = 0; j < MaxAttempts; j++)
{
while(IsTradeContextBusy()) Sleep(1000);
тікет_відкриття_ордеру=OrderSend(Symbol(),OP_BUY,NormalizeDouble(лот_ост_ордера*лот_коеф_на_посл_ордер+лот_плюс_на_посл_ордер,лот_округлений),Ask,проскальзывание,0,0,коментарий,меджик,0,Blue);
if(тікет_відкриття_ордеру>-1)break;
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
double Лот_від_депо_ф()
{
double Вільна_маржа =AccountFreeMargin();
double Маржа_на_1_лот =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Мін_лот =MarketInfo(Symbol(),MODE_MINLOT);
double Макс_лот =MarketInfo(Symbol(),MODE_MAXLOT);
double Крок_лоту =MarketInfo(Symbol(),MODE_LOTSTEP);
double Лот_п =MathFloor(Вільна_маржа*риск/100/Маржа_на_1_лот/Крок_лоту)*Крок_лоту;
if(Лот_п<Мін_лот) Лот_п=Мін_лот;
if(Лот_п>Макс_лот) Лот_п=Макс_лот;
if(Лот_п*Маржа_на_1_лот>Вільна_маржа) return(0.0);
return(Лот_п);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
double ціна_беззбитковості_ф()
{
int Spr= MarketInfo(Symbol(),MODE_SPREAD);
//------------ Безубыток ---------------------------------------------------
double B2_B=0,B2_S=0,B2_LB=0,B2_LS=0,BSw=0,BCo=0,SSw=0,SCo=0,Prof=0;
for(int b2=0;b2<OrdersTotal();b2++) //
{
if(OrderSelect(b2,SELECT_BY_POS,MODE_TRADES)==false) continue;
if (OrderSymbol()==Symbol() && OrderMagicNumber()==меджик)
{
if (OrderType()==OP_BUY)
{
B2_B=((B2_B*B2_LB)+(OrderOpenPrice()*OrderLots()))/(B2_LB+OrderLots());
B2_LB=NormalizeDouble(B2_LB+OrderLots(),2);
BSw=BSw+OrderSwap();
BCo=BCo+OrderCommission();
Prof=Prof+OrderProfit()+OrderSwap()+OrderCommission();
}
if (OrderType()==OP_SELL)
{
B2_S=((B2_S*B2_LS)+(OrderOpenPrice()*OrderLots()))/(B2_LS+OrderLots());
B2_LS=NormalizeDouble(B2_LS+OrderLots(),2);
SSw=SSw+OrderSwap();
SCo=SCo+OrderCommission();
Prof=Prof+OrderProfit()+OrderSwap()+OrderCommission();
}
}}
/////////////////////////////////////////////////////////////////////////////////////
double M2B=0,M2S=0 ,M5;
if (B2_LB>B2_LS) // Идём вверх
{
for(int J2=0;J2<10000;J2++)
{
M2B=J2*B2_LB*10;
M2S=((B2_B-B2_S+Spr*Point)/Point+J2)*(B2_LS*(-10));
if (M2B+M2S+BSw+SSw>=0)
{
M5=NormalizeDouble(B2_B+J2*Point,Digits);
break;
}}}
////////////////////////
if (B2_LS>B2_LB) // Идём вниз
{
for(int J3=0;J3<10000;J3++)
{
M2S=J3*B2_LS*10;
M2B=((B2_B-B2_S+Spr*Point)/Point+J3)*(B2_LB*(-10));
if (M2S+M2B+BSw+SSw>=0)
{
M5=NormalizeDouble(B2_S-(J3+Spr)*Point,Digits);
break;
}}}
// M5=рівень беззбитковості
return(M5);
}
//////////////////////////////////////////////////////////////////////////////////////
void беззбитковість_ф()
{
double ціна_беззбитковості=ціна_беззбитковості_ф();
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderMagicNumber()==меджик)
{
while(IsTradeContextBusy()) Sleep(1000);
//////////////
if(OrderType()==OP_BUY)
{
if(NormalizeDouble(ціна_беззбитковості,Digits)>Bid && (NormalizeDouble(OrderTakeProfit(),Digits)!=NormalizeDouble(ціна_беззбитковості,Digits) && OrderStopLoss()!=NormalizeDouble(ціна_беззбитковості,Digits)))
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(ціна_беззбитковості,Digits),CLR_NONE);
///
if(NormalizeDouble(ціна_беззбитковості,Digits)<Bid && (NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(ціна_беззбитковості,Digits) && OrderTakeProfit()!=NormalizeDouble(ціна_беззбитковості,Digits)))
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(ціна_беззбитковості,Digits),OrderTakeProfit(),CLR_NONE);
}
/////////////
if(OrderType()==OP_SELL)
{
if(NormalizeDouble(ціна_беззбитковості,Digits)>Ask && (NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(ціна_беззбитковості+MarketInfo(Symbol(),MODE_SPREAD)*point,Digits) && OrderTakeProfit()!=NormalizeDouble(ціна_беззбитковості+MarketInfo(Symbol(),MODE_SPREAD)*point,Digits)))
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(ціна_беззбитковості+MarketInfo(Symbol(),MODE_SPREAD)*point,Digits),OrderTakeProfit(),CLR_NONE);
///
if(NormalizeDouble(ціна_беззбитковості,Digits)<Ask && (NormalizeDouble(OrderTakeProfit(),Digits)!=NormalizeDouble(ціна_беззбитковості+MarketInfo(Symbol(),MODE_SPREAD)*point,Digits) && OrderStopLoss()!=NormalizeDouble(ціна_беззбитковості+MarketInfo(Symbol(),MODE_SPREAD)*point,Digits)))
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(ціна_беззбитковості+MarketInfo(Symbol(),MODE_SPREAD)*point,Digits),CLR_NONE);
}
}
}
}
}