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

pioner_v4.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, использующий сеточную логику управления ордерами. Советник отслеживает количество открытых позиций и отложенных ордеров на символе, определяет текущее состояние системы и выполняет соответствующие действия: открытие новых ордеров, удаление или модификацию сеточных уровней.

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

Встроены механизмы управления рисками: остановка при роуле (StopOnRoll) и полная остановка всех операций (StopAll). При остановке все открытые позиции закрываются, а отложенные ордера удаляются. Советник работает с ордерами типа OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP и OP_SELLSTOP.

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

НастройкаОписание
Lots Размер лота — Размер лота по умолчанию, используемый при фиксированном режиме (FixedLot = true).
Grid Шаг сетки — Шаг сетки в пунктах, используемый для размещения отложенных ордеров (BuyLimit, SellLimit, BuyStop, SellStop) относительно текущей цены.
StopLoss Стоп-лосс — Стоп-лосс в пунктах, задающий расстояние от цены открытия ордера до уровня защитного ордера.
FixedLot Фиксированный лот — Переключатель фиксированного размера лота. При значении true используется заданный параметр Lots; при false — лот рассчитывается на основе баланса счёта.
Slippage Проскальзывание — Допустимое проскальзывание цены при открытии и закрытии ордеров, указываемое в пунктах.
Magic Магический номер — Магический номер ордера, используемый для идентификации ордеров, открытых данным советником, на символе.
StopOnRoll Остановка при роуле — Переключатель остановки при роуле. При значении true при переходе в состояния ROLL_UP или ROLL_DOWN все позиции закрываются и состояние сбрасывается.
StopAll Остановить всё — Переключатель полной остановки. При значении true советник закрывает все ордера, сбрасывает состояние и прекращает торговые операции до ручного сброса.
Получить полный код

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

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

extern double Lots = 0.1;
extern int Grid = 15;
extern int StopLoss = 200;
extern bool FixedLot = true;
extern int Slippage = 3;
extern int Magic = 110705;
extern bool StopOnRoll = false;
extern bool StopAll = false;

int BuyCnt = 0;
int SellCnt = 0;
int BuyLimitCnt = 0;
int SellLimitCnt = 0;
int BuyStopCnt = 0;
int SellStopCnt = 0;
int Step = 0;

#define FIRST_ORDER   1
#define LAST_ORDER    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 gVarName = "Pioner_PrevState";
int PrevState = STATE_0;

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

int deinit() {
  return(0);
}

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

int OnStep1() {
  double spread = 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 - spread;

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

  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;
  SetPrevState(PrevState);
  return(0);
}

int OnStepUp() {
  if (SellStopCnt == 1) {
    int ticket = GetOrderT(OP_SELLSTOP);
    DeleteOrder(ticket);
    SellStopCnt--;
  }

  if (BuyLimitCnt == 1) {
    ticket = GetOrderT(OP_BUYLIMIT);
    DeleteOrder(ticket);
    BuyLimitCnt--;
  }

  GetOrderT(OP_SELL, LAST_ORDER, MODE_TRADES);
  double Bid0 = OrderOpenPrice(); 
  double Ask0 = Bid0 + MarketInfo(Symbol(), MODE_SPREAD)*Point;

  if (BuyStopCnt == 0) {
    SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
  }

  if (SellLimitCnt == 0) {
    SetSellLimit(MathPow(2, Abs(Step)-1)*LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");
  }

  if (SellStopCnt == 0) {
    SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
  }

  if (BuyLimitCnt == 0) {
    SetBuyLimit(LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");
  }

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

int OnStepDown() {
  if (BuyStopCnt == 1) {
    int ticket = GetOrderT(OP_BUYSTOP); 
    DeleteOrder(ticket);
    BuyStopCnt--;
  }

  if (SellLimitCnt == 1) {
    ticket = GetOrderT(OP_SELLLIMIT); 
    DeleteOrder(ticket);
    SellLimitCnt--;
  }

  ticket = GetOrderT(OP_SELL, LAST_ORDER, MODE_TRADES);
  double Bid0 = OrderOpenPrice(); 
  double Ask0 = Bid0 + MarketInfo(Symbol(), MODE_SPREAD)*Point;

  if (BuyStopCnt == 0) {
    SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
  }

  if (SellLimitCnt == 0) {
    SetSellLimit(LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");
  }

  if (SellStopCnt == 0) {
    SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
  }	

  if (BuyLimitCnt == 0) {
    SetBuyLimit(MathPow(2, Abs(Step)-1)*LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");
  }

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

int OnRollUp() {
  if (StopOnRoll) {
    CloseAll();
    PrevState = STATE_0;
    SetPrevState(PrevState);
    return(0);
  }

  if (SellStopCnt == 1) {
    int ticket = GetOrderT(OP_SELLSTOP); 
    DeleteOrder(ticket);
    SellStopCnt--;
  }

  if (BuyLimitCnt == 1) {
    ticket = GetOrderT(OP_BUYLIMIT); 
    DeleteOrder(ticket);
    BuyLimitCnt--;
  }

  ticket = GetOrderT(OP_BUY, LAST_ORDER, MODE_TRADES);
  int cnt = OrdersTotal();
  for (int i=cnt-1; i >= 0; i--) {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

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

    if (ticket != OrderTicket()) CloseOrder(OrderTicket(), OrderLots(), Bid);
  }

  GetOrderT(OP_SELL, LAST_ORDER, MODE_TRADES);
  double Bid0 = OrderOpenPrice() ; 
  double Ask0 = Bid0 + MarketInfo(Symbol(), MODE_SPREAD)*Point;

  if (BuyStopCnt == 0) {
    SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
  }

  if (SellLimitCnt == 0) {
    SetSellLimit(MathPow(2, Abs(Step)-1)*LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");
  }

  if (SellStopCnt == 0) {
    SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
  }	

  if (BuyLimitCnt == 0) {
    SetBuyLimit(LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");
  }

  PrevState = ROLL_UP;
  SetPrevState(PrevState);
  return(0);
}

int OnRollDown() {
  if (StopOnRoll) {
    CloseAll();
    PrevState = STATE_0;
    SetPrevState(PrevState);
    return(0);
  }

  if (BuyStopCnt == 1) {
    int ticket = GetOrderT(OP_BUYSTOP); 
    DeleteOrder(ticket);
 

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

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

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

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

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

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

Стоимость полного кода
1 354₽ ≈ $16.55