![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
О! Нашел где они код прятали!
Вот код полностью:
//-------------------------------------------------------------
// Etasoft Inc. Forex EA and Script Generator version 4.1 EA
//-------------------------------------------------------------
// exported variables
extern double MaxSpread19 = 16;
extern int HoursFrom18 = 1;
extern int HoursTo18 = 22;
extern int BuyStoploss20 = 20;
extern int BuyTakeprofit20 = 20;
extern double BalanceRiskPercent20 = 2;
// local variables
double PipValue=1; // this variable is here to support 5-digit brokers
bool Terminated = false;
string LF = "\n"; // use this in custom or utility blocks where you need line feeds
int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks
int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names
int current = 0;
int init()
{
NDigits = Digits;
if (false) ObjectsDeleteAll(); // clear the chart
Comment(""); // clear the chart
}
// Expert start
int start()
{
if (Bars < 10)
{
Comment("Not enough bars");
return (0);
}
if (Terminated == true)
{
Comment("EA Terminated.");
return (0);
}
OnEveryTick13();
}
void OnEveryTick13()
{
if (true == false && false) PipValue = 10;
if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;
WeekdayFilter12();
}
void WeekdayFilter12()
{
if ((true && DayOfWeek() == 1) || (true && DayOfWeek() == 2) || (true && DayOfWeek() == 3) ||
(true && DayOfWeek() == 4) || (true && DayOfWeek() == 5) || (false && DayOfWeek() == 6) || (false && DayOfWeek() == 0))
{
SpreadFilter19();
}
}
void SpreadFilter19()
{
if (MarketInfo(Symbol(), MODE_SPREAD)/PipValue < MaxSpread19)
{
HoursFilter18();
}
}
void HoursFilter18()
{
int datetime800 = TimeLocal();
int hour0 = TimeHour(datetime800);
if ((HoursFrom18 < HoursTo18 && hour0 >= HoursFrom18 && hour0 < HoursTo18) ||
(HoursFrom18 > HoursTo18 && (hour0 < HoursTo18 || hour0 >= HoursFrom18)))
{
TechnicalAnalysis15();
}
}
void TechnicalAnalysis15()
{
if (iMA(NULL, NULL,300,0,MODE_EMA,PRICE_CLOSE,0) < Close[current+10])
{
TechnicalAnalysis16();
}
}
void TechnicalAnalysis16()
{
if (iMA(NULL, NULL,300,0,MODE_EMA,PRICE_CLOSE,0) > iMA(NULL, NULL,300,0,MODE_EMA,PRICE_CLOSE,1))
{
TechnicalAnalysis14();
}
}
void TechnicalAnalysis14()
{
if (iMA(NULL, NULL,30,0,MODE_EMA,PRICE_CLOSE,0) > iMA(NULL, NULL,30,0,MODE_EMA,PRICE_CLOSE,2))
{
TechnicalAnalysis17();
}
}
void TechnicalAnalysis17()
{
if (iStochastic(NULL, NULL,8,3,3,MODE_EMA,0,MODE_SIGNAL,0) > iStochastic(NULL, NULL,8,3,3,MODE_EMA,0,MODE_SIGNAL,2))
{
TechnicalAnalysis23();
}
}
void TechnicalAnalysis23()
{
if (iStochastic(NULL, NULL,8,3,3,MODE_EMA,0,MODE_SIGNAL,0) > 20)
{
TechnicalAnalysis22();
}
}
void TechnicalAnalysis22()
{
if (iStochastic(NULL, NULL,8,3,3,MODE_EMA,0,MODE_SIGNAL,0) < 50)
{
IfOrderDoesNotExist21();
}
}
void IfOrderDoesNotExist21()
{
bool exists = false;
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
{
exists = true;
}
}
else
{
Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
}
if (exists == false)
{
BuyOrderRiskFixed20();
}
}
void BuyOrderRiskFixed20()
{
double lotsize = MarketInfo(Symbol(),MODE_LOTSIZE) / AccountLeverage();
double pipsize = 1 * 10;
double maxlots = AccountFreeMargin() / 100 * BalanceRiskPercent20 / lotsize * pipsize;
if (BuyStoploss20 == 0) Print("OrderSend() error - stoploss can not be zero");
double lots = maxlots / BuyStoploss20 * 10;
// calculate lot size based on current risk
double lotvalue = 0.001;
double minilot = MarketInfo(Symbol(), MODE_MINLOT);
int powerscount = 0;
while (minilot < 1)
{
minilot = minilot * MathPow(10, powerscount);
powerscount++;
}
lotvalue = NormalizeDouble(lots, powerscount - 1);
if (lotvalue < MarketInfo(Symbol(), MODE_MINLOT)) // make sure lot is not smaller than allowed value
{
lotvalue = MarketInfo(Symbol(), MODE_MINLOT);
}
if (lotvalue > MarketInfo(Symbol(), MODE_MAXLOT)) // make sure lot is not greater than allowed value
{
lotvalue = MarketInfo(Symbol(), MODE_MAXLOT);
}
double SL = Ask - BuyStoploss20*PipValue*Point;
if (BuyStoploss20 == 0) SL = 0;
double TP = Ask + BuyTakeprofit20*PipValue*Point;
if (BuyTakeprofit20 == 0) TP = 0;
int ticket = -1;
if (true)
ticket = OrderSend(Symbol(), OP_BUY, lotvalue, Ask, 3, 0, 0, "My Expert", 1, 0, Green);
else
ticket = OrderSend(Symbol(), OP_BUY, lotvalue, Ask, 3, SL, TP, "My Expert", 1, 0, Green);
if (ticket > -1)
{
if (true)
{
OrderSelect(ticket, SELECT_BY_TICKET);
bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Green);
if (ret == false)
Print("OrderModify() error - ", ErrorDescription(GetLastError()));
}
}
else
{
Print("OrderSend() error - ", ErrorDescription(GetLastError()));
}
}
int deinit()
{
if (false) ObjectsDeleteAll();
}
//////////////////////
Напишите, пожалуйста куда и какой конеретно надо вставить для закрытия ордера после подскока спреда.
Две рекомендации:
- не работать с ДЦ у которых гуляют условия: спред, стоплевелы, кредитные плечи;
- использовать только отложенные ордера.
На плавающем спреде можно получить условия намного лучше чем на фиксированном. В реальном рынке нет фиксированного спреда. Если спред фиксированный то вы торгуете с кухней со всеми вытекающими последствиями в виде невыплаты прибыли, ухудьшением исполнения и пр.
Я не пользуюсь отложенными ордерами, т.к. их стратегия не предусматривает жестких входов и выходов. Все по текущей ситуации. Какой смысл в отложенных ордерах, если рыночные ордера отрабатываются с большими задержками? Надо бежать от такого брокера и искать нормально где исполнение приказа занимает до 0,5 секунды.