#property copyright “fx.09@mail.ru”
#property link “”
int PauseMin=10; // 镟箸?戾驿?皴痂彘 铕溴痤?
extern double LotExponent = 1.59; // 筲咫梓屙桢 腩蜞 铕溴痤?觐脲?
extern double slip = 3.0; // 镳铖赅朦琨忄龛?
extern double risk = 0.3; // 羼腓 眍朦 礤 疣犷蜞弪, 羼腓 犷朦 0 栩?蝾 桎弪 筲咫梓屙桢 ?玎忤耔祛耱?铗 溴镟
extern double Percent_Risk = 100; // 镳铞屙?镳?筲咫梓屙梃 溴镱玷蜞, 筲咫梓桠噱蝰 腩?痂耜?
double Lot = 0.01; // 腩?
extern int lotdecimal = 2; // 0-腩螓 1 栩? 1-腩螓 0.1-0.9, 2-腩螓 0.01-0.09
extern double TakeProfit = 10.0;
double Stoploss = 500.0;
double TrailStart = 10.0;
double TrailStop = 10.0;
extern double PipStep = 12.0; // ?觐脲?
extern int MaxTrades = 10; // 觐腓麇耱忸 觐脲?
extern int PerHMA = 14;
bool UseEquityStop = FALSE; // 桉镱朦珙忄螯 钽疣龛麇龛?痂耜?铗 溴镱玷蜞
double TotalEquityRisk = 20.0; // 耜铍?镳铞屙蝾?铗 溴镱玷蜞 潆 痂耜?
bool UseTrailingStop = FALSE; // 桉镱朦珙忄龛?蝠彘腓磴 耱铒?
bool UseTimeOut = FALSE; // 钽疣龛麇龛?潆 铕溴痤??瘥黻?
double MaxTradeOpenHours = 48.0; // 怵屐 ?鬣襦?镱耠?麇泐 铕溴疣 觐蝾瘥?猁腓 ?瘥黻?镱 怵屐屙?囗箅桊簋蝰
extern int g_magic_176 = 123; // 爨汨麇耜铄 麒耠?镳?桤戾礤龛?祛骓?忮螯 磬 疣珥 镟瘥
extern string a = “疣犷蜞 耦忮蝽桕???蝽桷?漕”;
extern bool CloseFriday=true; // 桉镱朦珙忄螯 钽疣龛麇龛?镱 怵屐屙???蝽桷?true, 礤 桉镱朦珙忄螯 false
extern int CloseFridayHour=19; // 怵屐 ??蝽桷?镱耠?觐蝾痤泐 礤 恹耱噔?弪? 镥疴 铕溴?
double g_price_180;
double gd_188;
double gd_unused_196;
double gd_unused_204;
double g_price_212;
double g_bid_220;
double g_ask_228;
double gd_236;
double gd_244;
double gd_260;
bool gi_268;
string gs_ilan_272 = “fx.09@mail.ru”;
int gi_280 = 0;
int gi_284;
int gi_288 = 0;
double gd_292;
int g_pos_300 = 0;
int gi_304;
double gd_308 = 0.0;
bool gi_316 = FALSE;
bool gi_320 = FALSE;
bool gi_324 = FALSE;
int gi_328;
bool gi_332 = FALSE;
double gd_336;
double gd_344;
int init() {
gd_260 = MarketInfo(Symbol(), MODE_SPREAD) * Point;
return (0);
}
int deinit() {
return (0);
}
bool TradeTime(){
static int OrdHisCount;int time;double profit;
if(OrdHisCount==OrdersHistoryTotal())return(false);
for(int i=OrdersHistoryTotal()+1;i>=0;i–){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if(OrderSymbol()==Symbol()){
if(OrderCloseTime()>time){
time=OrderCloseTime();
profit=OrderProfit();
}
}
}
}
if(profit>0){if(TimeCurrent()-time>=PauseMin*60){OrdHisCount=OrdersHistoryTotal();return(true);}else{return(false);}}
return(false);
}
int indHMA1open_val;
int start() {
if(!TradeTime()){if (gi_280 == Time[0]) return (0);}
gi_280 = Time[0];
double indHMA1open_Yellow = iCustom(Symbol(), 60, “VininI_HMA”, PerHMA, 3, 0, 0, 0, 1);
double indHMA1open_Green = iCustom(Symbol(), 60, “VininI_HMA”, PerHMA, 3, 0, 0, 1, 1);
double indHMA1open_Red = iCustom(Symbol(), 60, “VininI_HMA”, PerHMA, 3, 0, 0, 2, 1);
if (indHMA1open_Green != EMPTY_VALUE) indHMA1open_val = 1;
else if (indHMA1open_Red != EMPTY_VALUE) indHMA1open_val = -1;
else if (indHMA1open_Yellow != EMPTY_VALUE) indHMA1open_val = 0;
double l_iclose_8;
double l_iclose_14;
if (UseTrailingStop) TrailingAlls(TrailStart, TrailStop, g_price_212);
if (UseTimeOut) {
if (TimeCurrent() >= gi_284) {
CloseThisSymbolAll();
Print(“Closed All due to TimeOut”);
}
}
// if(!TradeTime()){if (gi_280 == Time[0]) return (0);}
// gi_280 = Time[0];
double ld_0 = CalculateProfit();
if (UseEquityStop) {
if (ld_0 < 0.0 && MathAbs(ld_0) > TotalEquityRisk / 100.0 * AccountEquityHigh()) {
CloseThisSymbolAll();
Print(“Closed All due to Stop Out”);
gi_332 = FALSE;
}
}
gi_304 = CountTrades();
if (gi_304 == 0) gi_268 = FALSE;
for (g_pos_300 = OrdersTotal() – 1; g_pos_300 >= 0; g_pos_300–) {
OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176) {
if (OrderType() == OP_BUY) {
gi_320 = TRUE;
gi_324 = FALSE;
break;
}
}
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176) {
if (OrderType() == OP_SELL) {
gi_320 = FALSE;
gi_324 = TRUE;
break;
}
}
}
if (gi_304 > 0 && gi_304 <= MaxTrades) {
RefreshRates();
gd_236 = FindLastBuyPrice();
gd_244 = FindLastSellPrice();
if (gi_320 && gd_236 – Ask >= PipStep * Point && indHMA1open_val>0) gi_316 = TRUE;
if (gi_324 && Bid – gd_244 >= PipStep * Point && indHMA1open_val<0) gi_316 = TRUE;
}
if (gi_304 < 1) {
gi_324 = FALSE;
gi_320 = FALSE;
gi_316 = TRUE;
gd_188 = AccountEquity();
}
if (gi_316) {
gd_236 = FindLastBuyPrice();
gd_244 = FindLastSellPrice();
if (gi_324) {
gi_288 = gi_304;
gd_292 = NormalizeDouble(GetLots() * MathPow(LotExponent, gi_288), lotdecimal);
RefreshRates();
gi_328 = OpenPendingOrder(1, gd_292, Bid, slip, Ask, 0, 0, gs_ilan_272 + “-” + gi_288, g_magic_176, 0, HotPink);
if (gi_328 < 0) {
Print(“Error: “, GetLastError());
return (0);
}
gd_244 = FindLastSellPrice();
gi_316 = FALSE;
gi_332 = TRUE;
} else {
if (gi_320) {
gi_288 = gi_304;
gd_292 = NormalizeDouble(GetLots() * MathPow(LotExponent, gi_288), lotdecimal);
gi_328 = OpenPendingOrder(0, gd_292, Ask, slip, Bid, 0, 0, gs_ilan_272 + “-” + gi_288, g_magic_176, 0, Lime);
if (gi_328 < 0) {
Print(“Error: “, GetLastError());
return (0);
}
gd_236 = FindLastBuyPrice();
gi_316 = FALSE;
gi_332 = TRUE;
}
}
}
if (gi_316 && gi_304 < 1) {
l_iclose_8 = iClose(Symbol(), 0, 2);
l_iclose_14 = iClose(Symbol(), 0, 1);
g_bid_220 = Bid;
g_ask_228 = Ask;
if (!gi_324 && !gi_320) {
gi_288 = gi_304;
gd_292 = NormalizeDouble(GetLots() * MathPow(LotExponent, gi_288), lotdecimal);
if(CloseFriday==true&&DayOfWeek()==5&&TimeCurrent()>=StrToTime(CloseFridayHour+”:00″))return(0);
if (l_iclose_8 > l_iclose_14 && indHMA1open_val < 0)
{
if (iHigh(Symbol(), PERIOD_H1, 1)>Bid)
{
gi_328 = OpenPendingOrder(1, gd_292, g_bid_220, slip, g_bid_220, 0, 0, gs_ilan_272 + “-” + gi_288, g_magic_176, 0, HotPink);
if (gi_328 < 0) {
Print(“Error: “, GetLastError());
return (0);
}
gd_236 = FindLastBuyPrice();
gi_332 = TRUE;
}
}
if (iLow(Symbol(), PERIOD_H1, 1)<Ask)
{
if (l_iclose_8 < l_iclose_14 && indHMA1open_val > 0)
{
gi_328 = OpenPendingOrder(0, gd_292, g_ask_228, slip, g_ask_228, 0, 0, gs_ilan_272 + “-” + gi_288, g_magic_176, 0, Lime);
if (gi_328 < 0) {
Print(“Error: “, GetLastError());
return (0);
}
gd_244 = FindLastSellPrice();
gi_332 = TRUE;
}
}
if (gi_328 > 0) gi_284 = TimeCurrent() + 60.0 * (60.0 * MaxTradeOpenHours);
gi_316 = FALSE;
}
}
gi_304 = CountTrades();
g_price_212 = 0;
double ld_24 = 0;
for (g_pos_300 = OrdersTotal() – 1; g_pos_300 >= 0; g_pos_300–) {
OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176) {
if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
g_price_212 += OrderOpenPrice() * OrderLots();
ld_24 += OrderLots();
}
}
}
if (gi_304 > 0) g_price_212 = NormalizeDouble(g_price_212 / ld_24, Digits);
if (gi_332) {
for (g_pos_300 = OrdersTotal() – 1; g_pos_300 >= 0; g_pos_300–) {
OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176) {
if (OrderType() == OP_BUY) {
g_price_180 = g_price_212 + TakeProfit * Point;
gd_unused_196 = g_price_180;
gd_308 = g_price_212 – Stoploss * Point;
gi_268 = TRUE;
}
}
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176) {
if (OrderType() == OP_SELL) {
g_price_180 = g_price_212 – TakeProfit * Point;
gd_unused_204 = g_price_180;
gd_308 = g_price_212 + Stoploss * Point;
gi_268 = TRUE;
}
}
}
}
if (gi_332) {
if (gi_268 == TRUE) {
for (g_pos_300 = OrdersTotal() – 1; g_pos_300 >= 0; g_pos_300–) {
OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176) OrderModify(OrderTicket(), NormalizeDouble(g_price_212,Digits), NormalizeDouble(OrderStopLoss(),Digits), NormalizeDouble(g_price_180,Digits), 0, Yellow);
gi_332 = FALSE;
}
}
}
return (0);
}
int CountTrades() {
int l_count_0 = 0;
for (int l_pos_4 = OrdersTotal() – 1; l_pos_4 >= 0; l_pos_4–) {
OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176)
if (OrderType() == OP_SELL || OrderType() == OP_BUY) l_count_0++;
}
return (l_count_0);
}
void CloseThisSymbolAll() {
for (int l_pos_0 = OrdersTotal() – 1; l_pos_0 >= 0; l_pos_0–) {
OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol()) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176) {
if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, slip, Blue);
if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, slip, Red);
}
Sleep(1000);
}
}
}
int OpenPendingOrder(int ai_0, double a_lots_4, double a_price_12, int a_slippage_20, double ad_24, int ai_32, int ai_36, string a_comment_40, int a_magic_48, int a_datetime_52, color a_color_56) {
int l_ticket_60 = 0;
int l_error_64 = 0;
int l_count_68 = 0;
int li_72 = 100;
switch (ai_0) {
case 2:
for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
l_ticket_60 = OrderSend(Symbol(), OP_BUYLIMIT, a_lots_4, a_price_12, a_slippage_20, StopLong(ad_24, ai_32), TakeLong(a_price_12, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
l_error_64 = GetLastError();
if (l_error_64 == 0/* NO_ERROR */) break;
if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
Sleep(1000);
}
break;
case 4:
for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
l_ticket_60 = OrderSend(Symbol(), OP_BUYSTOP, a_lots_4, a_price_12, a_slippage_20, StopLong(ad_24, ai_32), TakeLong(a_price_12, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
l_error_64 = GetLastError();
if (l_error_64 == 0/* NO_ERROR */) break;
if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
Sleep(5000);
}
break;
case 0:
for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
RefreshRates();
l_ticket_60 = OrderSend(Symbol(), OP_BUY, a_lots_4, NormalizeDouble(Ask,Digits), a_slippage_20, NormalizeDouble(StopLong(Bid, ai_32),Digits), NormalizeDouble(TakeLong(Ask, ai_36),Digits), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
l_error_64 = GetLastError();
if (l_error_64 == 0/* NO_ERROR */) break;
if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
Sleep(5000);
}
break;
case 3:
for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
l_ticket_60 = OrderSend(Symbol(), OP_SELLLIMIT, a_lots_4, a_price_12, a_slippage_20, StopShort(ad_24, ai_32), TakeShort(a_price_12, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
l_error_64 = GetLastError();
if (l_error_64 == 0/* NO_ERROR */) break;
if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
Sleep(5000);
}
break;
case 5:
for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
l_ticket_60 = OrderSend(Symbol(), OP_SELLSTOP, a_lots_4, a_price_12, a_slippage_20, StopShort(ad_24, ai_32), TakeShort(a_price_12, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
l_error_64 = GetLastError();
if (l_error_64 == 0/* NO_ERROR */) break;
if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
Sleep(5000);
}
break;
case 1:
for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
l_ticket_60 = OrderSend(Symbol(), OP_SELL, a_lots_4, NormalizeDouble(Bid,Digits), a_slippage_20, NormalizeDouble(StopShort(Ask, ai_32),Digits), NormalizeDouble(TakeShort(Bid, ai_36),Digits), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
l_error_64 = GetLastError();
if (l_error_64 == 0/* NO_ERROR */) break;
if (!(l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */)) break;
Sleep(5000);
}
}
return (l_ticket_60);
}
double StopLong(double ad_0, int ai_8) {
if (ai_8 == 0) return (0);
else return (ad_0 – ai_8 * Point);
}
double StopShort(double ad_0, int ai_8) {
if (ai_8 == 0) return (0);
else return (ad_0 + ai_8 * Point);
}
double TakeLong(double ad_0, int ai_8) {
if (ai_8 == 0) return (0);
else return (ad_0 + ai_8 * Point);
}
double TakeShort(double ad_0, int ai_8) {
if (ai_8 == 0) return (0);
else return (ad_0 – ai_8 * Point);
}
double CalculateProfit() {
double ld_ret_0 = 0;
for (g_pos_300 = OrdersTotal() – 1; g_pos_300 >= 0; g_pos_300–) {
OrderSelect(g_pos_300, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176)
if (OrderType() == OP_BUY || OrderType() == OP_SELL) ld_ret_0 += OrderProfit();
}
return (ld_ret_0);
}
void TrailingAlls(int ai_0, int ai_4, double a_price_8) {
int l_ticket_16;
double l_ord_stoploss_20;
double l_price_28;
if (ai_4 != 0) {
for (int l_pos_36 = OrdersTotal() – 1; l_pos_36 >= 0; l_pos_36–) {
if (OrderSelect(l_pos_36, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() || OrderMagicNumber() == g_magic_176) {
if (OrderType() == OP_BUY) {
l_ticket_16 = NormalizeDouble((Bid – a_price_8) / Point, 0);
if (l_ticket_16 < ai_0) continue;
l_ord_stoploss_20 = OrderStopLoss();
l_price_28 = Bid – ai_4 * Point;
if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 > l_ord_stoploss_20)) OrderModify(OrderTicket(), NormalizeDouble(a_price_8,Digits), NormalizeDouble(l_price_28,Digits), NormalizeDouble(OrderTakeProfit(),Digits), 0, Aqua);
}
if (OrderType() == OP_SELL) {
l_ticket_16 = NormalizeDouble((a_price_8 – Ask) / Point, 0);
if (l_ticket_16 < ai_0) continue;
l_ord_stoploss_20 = OrderStopLoss();
l_price_28 = Ask + ai_4 * Point;
if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 < l_ord_stoploss_20)) OrderModify(OrderTicket(), NormalizeDouble(a_price_8,Digits), NormalizeDouble(l_price_28,Digits), NormalizeDouble(OrderTakeProfit(),Digits), 0, Red);
}
}
Sleep(1000);
}
}
}
}
double AccountEquityHigh() {
if (CountTrades() == 0) gd_336 = AccountEquity();
if (gd_336 < gd_344) gd_336 = gd_344;
else gd_336 = AccountEquity();
gd_344 = AccountEquity();
return (gd_336);
}
double FindLastBuyPrice() {
double l_ord_open_price_8;
int l_ticket_24;
double ld_unused_0 = 0;
int l_ticket_20 = 0;
for (int l_pos_16 = OrdersTotal() – 1; l_pos_16 >= 0; l_pos_16–) {
OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176 && OrderType() == OP_BUY) {
l_ticket_24 = OrderTicket();
if (l_ticket_24 > l_ticket_20) {
l_ord_open_price_8 = OrderOpenPrice();
ld_unused_0 = l_ord_open_price_8;
l_ticket_20 = l_ticket_24;
}
}
}
return (l_ord_open_price_8);
}
double FindLastSellPrice() {
double l_ord_open_price_8;
int l_ticket_24;
double ld_unused_0 = 0;
int l_ticket_20 = 0;
for (int l_pos_16 = OrdersTotal() – 1; l_pos_16 >= 0; l_pos_16–) {
OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != g_magic_176) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_176 && OrderType() == OP_SELL) {
l_ticket_24 = OrderTicket();
if (l_ticket_24 > l_ticket_20) {
l_ord_open_price_8 = OrderOpenPrice();
ld_unused_0 = l_ord_open_price_8;
l_ticket_20 = l_ticket_24;
}
}
}
return (l_ord_open_price_8);
}
double GetLots()
{
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
if(risk!=0)
{
double lot = NormalizeDouble(AccountBalance() * risk/Percent_Risk / 1000.0, 2);
if(lot < minlot) lot = minlot;
}
else lot=Lot;
return(lot);
}