← К каталогу
Исходный код · ID 2632

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 и перейдите к оплате.

Стоимость полного кода
1 516,50₽ ≈ $18.53