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

ONT Sixth Study EA

six study ea.mq4
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

ONT Sixth Study EA — торговый советник для платформы MetaTrader 4, предназначенный для анализа ценовых данных на таймфреймах M15 и H1 и автоматического открытия сделок. Советник отслеживает изменения свечных максимумов и минимумов, цену открытия и значения скользящей средней SMMA для формирования сигналов на покупку или продажу.

Перед открытием позиции проверяется принадлежность текущего времени заданному интервалу суток, что позволяет ограничивать торговлю определёнными часами. Также учитывается текущий спред и количество уже открытых позиций.

Управление позициями включает установку стоп-лосса и тейк-профита в пунктах относительно цены открытия, ограничение максимального допустимого спреда, лимит на число одновременно открытых сделок и возможность включения или отключения хеджинга. Советник поддерживает повторные попытки отправки ордера при ошибках.

Настройки программы

НастройкаОписание
TP_Pts Тейк-профит (пункты) — Тейк-профит, задаваемый в пунктах относительно цены открытия позиции.
SL_Pts Стоп-лосс (пункты) — Стоп-лосс, задаваемый в пунктах относительно цены открытия позиции.
Candle_Index_P Индекс свечи M15 — Индекс свечи на таймфрейме M15, используемый для сравнения свечных максимумов и минимумов при формировании сигнала.
Plus_H1 Смещение H1 — Фиксированное смещение в пунктах, используемое при сравнении свечных значений на таймфрейме H1.
Candle_Index_H1_1 Индекс свечи H1 (открытие) — Индекс свечи на таймфрейме H1, используемый для сравнения с ценой открытия при формировании сигнала.
Candle_Index_H1_2 Индекс свечи H1 (проверка) — Индекс свечи на таймфрейме H1, используемый для сравнения с суммой цены открытия и фиксированного значения при формировании сигнала.
MA Период скользящей средней — Период скользящей средней SMMA, рассчитываемой на закрытии цен на таймфрейме M15.
Candle_Index_H1_3 Индекс свечи H1 (скользящая) — Индекс свечи на таймфрейме H1, используемый для сравнения со значением скользящей средней SMMA.
MagicNumber Магический номер — Магический номер для идентификации ордеров, отправленных данным советником.
time of the day (from hour) (TOD_From_Hour) Время: час начала — Час начала разрешённого временного интервала для открытия сделок (смотри также TOD_From_Min, TOD_To_Hour, TOD_To_Min).
time of the day (from min) (TOD_From_Min) Время: минута начала — Минута начала разрешённого временного интервала для открытия сделок.
time of the day (to hour) (TOD_To_Hour) Время: час окончания — Час окончания разрешённого временного интервала для открытия сделок.
time of the day (to min) (TOD_To_Min) Время: минута окончания — Минута окончания разрешённого временного интервала для открытия сделок.
TradeSize Размер сделки — Объём сделки (количество лотов) для открытия позиции.
MaxSpread Максимальный спред — Максимально допустимый спред в пунктах для открытия новой позиции.
MaxOpenTrades Максимум открытых сделок — Максимальное количество одновременно открытых сделок на один символ.
Hedging Хеджирование — Переключатель, определяющий возможность одновременного удержания позиций на покупку и продажу (хеджирование).
Получить полный код

Поиск по коду файла

#property version   "1.00"
#property description ""

#include <stdlib.mqh>
#include <stderror.mqh>

extern double TP_Pts = 77;
extern double SL_Pts = 49;
extern int Candle_Index_P = 2;
extern double Plus_H1 = 20;
extern int Candle_Index_H1_1 = 0;
extern int Candle_Index_H1_2 = 1;
extern int MA = 10;
extern int Candle_Index_H1_3 = 0;
int LotDigits; //initialized in OnInit
extern int MagicNumber = 1594137;
extern int TOD_From_Hour = 03; //time of the day (from hour)
extern int TOD_From_Min = 15; //time of the day (from min)
extern int TOD_To_Hour = 19; //time of the day (to hour)
extern int TOD_To_Min = 45; //time of the day (to min)
extern double TradeSize = 0.2;
extern double MaxSpread = 2;
int MaxSlippage = 3; //adjusted in OnInit
bool crossed[2]; //initialized to true, used in function Cross
extern int MaxOpenTrades = 1;
int MaxLongTrades = 1000;
int MaxShortTrades = 1000;
int MaxPendingOrders = 1000;
int MaxLongPendingOrders = 1000;
int MaxShortPendingOrders = 1000;
extern bool Hedging = true;
int OrderRetry = 5; //# of retries if sending order returns error
int OrderWait = 5; //# of seconds to wait if sending order returns error
double myPoint; //initialized in OnInit

