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

dope_mod_2.mq4

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

#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 1 общих теговsma crossover scalper ea for mt4.mq4MQL4 / MetaTrader 4 · 1 общих теговr15 pivot points expert advisor by @fundedmillionairess.mq4MQL4 / MetaTrader 4 · 1 общих теговnewstrader.mq5MQL5 / MetaTrader 5 · 1 общих теговmm3.0_flip_codepro_v3.1_with_cooldown@lifeindreamsworld.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Советник для MetaTrader 4, работающий на таймфрейме H4. Считывает исторические данные цен из файла формата .hst через системные DLL-библиотеки Windows и использует их как опорный уровень для формирования торговых сигналов. Открывает рыночные ордера BUY и SELL при наличии подходящих свечных паттернов на текущем графике, контролирует допустимый спред и количество активных позиций. Реализует фиксированные и трейлинг-стопы, а также отображает информационную панель с текущими параметрами счета на графике.

Расчёт размера лота может выполняться как по фиксированному значению, так и на основе заданного процента риска от баланса счёта. При работе с ECN-брокерами стоп-лосс и тейк-профит не передаются в ордер. Трейлинг-стоп отслеживает открытые позиции и модифицирует уровень стоп-лосса при достижении заданного уровня прибыли. Информационная панель отображает текущий спред, баланс, эквити, прибыль, количество ордеров и основные параметры торговли.

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

НастройкаОписание
Ordercomment Комментарий ордера — Текстовый комментарий, добавляемый к открываемым ордерам.
Slippage Допустимый проскальзывание — Максимальное допустимое проскальзывание в пунктах при исполнении ордера.
ES UNA CUENTA ECN? (ecnBroker) ECN-брокер — Переключатель режима работы с ECN-брокером; при включении стоп-лосс и тейк-профит не передаются в ордер.
LOTS Размер лота — Фиксированный размер лота для открытия позиций.
risk: 0 --> Para lotes fijos (risk) Риск в процентах — Процент от баланса для расчёта размера лота; при нулевом значении используется фиксированный лот.
SL Стоп-лосс — Расстояние стоп-лосса в пунктах от цены входа.
TP Тейк-профит — Расстояние тейк-профита в пунктах от цены входа.
Trailing Трейлинг-стоп — Включает или отключает автоматическое сопровождение позиции трейлинг-стопом.
TrailingStop Расстояние трейлинг-стопа — Расстояние в пунктах между текущей ценой и уровнем стоп-лосса при трейлинге.
TrailingStep Шаг трейлинг-стопа — Минимальный шаг сдвига стоп-лосса при модификации трейлинг-стопа.
TrailStart Начало трейлинга — Расстояние в пунктах от цены входа, при достижении которого начинается движение трейлинг-стопа.
Max?mo de Ordenes (MaxOrders) Максимум ордеров — Максимальное допустимое количество активных рыночных ордеров на символ.
MaxSpread Максимальный спред — Максимально допустимый спред в пунктах; при превышении новые ордера не открываются.
Получить полный код

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

