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

DOPE

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

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

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

О программе

DOPE — советник для MetaTrader 4, предназначенный для автоматической торговли на валютном рынке. Программа анализирует исторические данные цен в формате HST (четырёхчасовой таймфрейм) и на их основе формирует торговые сигналы для открытия позиций.

Советник использует набор технических индикаторов и анализ свечных паттернов для определения точек входа в рынок. При обнаружении подходящих условий автоматически отправляются рыночные ордера BUY или SELL с заданными уровнями стоп-лосса и тейк-профита.

Встроена система управления рисками: расчёт объёма позиции как фиксированной лоты или на основе процента от баланса счёта. Также реализованы функция трейлинг-стоп и ограничение по максимальному спреду для контроля условий торговли.

Советник работает на платформе MetaTrader 4 и использует торговый API платформы для исполнения операций. Для работы требуется разрешение на импорт DLL-функций, так как программа обращается к системным библиотекам Windows для чтения файлов истории.

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

НастройкаОписание
MagicID Магический номер — Идентификатор магического числа для фильтрации ордеров и позиций, открытых советником.
LOTS Фиксированные лоты — Фиксированный объём лоты для открытия позиций при нулевом значении параметра risk.
risk: 0-->fixed lots (risk) Риск — Процент от баланса счёта для расчёта объёма позиции. При значении 0 используется фиксированный объём лоты.
MaxTrades Максимальное число сделок — Максимальное количество одновременных открытых рыночных ордеров в одном направлении.
SL Стоп-лосс — Значение стоп-лосса в пунктах для каждой открытой позиции.
TP Тейк-профит — Значение тейк-профита в пунктах для каждой открытой позиции.
MaxSpread Максимальный спред — Максимально допустимый спред в пунктах. При превышении советник не открывает новые позиции.
Trailing Включить трейлинг-стоп — Логический переключатель для включения или отключения функции трейлинг-стоп.
TrailingExtra Дополнительный параметр трейлинга — Дополнительный параметр, используемый при настройке трейлинг-стопа.
TrailingStop Расстояние трейлинг-стопа — Расстояние трейлинг-стопа от текущей цены до стоп-лосса, в пунктах.
TrailingStep Шаг трейлинг-стопа — Шаг сдвига стоп-лосса при активном трейлинг-стопе, в пунктах.
TrailStart Начало трейлинга — Расстояние от цены открытия, при достижении которого активируется трейлинг-стоп.
Получить полный код

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

#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

  string Ordercomment="";
  int Slippage=3;

  int    Retries=10;

  bool   AutoTrade=true;

  bool   ecnBroker=false;

  input int MagicID=123;
  input double LOTS=0.01;
  input int risk=40;//risk: 0-->fixed lots
  input int MaxTrades=10;
  input double SL=50;
  input double TP=100;
  input int    MaxSpread=20;
  extern bool Trailing = true;
  extern double TrailingExtra = 50.0;
  extern int TrailingStop=7;
  extern double TrailingStep  =0.5;
   extern double TrailStart  =1.0;

  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)
    {

    }

  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("FX 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("FX 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() && OrderMagicNumbe

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

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

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

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

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

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

Стоимость полного кода
1 501,50₽ ≈ $18.35