bool inTimeInterval(datetime t, int From_Hour, int From_Min, int To_Hour, int To_Min)
  {
   string TOD = TimeToString(t, TIME_MINUTES);
   string TOD_From = StringFormat("%02d", From_Hour)+":"+StringFormat("%02d", From_Min);
   string TOD_To = StringFormat("%02d", To_Hour)+":"+StringFormat("%02d", To_Min);
   return((StringCompare(TOD, TOD_From) >= 0 && StringCompare(TOD, TOD_To) <= 0)
     || (StringCompare(TOD_From, TOD_To) > 0
       && ((StringCompare(TOD, TOD_From) >= 0 && StringCompare(TOD, "23:59") <= 0)
         || (StringCompare(TOD, "00:00") >= 0 && StringCompare(TOD, TOD_To) <= 0))));
  }

bool Cross(int i, bool condition) //returns true if "condition" is true and was false in the previous call
  {
   bool ret = condition && !crossed[i];
   crossed[i] = condition;
   return(ret);
  }

void myAlert(string type, string message)
  {
   if(type == "print")
      Print(message);
   else if(type == "error")
     {
      Print(type+" | ONT Sixth Study EA @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
     }
   else if(type == "order")
     {
     }
   else if(type == "modify")
     {
     }
  }

int TradesCount(int type) //returns # of open trades for order type, current symbol and magic number
  {
   int result = 0;
   int total = OrdersTotal();
   for(int i = 0; i < total; i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) continue;
      if(OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol() || OrderType() != type) continue;
      result++;
     }
   return(result);
  }

int myOrderSend(int type, double price, double volume, string ordername) //send order, return ticket ("price" is irrelevant for market orders)
  {
   if(!IsTradeAllowed()) return(-1);
   int ticket = -1;
   int retries = 0;
   int err = 0;
   int long_trades = TradesCount(OP_BUY);
   int short_trades = TradesCount(OP_SELL);
   int long_pending = TradesCount(OP_BUYLIMIT) + TradesCount(OP_BUYSTOP);
   int short_pending = TradesCount(OP_SELLLIMIT) + TradesCount(OP_SELLSTOP);
   string ordername_ = ordername;
   if(ordername != "")
      ordername_ = "("+ordername+")";

   if(!Hedging && ((type % 2 == 0 && short_trades + short_pending > 0) || (type % 2 == 1 && long_trades + long_pending > 0)))
     {
      myAlert("print", "Order"+ordername_+" not sent, hedging not allowed");
      return(-1);
     }

   if((type % 2 == 0 && long_trades >= MaxLongTrades)
   || (type % 2 == 1 && short_trades >= MaxShortTrades)
   || (long_trades + short_trades >= MaxOpenTrades)
   || (type > 1 && type % 2 == 0 && long_pending >= MaxLongPendingOrders)
   || (type > 1 && type % 2 == 1 && short_pending >= MaxShortPendingOrders)
   || (type > 1 && long_pending + short_pending >= MaxPendingOrders)
   )
     {
      myAlert("print", "Order"+ordername_+" not sent, maximum reached");
      return(-1);
     }

   while(IsTradeContextBusy()) Sleep(100);
   RefreshRates();
   if(type == OP_BUY)
      price = Ask;
   else if(type == OP_SELL)
      price = Bid;
   else if(price < 0) //invalid price for pending order
     {
      myAlert("order", "Order"+ordername_+" not sent, invalid price for pending order");
	  return(-1);
     }
   int clr = (type % 2 == 1) ? clrRed : clrBlue;
   if(MaxSpread > 0 && Ask - Bid > MaxSpread * myPoint)
     {
      myAlert("order", "Order"+ordername_+" not sent, maximum spread "+DoubleToStr(MaxSpread * myPoint, Digits())+" exceeded");
      return(-1);
     }
   while(ticket < 0 && retries < OrderRetry+1)
     {
      ticket = OrderSend(Symbol(), type, NormalizeDouble(volume, LotDigits), NormalizeDouble(price, Digits()), MaxSlippage, 0, 0, ordername, MagicNumber, 0, clr);
      if(ticket < 0)
        {
         err = GetLastError();
         myAlert("print", "OrderSend"+ordername_+" error #"+IntegerToString(err)+" "+ErrorDescription(err));
         Sleep(OrderWait*1000);
        }
      retries++;
     }
   if(ticket < 0)
     {
      myAlert("error", "OrderSend"+ordername_+" failed "+IntegerToString(OrderRetry+1)+" times; error #"+IntegerToString(err)+" "+ErrorDescription(err));
      return(-1);
     }
   string typestr[6] = {"Buy", "Sell", "Buy Limit", "Sell Limit", "Buy Stop", "Sell Stop"};
   myAlert("order", "Order sent"+order

Показано первые 50% кода (символов: 8464)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
846,40₽ ≈ $10.34