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

pioner_v7.mq4

Похожие материалы по тегам

the gold reaper v4.1 mt5.mq4MQL4 / MetaTrader 4 · 1 общих теговquantum queen x 4.3 (1).mq5MQL5 / MetaTrader 5 · 1 общих теговlizard_1.85.mq4MQL4 / MetaTrader 4 · 1 общих теговoverlaychart.mq4MQL4 / MetaTrader 4 · 1 общих теговmarket crusher ea guidlines.txtMQL · 1 общих теговrobot_wti ea.mq4MQL4 / MetaTrader 4 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Pioner — это торговый советник для MetaTrader 4, написанный на языке MQL4. Программа реализует многоэтапную торговую логику с использованием конечного автомата, который переключается между несколькими состояниями в зависимости от текущей структуры открытых и отложенных ордеров на счёте.

Советник размещает ордера различных типов — рыночные Buy и Sell, а также отложенные BuyStop, SellStop, BuyLimit и SellLimit — с заданными уровнями стоп-лосса и тейк-профита. Лот может фиксироваться вручную или рассчитываться автоматически на основе остатка средств. Состояние торговой сессии сохраняется в глобальных переменных терминала, что позволяет восстанавливать позицию при перезапуске советника.

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

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

НастройкаОписание
Lots Размер лота — Числовой параметр, задающий начальный размер лота для открытия ордеров.
Grid Шаг сетки — Целочисленный параметр, задающий расстояние между уровнями сетки в пунктах для размещения ордеров и стоп-лоссов.
StopLoss Стоп-лосс — Целочисленный параметр, задающий расстояние до стоп-лосса в пунктах от цены открытия ордера.
FixedLot Фиксированный лот — Переключатель, определяющий, используется ли фиксированный размер лота или автоматический расчёт на основе остатка средств.
Slippage Допустимое проскальзывание — Целочисленный параметр, допустимое проскальзывание цены в пунктах при выполнении ордеров.
Magic Магическое число — Целочисленный идентификатор магического числа, используемый для фильтрации ордеров, управляемых данным советником.
StopOnRoll Стоп при нарастании — Переключатель, при активации которого советник закрывает все позиции и переходит в начальное состояние при достижении определённых условий нарастания.
StopAll Остановить всё — Переключатель, при активации которого советник немедленно закрывает все управляемые ордера и сбрасывает состояние.
MySleep Пауза между операциями — Целочисленный параметр, задающий время ожидания в миллисекундах между последовательными торговыми операциями.
Получить полный код

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

#include <stdlib.mqh>
#include <WinUser32.mqh>

string vers = "6.0";

extern double Lots = 0.3;
extern int Grid = 9;
extern int StopLoss = 200;
extern bool FixedLot = true;
extern int Slippage = 3;
extern int Magic = 110705;
extern bool StopOnRoll = false;
extern bool StopAll = false;
extern int MySleep = 3000;

int BuyCnt = 0;
int SellCnt = 0;
int BuyLimitCnt = 0;
int SellLimitCnt = 0;
int BuyStopCnt = 0;
int SellStopCnt = 0;
int Step = 0;
double lotseq[5] = {1,1,3.5,8.3,20.7};

#define DIRECT      1
#define REVERSE     2

#define STATE_0     0
#define STEP_1      1
#define STEP_UP     2
#define STEP_DOWN   3
#define ROLL_UP     4
#define ROLL_DOWN   5

string gPrefix = "Pioner_";
int PrevState = STATE_0;

int init() {
      // код доступен только после оплаты
   }

int deinit() {
  return(0);
}

int start() {
      // код доступен только после оплаты
   }

