slingshots_ea_3.02.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «slingshots_ea_3.02.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Slingshots EA — торговый советник для MetaTrader 4, который открывает позиции в заданном временном окне на основе сравнения цен закрытия начала и конца периода. Если цена закрытия конца ниже начала, советник открывает покупки; если выше — продажи. Для каждого направления выставляются три уровня Take Profit, рассчитанные по соотношению риск/прибыль, а также Stop Loss.
Советник поддерживает несколько режимов управления денежными средствами: фиксированный лот, расчёт по риску или по марже. Перед открытием ордера проверяется текущий спред — при превышении допустимого значения сделка не выполняется. Входные параметры включают время начала и окончания торгового окна, размер лота, уровни стоп-лосса и тейк-профитов, проскальзывание и магический номер.
На графике советник отрисовывает вертикальные линии начала и окончания окна, трендовые линии уровней Stop Loss и Take Profit, а также текстовые метки с ценами. В интерфейсе отображается текущий баланс, эквити и цены закрытия начала и конца периода.
Настройки программы
| Настройка | Описание |
|---|---|
| Select MM Type (InpMMType) | Тип управления денежными средствами — Тип управления денежными средствами: без управления, фиксированный лот, по риску или по марже |
| Start Time (InpStartTime) | Время начала — Время начала торгового окна |
| End Time (InpEndTime) | Время окончания — Время окончания торгового окна |
| Lot % for Risk or Margin (InpLotPercent) | Процент лота — Процент лота для расчёта по риску или марже |
| Fixed Lot (InpLots) | Фиксированный лот — Фиксированный размер лота |
| RR First TP (InpRRRatio1) | Соотношение риск/прибыль 1 — Соотношение риск/прибыль для первого Take Profit |
| RR Second TP (InpRRRatio2) | Соотношение риск/прибыль 2 — Соотношение риск/прибыль для второго Take Profit |
| RR Third TP (InpRRRatio3) | Соотношение риск/прибыль 3 — Соотношение риск/прибыль для третьего Take Profit |
| Stop Loss in Pips (InpStopLoss) | Стоп-лосс — Stop Loss в пунктах |
| Distance pips to pending level (InpDistancePips) | Расстояние до отложенного уровня — Расстояние в пунктах до уровня отложенного ордера |
| Slippage (InpSlippage) | Проскальзывание — Допустимое проскальзывание в пунктах |
| Max Spread we allowed (InpMaxSpread) | Максимальный спред — Максимально допустимый спред в пунктах |
| magic number (InpMagic) | Магический номер — Магический номер для идентификации ордеров советника |
Поиск по коду файла
#property version "1.00"
#property strict
#define _Balance AccountInfoDouble(ACCOUNT_BALANCE)
#define _Equity AccountInfoDouble(ACCOUNT_EQUITY)
#define _MarginRequired (double)MarketInfo(_Symbol, MODE_MARGINREQUIRED)
#define _LotStep SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP)
#define _LotMin SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)
#define _LotMax SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX)
#define _TickValue SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE)
#define _TickSize SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE)
#define _Pip (double)((_Digits==3 || _Digits==5) ? _Point*10 : _Point)
#define _DigitsPip (int)log10(1/_Pip)
#define _Digitslot (int)log10(1/_LotStep)
#define _PointValue (double)_Point/_TickSize*_TickValue
#define _PipValue (double)((_TickValue*_Pip)/_TickSize)
#define _Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define _Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define _BrokerSpread (double)(_Ask-_Bid)
#define EA_NAME "Exp_Slingshot"
#define EA_VERSION "Rev_1.00 [2022.03.04]"
string EA_COMMENT="";
enum ENUM_MONEY_MANAGEMENT {None, FixedLot, ByRisk, ByMargin};
input ENUM_MONEY_MANAGEMENT InpMMType = None; // Select MM Type
input string InpStartTime = "04:15"; // Start Time
input string InpEndTime = "08:30"; // End Time
input double InpLotPercent = 1.5; // Lot % for Risk or Margin
input double InpLots = 0.1; // Fixed Lot
input double InpRRRatio1 = 1; // RR First TP
input double InpRRRatio2 = 2; // RR Second TP
input double InpRRRatio3 = 3; // RR Third TP
input double InpStopLoss = 30.0; // Stop Loss in Pips
input double InpDistancePips = 20; // Distance pips to pending level
input int InpSlippage = 10; // Slippage
input double InpMaxSpread = 6.0; // Max Spread we allowed
input int InpMagic = 234; // magic number
double ExtDistancePips=0.0;
double ExtTakeProfit=0.0;
double ExtStopLoss=0.0;
int count_buy, count_sell, count_buystop, count_sellstop, count_all_orders ;
double buy_op, sell_op, buystop_op, sellstop_op;
double buy_sl, sell_sl, buystop_sl, sellstop_sl;
double buy_tp, sell_tp, buystop_tp, sellstop_tp;
double buy_lot, sell_lot, buystop_lot, sellstop_lot;
double buy_profit, sell_profit;
int buy_ticket=-1, buystop_ticket=-1;
int sell_ticket=-1, sellstop_ticket=-1;
double NextLot=0, InitialLot=0;
bool opThisBar = false;
double LongPrice=0, LongStop=0, LongTake1=0, LongTake2=0, LongTake3=0;
double ShortPrice=0, ShortStop=0, ShortTake1=0, ShortTake2=0, ShortTake3=0;
datetime signal_time=0;
int bar_index=0;
double openCandle=0;
string ObjPrefix = _Symbol+"_";
string VLineStart = ObjPrefix+"StartTime";
string VLineEnd = ObjPrefix+"EndTime";
string TLineEntry = ObjPrefix+"Entry";
double closeStart=0, closeEnd=0, closeNow=0;
datetime ExtStartTime=0, ExtEndTime=0, ExtStartTrade=0;
bool opAllowed=false;
datetime t0=0;
datetime tRight=0;;
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
// код доступен только после оплаты
}
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
}
void ManageOrder()
{
if(InpMaxSpread < _BrokerSpread/_Pip) {
Print("Spread is too wide");
return;
}
if(Time[1]!=ExtEndTime)return;
EA_COMMENT = EA_NAME+"_"+_Symbol+"_"+(string)InpMagic;
LongStop = NormalizePrice(closeEnd-ExtStopLoss);
LongTake1 = NormalizePrice(closeEnd+(ExtStopLoss*InpRRRatio1));
LongTake2 = NormalizePrice(closeEnd+(ExtStopLoss*InpRRRatio2));
LongTake3 = NormalizePrice(closeEnd+(ExtStopLoss*InpRRRatio3));
ShortStop = NormalizePrice(closeEnd+ExtStopLoss+_BrokerSpread);
ShortTake1 = NormalizePrice(closeEnd-(ExtStopLoss*InpRRRatio1));
ShortTake2 = NormalizePrice(closeEnd-(ExtStopLoss*InpRRRatio2));
ShortTake3 = NormalizePrice(closeEnd-(ExtStopLoss*InpRRRatio3));
if(count_buy==0 && closeEnd<closeStart) {
if (OpenOrder(OrderSend(_Symbol, OP_BUY, RecalculateLot(_Ask, LongStop), _Ask, InpSlippage, LongStop, LongTake1, EA_COMMENT, InpMagic, 0, clrNONE))) {
if (OpenOrder(OrderSend(_Symbol, OP_BUY, RecalculateLot(_Ask, LongStop), _Ask, InpSlippage, LongStop, LongTake2, EA_COMMENT, InpMagic, 0, clrNONE))) {
if (OpenOrder(OrderSend(_Symbol, OP_BUY, RecalculateLot(_Ask, LongStop), _Ask, InpSlippage, LongStop, LongTake3, EA_COMMENT, InpMagic, 0, clrNONE))) {
opThisBar=true;
return;
}
}
}
}
if(count_sell==0 && closeEnd>closeStart) {
if (OpenOrder(OrderSend(_Symbol, OP_SELL, RecalculateLot(_Bid, ShortStop), _Bid, InpSlippage, ShortStop, ShortTake1, EA_COMMENT, InpMagic, 0, clrNONE))) {
if (OpenOrder(OrderSend(_Symbol, OP_SELL, RecalculateLot(_Bid, ShortStop), _Bid, InpSlippage, ShortStop, ShortTake2, EA_COMMENT, InpMagic, 0, clrNONE))) {
if (OpenOrder(OrderSend(_Symbol, OP_SELL, RecalculateLot(_Bid, ShortStop), _Bid, InpSlippage, ShortStop, ShortTake3, EA_COMMENT, InpMagic, 0, clrNONE))) {
opThisBar=true;
return;
}
}
}
}
}
void OrdersInformation()
{
/*
count_all_orders=0;
count_buy=0; count_sell=0; count_buystop=0; count_sellstop=0;
buy_lot=0.0; sell_lot=0.0; buystop_lot=0.0; sellstop_lot=0.0;
buy_op=0.0; sell_op=0.0; buystop_op=0.0; sellstop_op=0.0;
buy_sl=0.0; sell_sl=0.0; buystop_sl=0.0; sellstop_sl=0.0;
buy_tp=0.0; sell_tp=0.0; buystop_tp=0.0; sellstop_tp=0.0;
buy_profit=0.0; sell_profit=0.0;
buy_ticket=-1; buystop_ticket=-1;
sell_ticket=-1; sellstop_ticket=-1;
*/
count_all_orders=0;
count_buy=0;
count_sell=0;
count_buystop=0;
count_sellstop=0;
buy_lot=0.0;
sell_lot=0.0;
buystop_lot=0.0;
sellstop_lot=0.0;
buy_op=0.0;
sell_op=0.0;
buystop_op=0.0;
sellstop_op=0.0;
buy_sl=0.0;
sell_sl=0.0;
buystop_sl=0.0;
sellstop_sl=0.0;
buy_tp=0.0;
sell_tp=0.0;
buystop_tp=0.0;
sellstop_tp=0.0;
buy_profit=0.0;
sell_profit=0.0;
buy_ticket=-1;
buystop_ticket=-1;
sell_ticket=-1;
sellstop_ticket=-1;
for (int c=0; c < OrdersTotal(); c++ ) {
if (OrderSelect(c, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() != Symbol())continue;
if (OrderMagicNumber() != InpMagic)continue;
switch (OrderType()) {
case OP_BUY :
count_buy++;
buy_ticket=OrderTicket();
buy_lot=OrderLots();
buy_sl = OrderStopLoss();
buy_op = OrderOpenPrice();
buy_tp = OrderTakeProfit();
buy_profit = OrderProfit();
break;
case OP_SELL :
count_sell++;
sell_ticket=OrderTicket();
sell_lot=OrderLots();
sell_op = OrderOpenPrice();
sell_sl = OrderStopLoss();
sell_tp = OrderTakeProfit();
sell_profit = OrderProfit();
break;
case OP_BUYSTOP :
count_buystop++;
buystop_ticket=OrderTicket();
buystop_lot=OrderLots();
buystop_tp = OrderTakeProfit();
buystop_sl = OrderStopLoss();
buystop_op = OrderOpenPrice();
break;
case OP_SELLSTOP:
count_sellstop++;
sellstop_ticket=OrderTicket();
sellstop_lot=OrderLots();
sellstop_op = OrderOpenPrice();
sellstop_sl = OrderStopLoss();
sellstop_tp = OrderTakeProfit();
break;
}
count_all_orders++;
}
}
}
double RecalculateLot(double p, double sl)
{
double volume = 0.0, price=0, stop=0, range=0,
riskFactor=0, riskForTrade=0,
risk=0, riskPerLot=0,
lotByRisk=0, lotByMargin=0;
riskFactor = InpLotPercent/100;
riskForTrade = riskFactor*_Balance;
range = MathAbs(p-sl);
riskPerLot = range * (1 / _Point) * _PointValue;
lotByRisk = riskForTrade / riskPerLot;
lotByMargin = riskForTrade/_MarginRequired;
volume = (InpMMType==ByRisk) ? MathFloor(lotByRisk/_LotStep)*_LotStep :
(InpMMType==ByMargin) ? MathFloor(lotByMargin/_LotStep)*_LotStep : InpLots ;
return NormalizeLot(volume);
}
bool OpenOrder(int tiket)
{
int c = 10;
while (!OrderSelect(tiket,SELECT_BY_TICKET)) {
if (tiket < 1) return(false);
Sleep(1000);
c--;
if (c == 0) return(false);
}
return(OrderTicket() == tiket);
}
bool IsNewBar(const ENUM_TIMEFRAMES tf = PERIOD_CURRENT)
{
datetime bar_time=0;
if (bar_time < iTime(Symbol(), tf, 0)) {
bar_time = iTime(Symbol(), tf, 0);
return (true);
}
return (false);
}
double NormalizePrice(double price)
{
return(MathRound(price/_TickSize) * _TickSize );
}
double NormalizeLot(double lots)
{
ResetLastError();
lots = MathMax(MathMin(_Показано первые 50% кода (символов: 15165)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.