#property description "Dope_mod_2.mq4"

  #property version "4.00"
  #property strict

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

  #import   "kernel32.dll"
  int CreateFileW(string Filename,int AccessMode,int ShareMode,int PassAsZero,int CreationMode,int FlagsAndAttributes,int AlsoPassAsZero);
  int GetFileSize(int FileHandle,int PassAsZero);
  int SetFilePointer(int FileHandle,int Distance,int &PassAsZero[],int FromPosition);
  int ReadFile(int FileHandle,uchar &BufferPtr[],int BufferLength,int  &BytesRead[],int PassAsZero);
  int CloseHandle(int FileHandle);
  #import

  extern  string Ordercomment=" ";
  extern int Slippage=3;

  int    Retries=10;

  bool   AutoTrade=true;

  extern bool   ecnBroker=false; //ES UNA CUENTA ECN?

  datetime expDate=D'2020.10.20 18:00';//yyyy.mm.dd

  int MagicID=10101988;
  input double LOTS=0.01;
  extern int risk=20;//risk: 0 --> Para lotes fijos
  input double SL=200;
  input double TP=50;
  extern bool Trailing = true;
  extern int  TrailingStop = 15;
  extern int  TrailingStep = 2;
  extern int TrailStart = 3.0;
  extern int    MaxOrders = 20; //Max?mo de Ordenes
  extern double MaxSpread = 20;
  double Gd_188;

  union Price
    {
     uchar             buffer[8];
     double            close;
    };

  double data[][2];

  int BytesToRead;
  string    datapath;
  string    result;
  Price     m_price;

  double g_Point;
  int    ticket=0;

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

  void OnDeinit(const int reason)
    {
    /*
     for(int ui = ObjectsTotal() - 1; ui >= 0; ui--)
     {
      string name2 = ObjectName(ui);
       if(StringFind(name2, "klc", 0) != -1)
         ObjectDelete(name2);   
         }
     */

    }

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

  void ReadFileHst(string FileName)
    {
     int       j=0;;
     string    strFileContents;
     int       Handle;
     int       LogFileSize;
     int       movehigh[1]= {0};
     uchar     buffer[];
     int       nNumberOfBytesToRead;
     int       read[1]= {0};
     int       i;
     double    mm;

     strFileContents="";
     Handle=CreateFileW(FileName,(int)0x80000000,3,0,3,0,0);

     if(Handle==-1)
       {
        Comment("");
        return;
       }
     LogFileSize=GetFileSize(Handle,0);

     if(LogFileSize<=0)
       {
        return;
       }

     if((LogFileSize-148)/60==BytesToRead)
       {
        return;
       }
     SetFilePointer(Handle,148,movehigh,0);
     BytesToRead=(LogFileSize-148)/60;
     ArrayResize(data,BytesToRead,0);
     nNumberOfBytesToRead=60;
     ArrayResize(buffer,60,0);
     for(i=0; i<BytesToRead; i=i+1)

       {
        ReadFile(Handle,buffer,nNumberOfBytesToRead,read,NULL);
        if(read[0]==nNumberOfBytesToRead)
          {
           result=StringFormat("0x%02x%02x%02x%02x%02x%02x%02x%02x",buffer[7],buffer[6],buffer[5],buffer[4],buffer[3],buffer[2],buffer[1],buffer[0]);

           m_price.buffer[0] = buffer[32];
           m_price.buffer[1] = buffer[33];
           m_price.buffer[2] = buffer[34];
           m_price.buffer[3] = buffer[35];
           m_price.buffer[4] = buffer[36];
           m_price.buffer[5] = buffer[37];
           m_price.buffer[6] = buffer[38];
           m_price.buffer[7] = buffer[39];
           mm=m_price.close;
           data[j][0] = StringToDouble(result);
           data[j][1] = mm;
           j=j+1;
           strFileContents=TimeToString(StringToTime(result),3)+" "+DoubleToString(mm,8);
          }
        else
          {
           CloseHandle(Handle);
           return;
          }
       }
     CloseHandle(Handle);
     strFileContents=DoubleToString(data[j-1][0],3)+" "+DoubleToString(data[j-1][1],8)+" "+DoubleToString(data[j-2][1],3)+" "+DoubleToString(data[j-2][1],8);
     result=strFileContents;
    }

  int fnGetLotDigit()
    {
     double l_LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);
     if(l_LotStep == 1)
        return(0);
     if(l_LotStep == 0.1)
        return(1);
     if(l_LotStep == 0.01)
        return(2);
     if(l_LotStep == 0.001)
        return(3);
     if(l_LotStep == 0.0001)
        return(4);
     return(1);
    }

  int CheckBuyOrders(int magic)
    {
     int op=0;

     for(int i=OrdersTotal()-1; i>=0; i--)

       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=magic)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_BUY)
             {
              op++;
              break;
             }
          }
       }
     return(op);
    }

  int CheckSellOrders(int magic)
    {
     int op=0;

     for(int i=OrdersTotal()-1; i>=0; i--)

       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=magic)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_SELL)
             {
              op++;
              break;
             }
          }
       }
     return(op);
    }

  int CheckTotalBuyOrders(int magic)
    {
     int op=0;

     for(int i=OrdersTotal()-1; i>=0; i--)

       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=magic)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_BUY)
             {
              op++;
             }
          }
       }
     return(op);
    }

  int CheckTotalSellOrders(int magic)
    {
     int op=0;

     for(int i=OrdersTotal()-1; i>=0; i--)

       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=magic)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_SELL)
             {
              op++;
             }
          }
       }
     return(op);
    }

  int CheckMarketSellOrders()
    {
     int op=0;

     for(int i=OrdersTotal()-1; i>=0; i--)

       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=MagicID)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_SELL)
             {
              op++;
             }
          }
       }
     return(op);
    }

  int CheckMarketBuyOrders()
    {
     int op=0;

     for(int i=OrdersTotal()-1; i>=0; i--)

       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=MagicID)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_BUY)
             {
              op++;
             }
          }
       }
     return(op);
    }

  bool MainOrders(int a_cmd_0,double price_24,double price_TP,double price_SL)
    {
     color color_8=Black;
     int bClosed;
     int nAttemptsLeft=Retries;
     int cmd=0;

     if(a_cmd_0 ==OP_BUY||a_cmd_0 ==OP_BUYSTOP)
        cmd=0;
     if(a_cmd_0 ==OP_SELL||a_cmd_0 ==OP_SELLSTOP)
        cmd=1;

     if(a_cmd_0==OP_BUYLIMIT || a_cmd_0==OP_BUY)
       {
        color_8=Blue;
       }
     else
       {

        if(a_cmd_0==OP_SELLLIMIT || a_cmd_0==OP_SELL)
          {
           color_8=Red;
          }
       }

     double lots_32=NormalizeDouble(LOTS,fnGetLotDigit());

     if(lots_32==0.0)
        return(false);

     double gd_532 = MarketInfo(Symbol(), MODE_MAXLOT);
     double gd_540 = MarketInfo(Symbol(), MODE_MINLOT);

     if(lots_32 > gd_532)
        lots_32 = gd_532;
     if(lots_32 < gd_540)
        lots_32 = gd_540;

     bClosed=false;

     while((bClosed==false) && (nAttemptsLeft>=0))
       {
        nAttemptsLeft--;
        RefreshRates();

        if(!ecnBroker)
           bClosed=OrderSend(Symbol(),a_cmd_0,lots_32,price_24,Slippage,price_SL,price_TP,Ordercomment,MagicID,0,color_8);
        else
           bClosed=OrderSend(Symbol(),a_cmd_0,lots_32,price_24,Slippage,0,0,Ordercomment,MagicID,0,color_8);

        if(bClosed<=0)
          {
           int nErrResult=GetLastError();

           if(a_cmd_0==0)
             {
              Print("DOPE EA Open New Buy FAILED : Error "+IntegerToString(nErrResult)+" ["+ErrorDescription(nErrResult)+".]");
              Print(IntegerToString(a_cmd_0)+" "+DoubleToString(lots_32,2)+" "+DoubleToString(price_24,Digits));
             }
           else
             {
              if(a_cmd_0==1)
                {
                 Print("DOPE EA Open New Sell FAILED : Error "+IntegerToString(nErrResult)+" ["+ErrorDescription(nErrResult)+".]");
                 Print(IntegerToString(a_cmd_0)+" "+DoubleToString(lots_32,2)+" "+DoubleToString(price_24,Digits));
                }
             }

           if(nErrResult == ERR_TRADE_CONTEXT_BUSY ||
              nErrResult == ERR_NO_CONNECTION)
             {
              Sleep(50);
              continue;
             }
          }

        ticket=bClosed;

        bClosed=true;

       }

     return(true);
    }

  void CloseBuy()
    {
     bool clo;
     while(CheckMarketBuyOrders()>0)
       {
        for(int i=OrdersTotal()-1; i>=0; i--)
          {
           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
              if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicID)
                 if(OrderType()==OP_BUY)
                    clo=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,clrAqua);

          }
       }

    }

  void CloseSell()
    {
     bool clo;
     while(CheckMarketSellOrders()>0)
       {
        for(int i=OrdersTotal()-1; i>=0; i--)
          {
           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
              if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicID)
                 if(OrderType()==OP_SELL)
                    clo=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,clrAqua);

          }
       }
    }

  double GetLots()
    {
     double lot;
     double minlot=MarketInfo(Symbol(),MODE_MINLOT);
     double maxlot=MarketInfo(Symbol(),MODE_MAXLOT);
     if(risk!=0)
       {
        lot=NormalizeDouble(AccountBalance()*risk/100/10000,2);
        if(lot<minlot)
           lot=minlot;
        if(lot>maxlot)
           lot=maxlot;
       }
     else
        lot=LOTS;
  

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

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

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

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

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

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

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