int OnStep1() {
  Print("Func: Step1");
  Print("Step: ", Step);
  Print("PrevState: ", State2Str(PrevState));

  double spr = MarketInfo(Symbol(), MODE_SPREAD)*Point;

  int ticket = Buy(LotsRisk(Lots), Ask, Ask-StopLoss*Point, Bid+Grid*Point, "*");
  OrderSelect(ticket, SELECT_BY_TICKET);
  double AskB = OrderOpenPrice();
  double BidB = AskB - spr;

  ticket = Sell(LotsRisk(Lots), Bid, Bid+StopLoss*Point, Ask-Grid*Point, "*");
  OrderSelect(ticket, SELECT_BY_TICKET);
  double BidS = OrderOpenPrice();
  double AskS = BidS + spr;

  SetBuyStop(LotsRisk(Lots), AskB+Grid*Point, AskB+Grid*Point-StopLoss*Point, BidB+2*Grid*Point, "");
  SetSellLimit(LotsRisk(Lots), BidB+Grid*Point, BidB+Grid*Point+StopLoss*Point, AskB, "");
  SetSellStop(LotsRisk(Lots), BidS-Grid*Point, BidS-Grid*Point+StopLoss*Point, AskS-2*Grid*Point, "");
  SetBuyLimit(LotsRisk(Lots), AskS-Grid*Point, AskS-Grid*Point-StopLoss*Point, BidS, "");

  PrevState = STEP_1;
  SetGlobals();
  return(0);
}

int OnStepUp() {
  Print("Func: StepUp");
  Print("Step: ", Step);
  Print("PrevState: ", State2Str(PrevState));

  int ticket = GetOrder(OP_SELL, 1, REVERSE, MODE_TRADES);
  double Bid0 = OrderOpenPrice(); 
  double Ask0 = Bid0 + MarketInfo(Symbol(), MODE_SPREAD)*Point;
  double TP = OrderTakeProfit();

  SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
  SetSellLimit(lotseq[Step]*LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");

  SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
  SetBuyLimit(LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");

  int cnt = OrdersTotal();
  for (int i=0; i < cnt; i++) {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != Magic) continue;
    if (OrderType() != OP_SELL) continue;
    if (OrderTicket() == ticket) continue;

    ModifyOrder(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), TP);
  }

  ticket = GetOrder(OP_SELLSTOP, 1, DIRECT, MODE_TRADES);
  if (ticket != -1) DeleteOrder(ticket);

  ticket = GetOrder(OP_BUYLIMIT, 1, DIRECT, MODE_TRADES);
  if (ticket != -1) DeleteOrder(ticket);

  PrevState = STEP_UP;
  SetGlobals();
  return(0);
}

int OnStepDown() {
  Print("Func: StepDown");
  Print("Step: ", Step);    
  Print("PrevState: ", State2Str(PrevState));

  int ticket = GetOrder(OP_BUY, 1, REVERSE, MODE_TRADES);
  double Ask0 = OrderOpenPrice(); 
  double Bid0 = Ask0 - MarketInfo(Symbol(), MODE_SPREAD)*Point;
  double TP = OrderTakeProfit();

  SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
  SetBuyLimit(lotseq[-Step]*LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");

  SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
  SetSellLimit(LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");

  int cnt = OrdersTotal();
  for (int i=0; i < cnt; i++) {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != Magic) continue;
    if (OrderType() != OP_BUY) continue;
    if (OrderTicket() == ticket) continue;

    ModifyOrder(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), TP);
  }

  ticket = GetOrder(OP_BUYSTOP, 1, DIRECT, MODE_TRADES);
  if (ticket != -1) DeleteOrder(ticket);

  ticket = GetOrder(OP_SELLLIMIT, 1, DIRECT, MODE_TRADES);
  if (ticket != -1) DeleteOrder(ticket);

  PrevState = STEP_DOWN;
  SetGlobals();
  return(0);
}

int OnRollUp() {
  Print("Func: RollUp");
  Print("Step: ", Step);    
  Print("PrevState: ", State2Str(PrevState));    

  if (StopOnRoll) {
    CloseAll();
    PrevState = STATE_0;
    SetGlobals();
    return(0);
  }

  PrevState = ROLL_UP;
  SetGlobals();

  OnStepUp();
  return(0);
}

