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

ms_2.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 общих тегов
Вы автор или правообладатель?

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

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

О программе

Советник для MetaTrader 4, реализующий сеточную торговую стратегию. Он размещает отложенные ордера (buy stop, sell stop, buy limit, sell limit) на рассчитанных уровнях цены относительно текущей рыночной стоимости. При срабатывании стоп-лосса или тейк-профита советник пересчитывает уровни сетки, корректирует стоп-лоссы и размещает новые отложенные ордера для продолжения торговли в направлении движения цены. В коде также присутствуют функции удаления ненужных ордеров и фиксации позиций при достижении заданных условий.

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

НастройкаОписание
grid Шаг сетки — Задаёт расстояние между уровнями сетки в пунктах текущего инструмента
Получить полный код

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

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

extern double grid             = 20;
       double gridstep         = 6;
       double multk[25]        = {1,1,1,2,3,4,5};
       int    limit            = 5;
       double lotseq[25]       = {1,1,2.8,6,6,12,28.8};
       double stepseq[25];
       double gridseqbuy[25];
       double gridseqsell[25];
       double spred;
       int    lastlock, step;
       int    stateold, statecur;
       int    sleeppage        = 3;
       int    magic            = 120976;
       double currentprice, oldprice;
       bool   setall;
       int    lastbuy, lastsell, profitorder;

int Initialization() { 

    statecur = 0;
    stateold=statecur;
    spred=MarketInfo(Symbol(), MODE_SPREAD)*Point;
    RefreshRates();
    currentprice = Bid;
    OpenOrder (OP_SELL, LotSize(0), Bid, Bid+400*Point, Ask-grid*Point, "", magic, Red);
    OpenOrder (OP_BUY, LotSize(0), Ask, Ask-400*Point, Bid+grid*Point, "", magic, Green);
    step = 1;
    for(int i=0;i<=gridstep;i++)
      {
       stepseq[i]=multk[i]*grid*Point;
      }
    setall = SetOrders (LotSize(1), LotSize(1), LotSize(1), LotSize(1));
    SearchLastSellBuy();
    lastlock=0;
  return(0);
}

bool First(){

  int ordcnt=0;
  for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
      {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if ((OrderSymbol() == Symbol()) && (OrderTicket() > lastlock) && ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))) {ordcnt++;}
      }
  if (ordcnt>0) {return(false);}
  else {return(true);}
}

double LotSize(int tstep) {

  for (int i=0;i<=limit;i++)
    double alots=lotseq[i]+alots;
  alots++;

  double rez = 1*lotseq[tstep];
  if (rez < 0.1) {rez = 0.1;}

  return(rez);
}

bool AllPresent() {

     int buycnt = 0;
     int sellcnt = 0;
     int buystopcnt = 0;
     int buylimitcnt = 0;
     int sellstopcnt = 0;
     int selllimitcnt = 0;
     for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
         {
          OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
          if ((OrderSymbol() == Symbol()) && (OrderTicket() > lastlock))
             {

              switch (OrderType())
                  {
                   case 0: buycnt++;
                           break;
                   case 1: sellcnt++;
                           break;
                   case 2: buylimitcnt++;
                           break;
                   case 3: selllimitcnt++;
                           break;
                   case 4: buystopcnt++;
                           break;
                   case 5: sellstopcnt++;
                           break;
                  }
             }
         }

     if (buycnt > sellcnt) {step = buycnt-1;} else {step = sellcnt-1;}
     if ((buystopcnt==0) || (buylimitcnt==0) || (sellstopcnt==0) || (selllimitcnt==0)) {return(false);}
     else {return(true);}
} 

int SearchLastSellBuy(){

  lastbuy=0;
  lastsell=0;
  for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
      {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if ((OrderSymbol() == Symbol()) && (OrderTicket() > lastlock) && (OrderType() == OP_BUY))
          {
           if (OrderTicket()>lastbuy) {lastbuy=OrderTicket();}
          }
       if ((OrderSymbol() == Symbol()) && (OrderTicket() > lastlock) && (OrderType() == OP_SELL))
          {
           if (OrderTicket()>lastsell) {lastsell=OrderTicket();}
          }   
      }
  return(0);
}

bool OpenOrder(int cmd, double vol, double prc, double stl, double tpt, string com, int mag, color clr) {
  int err, max;

  prc=NormalizeDouble(prc,Digits);
  stl=NormalizeDouble(stl,Digits);
  tpt=NormalizeDouble(tpt,Digits);
  vol=NormalizeDouble(vol,1);
  int ticket = -1;
  max = 100;
  while ((ticket < 0) && (max != 0)) 
    {
     RefreshRates();
     ticket=OrderSend(Symbol(), cmd, vol, prc, sleeppage, stl, tpt, com, mag, 0, clr);

     err=GetLastError();
     if (ticket == -1) 
        {
         Comment("Error=", err, "   ", ErrorDescription(err));
         Sleep(6000);
        }
     else
        {Comment("                                             ");}
     max--;
    }
  Sleep(1000);
  if (max != 0) {return(true);}
  else {return(false);}
}

int TakeProfit(){

   profitorder=0;
   for (int cnt=HistoryTotal()-1;cnt>=0;cnt--)
       {
        OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
        if ((OrderType() == OP_SELL) || (OrderType() == OP_BUY))
           if (OrderTicket() > profitorder)
              if (OrderClosePrice() == OrderTakeProfit()) {profitorder = OrderTicket();}
       }
   return(profitorder);
}

int LockSearch(){

  lastlock = 0;
  for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
      {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == 1001001) && (OrderType() == OP_BUY))
          {
           if (OrderTicket()>lastlock) {lastlock=OrderTicket();}
          }
       if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == 1001001) && (OrderType() == OP_SELL))
          {
           if (OrderTicket()>lastlock) {lastlock=OrderTicket();}
          }   
      }
  return(0);
}

bool SetOrders(double bs, double sl, double ss, double bl){

  bool rez, temp;

  rez = true;
  if (statecur<=0)
    {
     if (bs != 0)
       {
        temp = OpenOrder (OP_BUYSTOP, bs, currentprice+stepseq[step+1]+spred, currentprice+stepseq[step+1]+spred-400*Point, currentprice+stepseq[step+1]+stepseq[step+2], "", magic, Green);
        if (!temp) {rez = false;}
       }
     if (sl != 0)
       {
        temp = OpenOrder (OP_SELLLIMIT, sl, currentprice+stepseq[step+1], currentprice+stepseq[step+1]+400*Point, currentprice+spred, "", magic, Green);
        if (!temp) {rez = false;}
       }
     if (ss != 0)
       {

        temp = OpenOrder (OP_SELLSTOP, ss, currentprice-stepseq[step], currentprice-stepseq[step]+400*Point, currentprice-stepseq[step]-stepseq[1]+spred, "", magic, Green);
        if (!temp) {rez = false;}
       }
     if (ss != 0)
       {
        temp = OpenOrder (OP_BUYLIMIT, bl, currentprice-stepseq[step]+spred, currentprice-stepseq[step]+spred-400*Point, currentprice-stepseq[step]+stepseq[1], "", magic, Green);
        if (!temp) {rez = false;}
       }
     return(rez);  
    }
  if (statecur==1)
        {
     if (bs != 0)
       {

        temp = OpenOrder (OP_BUYSTOP, bs, currentprice+stepseq[s

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

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

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

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

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

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

Стоимость полного кода
786,60₽ ≈ $9.61