int OnRollDown() {
  Print("Func: RollDown");
  Print("Step: ", Step);    
  Print("PrevState: ", State2Str(PrevState));    

  if (StopOnRoll) {
    CloseAll();
    PrevState = STATE_0;
    SetGlobals();
    return(0);
  }

  PrevState = ROLL_DOWN;
  SetGlobals();

  OnStepDown();
  return(0);
}

int GetOrder(int type, int pos=1, int order=DIRECT, int mode=MODE_TRADES) {
  return (GetOrderEx(type, 0, pos, order, mode));
}

int GetOrderEx(int type, double lot, int pos=1, int order=DIRECT, int mode=MODE_TRADES) {
  return (GetOrderExT(type, lot, pos, order, mode));

  switch (order) {
    case DIRECT:
    case REVERSE:
      break;

    default: 
      return(-1);
  }

  switch (mode) {
    case MODE_TRADES:
      int cnt = OrdersTotal();
      break;
    case MODE_HISTORY:
      cnt = HistoryTotal();
      break;

    default: 
      return(-1);
  }

  int ind = 1;
  if (order == DIRECT) {
    for (int i=0; i < cnt; i++) {
      OrderSelect(i, SELECT_BY_POS, mode);

      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != Magic) continue;
      if (OrderType() != type) continue;
      if (lot > 0 && DoubleToStr(OrderLots(), 1) != DoubleToStr(lot, 1)) continue;

      if (ind == pos) return(OrderTicket());
      ind++;
    }
  }

  if (order == REVERSE) {
    for (i=cnt-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS, mode);

      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != Magic) continue;
      if (OrderType() != type) continue;
      if (lot > 0 && DoubleToStr(OrderLots(), 1) != DoubleToStr(lot, 1)) continue;

      if (ind == pos) return(OrderTicket());
      ind++;
    }
  }

  return(-1);
}

int GetOrderExT(int type, double lot, int pos=1, int order=DIRECT, int mode=MODE_TRADES) {
  switch (order) {
    case DIRECT:
    case REVERSE:
      break;

    default: 
      return(-1);
  }

  switch (mode) {
    case MODE_TRADES:
      int cnt = OrdersTotal();
      break;
    case MODE_HISTORY:
      cnt = HistoryTotal();
      break;

    default: 
      return(-1);
  }

  int Tickets[];
  ArrayResize(Tickets, cnt);
  for (int i=0; i < cnt; i++) {
    OrderSelect(i, SELECT_BY_POS, mode);
    Tickets[i] = OrderTicket();
  }

  for (i=0; i < cnt; i++) {
    for (int j=i+1; j < cnt; j++) {
      OrderSelect(Tickets[i], SELECT_BY_TICKET, mode);
      int dt1 = OrderCloseTime();
      OrderSelect(Tickets[j], SELECT_BY_TICKET, mode);
      int dt2 = OrderCloseTime();

      if (mode == MODE_TRADES) {
        if (Tickets[i] > Tickets[j]) {
          int tmp = Tickets[i];
          Tickets[i] = Tickets[j];
          Tickets[j] = tmp;
        }
      }

      if (mode == MODE_HISTORY) {
        if (dt1 > dt2) {
          tmp = Tickets[i];
          Tickets[i] = Tickets[j];
          Tickets[j] = tmp;
        }
      }
    }
  }

  int ind = 1;
  if (order == DIRECT) {
    for (i=0; i < cnt; i++) {
      OrderSelect(Tickets[i], SELECT_BY_TICKET, mode);

      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != Magic) continue;
      if (OrderType() != type) continue;
      if (lot > 0 && DoubleToStr(OrderLots(), 1) != DoubleToStr(lot, 1)) continue;

      if (ind == pos) return(OrderTicket());
      ind++;
    }
  }

  if (order == REVERSE) {
    for (i=cnt-1; i >= 0; i--) {
      OrderSelect(Tickets[i], SELECT_BY_TICKET, mode);

      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != Magic) conti

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

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

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

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

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

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

Стоимость полного кода
1 673,40₽ ≈ $20.45