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

EA Smart Neural V1

ea smart neural v1 @lifeindreamsworld.mq4
Вы автор или правообладатель?

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

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

О программе

EA Smart Neural V1 — торговый советник для MetaTrader 4, который считывает исторические данные H4 через вызовы Windows API и анализирует ценовые паттерны с использованием обнаружения пинбаров на данных M5. Советник исполняет ордера на покупку и продажу через стандартные торговые функции платформы.

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

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

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

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

НастройкаОписание
OP_BySignal Режим по сигналу — Режим работы советника. OFF — стандартный режим открытия ордеров по пинбарам с ограничением по Max_OP. ON — режим торговых сигналов с дополнительными стратегиями усреднения и модификации стоп-лосса и тейк-профита.
Jarak_OP Расстояние усреднения — Расстояние в пунктах для открытия дополнительных позиций при усреднении. Определяет ценовое отклонение от последней открытой позиции для входа в усреднение.
LotMultiply Множитель лота — Множитель для расчёта размера лота при усреднении позиций. Умножает лот последней позиции при открытии дополнительных ордеров.
Close_Signal Закрытие по сигналу — Переключатель закрытия противоположных позиций при получении торгового сигнала. При значении true при появлении сигнала на покупку закрываются продажи и наоборот.
MagicID Магический идентификатор — Идентификатор магического номера для идентификации ордеров, открытых данным советником. Используется для фильтрации позиций по символу и магическому номеру.
LOTS Фиксированный лот — Фиксированный размер лота для торговых операций при нулевом значении параметра risk. Используется как базовый объём позиции.
risk: 0-->fixed lots (risk) Риск от баланса — Процент риска от баланса счёта для расчёта размера лота. При значении 0 используется фиксированный лот из параметра LOTS. При ненулевом значении лот рассчитывается как процент от баланса.
Max_OP Максимум открытых ордеров — Максимальное количество одновременно открытых ордеров на один символ, контролируемое советником. Ограничивает число позиций в рамках одной торговой направленности.
SL Стоп-лосс — Стоп-лосс в пунктах, устанавливаемый при открытии ордера. Определяет расстояние от цены входа до уровня стоп-лосса.
TP Тейк-профит — Тейк-профит в пунктах, устанавливаемый при открытии ордера. Определяет расстояние от цены входа до уровня тейк-профита.
TPLinier Линейный тейк-профит — Переключатель линейного режима тейк-профита при усреднении. При значении true тейк-профит рассчитывается от средней цены открытых позиций, при false — от цены каждой отдельной позиции.
UseTralling (UseTralling) Использовать трейлинг-стоп — Переключатель трейлинг-стопа. При значении true активируется автоматическое перемещение стоп-лосса в сторону прибыли по открытым позициям.
Ts Start in Pips (TrallingStart) Начало трейлинг-стопа — Начальное расстояние трейлинг-стопа в пипсах от цены входа. Трейлинг-стоп активируется только после того, как цена сместится на это расстояние в пользу позиции.
Lock Profit in Pips (LockProfit) Фиксация прибыли трейлинга — Расстояние фиксации прибыли в пипсах для трейлинг-стопа. При достижении трейлингом определённой прибыли стоп-лосс фиксируется на уровне, отстоящем на это значение от трейлинг-старта.
TimeFilter (UseTimeFilter) Использовать временной фильтр — Переключатель временного фильтра. При значении true ордера открываются только в интервале между временами Start и End1. При false — ограничений по времени нет.
Start (Start) Время начала фильтра — Начальное время фильтра торговой сессии в формате ЧЧ:ММ. Совместно с параметром End1 определяет временной интервал, в котором разрешено открытие ордеров.
Stop (End1) Время окончания фильтра — Конечное время фильтра торговой сессии в формате ЧЧ:ММ. Совместно с параметром Start определяет разрешённый интервал для открытия ордеров.
Получить полный код

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

#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;

enum OPBySignal
{
ON=0,
OFF=1,
};

input  OPBySignal OP_BySignal = OFF; 
input  int        Jarak_OP    = 50;
input  double    LotMultiply  = 1;
input  bool      Close_Signal = false;
input  int      MagicID=12345678;
input  double   LOTS=0.01;
input  int      risk=100;//risk: 0-->fixed lots

input  int      Max_OP=5;
input  double   SL=500;
input  double   TP=150;
extern bool     TPLinier = true;
extern bool     UseTralling   = false; // UseTralling
extern double   TrallingStart = 10;    // Ts Start in Pips
extern double   LockProfit    = 5;     // Lock Profit in Pips
extern bool   UseTimeFilter   = false;  // TimeFilter
extern string Start           = "00:00";// Start
extern string End1            = "15:00";// Stop

bool jamOP(){
bool Oc=false;
   if(UseTimeFilter){
      string j1 = TimeToStr(TimeCurrent(), TIME_DATE) + " " + Start;
      string j2 = TimeToStr(TimeCurrent(), TIME_DATE) + " " + End1;
      if(TimeCurrent()>=StrToTime(j1)&&TimeCurrent()<StrToTime(j2)){return(true);}
   }else {return(true);}
   return(Oc);
}
union Price
  {
   uchar             buffer[8];
   double            close;
  };

double data[][2];

int BytesToRead;
string    datapath;
string    result;
Price     m_price;
int StopLoss  = 0;
double    SL_BEP_minus = 0;
double g_Point;
int    ticket=0;
double    Buy, lotbuy, lotsbuy, Sell, lotsell, lotssell, SUM, SWAP, 
          profitbuy, profitsell, OP, dg,
          sumbuy, sumsell, bepbuy, bepsell, lowlotbuy, lowlotsell, hisell, 
          lobuy;

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

void OnDeinit(const int reason)
  {
    ObjectDelete("L01"); 
    ObjectDelete("L02"); 
    ObjectDelete("L03");
    ObjectDelete("L04");  
    ObjectDelete("L05"); 
    ObjectDelete("L06"); 
    ObjectDelete("L07"); 
    ObjectDelete("L08"); 
    ObjectDelete("L09"); 
    ObjectDelete("L10");
    ObjectDelete("L11");
    ObjectDelete("L12");
    ObjectDelete("L13"); 
    ObjectDelete("L14"); 
    ObjectDelete("L15");
    ObjectDelete("L16"); 
    ObjectDelete("L17"); 
    ObjectDelete("L18");
    ObjectDelete("L19"); 
    ObjectDelete("L20"); 
    ObjectDelete("L21");
    ObjectDelete("L22");  
    ObjectDelete("L23");
    ObjectDelete("L24");
    ObjectDelete("L25");
    ObjectDelete("L26");  
    ObjectDelete("L27");
    ObjectDelete("L28");
    ObjectDelete("L29"); 
    ObjectDelete("L30"); 
    ObjectDelete("L31"); 
    ObjectDelete("L32"); 
    ObjectDelete("L33");
    ObjectDelete("L34"); 
    ObjectDelete("L35"); 
    ObjectDelete("L36");
    ObjectDelete("L37");  
    ObjectDelete("L38");
    ObjectDelete("L39");
    ObjectDelete("L40");
    ObjectDelete("L41");  
    ObjectDelete("L42"); 
    ObjectDelete("L43"); 
    ObjectDelete("L44");
    ObjectDelete("L45");  
    ObjectDelete("L46");
    ObjectDelete("L47");
    ObjectDelete("L48");
    ObjectDelete("L49");  
    ObjectDelete("L50"); 
    ObjectDelete("L51");
    ObjectDelete("L52");
    ObjectDelete("L53");  
    ObjectDelete("L54"); 
    ObjectDelete("L55"); 
    ObjectDelete("L56");
    ObjectDelete("L57");  
    ObjectDelete("L58");
    ObjectDelete("L59");
    ObjectDelete("L60");
    ObjectDelete("L61");  
    ObjectDelete("L62");  
    ObjectDelete("L63"); 

   ObjectDelete("Average_Price_Line_Bep");
   ObjectDelete("Average_Price_Line_Buy");
   ObjectDelete("Average_Price_Line_Sell");
   ObjectDelete("Information_");
   ObjectDelete("Average_Price_Buy");
   ObjectDelete("Average_Price_Sell");
   ObjectDelete("MENU");
   ObjectDelete("MENU1");
   ObjectsDeleteAll();
   ObjectsDeleteAll();
   ObjectsDeleteAll();
   ChartRedraw();
  }

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

int CountTrades(){
    int count=0;
    for(int trade=OrdersTotal()-1;trade>=0;trade--){
    int resulttrade=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicID)continue;
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicID){
      if(OrderType()==OP_SELL || OrderType()==OP_BUY){count++;}}}
 return(count);}

int CountTradesBuy(){
    int count=0;
    for(int trade=OrdersTotal()-1;trade>=0;trade--){
    int resulttradebuy=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicID)continue;
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicID){
      if(OrderType()==OP_BUY){count++;}}}
 return(count);}

int CountTradesSell(){
    int count=0;
    for(int trade=OrdersTotal()-1;trade>=0;trade--){
    int resulttradesell=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicID)continue;
    if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicID){
      if(OrderType()==OP_SELL ){count++;}}}
 return(count);} 

void myAvg(){
         int      iCount      =  0;
         double   LastOP      =  0;
         double   LastLots    =  0;
         bool     LastIsBuy   =  false;
         int      iTotalBuy   =  0;
         int      iTotalSell  =  0;         

         double   Spread      = 0.0;   
         Spread= MarketInfo(Symbol(), MODE_SPREAD); 

   int pos = -1 ;
   for(int i = 0 ; i < BytesToRead - 1 ; i++)
     {
      if(!(data[i][0]<Time[0]))
         break;
      pos = i + 1;
     }

         for(iCount=0;iCount<OrdersTotal();iCount++){                  
           bool iCount2=false;
        iCount2=OrderSelect(iCount,SELECT_BY_POS,MODE_TRADES);         
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicID)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP>OrderOpenPrice()) {LastOP=OrderOpenPrice();}
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=true;
               iTotalBuy++;
             }

           if(OrderType()==OP_SELL && OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicID)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP<OrderOpenPrice()) {LastOP=OrderOpenPrice();}         
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=false;
               iTotalSell++;
            }         
         }      

         /* Jika arah Price adalah DOWNTREND...., Periksa nilai Bid (*/
         if(LastIsBuy)
         {
         if(data[pos][1]>Open[0])
         {
            if(IsBuyPinbar() && Bid<=LastOP-(Jarak_OP*Point )){
               ticket=OrderSend(Symbol(),OP_BUY,NormalizeDouble((LastLots* LotMultiply  ),2),Ask,Slippage,0,0,"",MagicID,0,clrGreen);
                bool LiB2=false;
        LiB2=OrderModify(ticket,OrderOpenPrice(),Ask-SL*g_Point,Ask+(TP*g_Point),0,clrGreen);   
               LastIsBuy=false;
               return;
            }
         }
         }
         /* Jika arah Price adalah Sell...., Periksa nilai Ask (*/
         else if(!LastIsBuy)
         {
         if(data[pos][1]<Open[0] )
         { 
            if(IsSellPinbar() && Ask>=LastOP+(Jarak_OP*Point )){
             ticket =OrderSend(Symbol(),OP_SELL,NormalizeDouble((LastLots* LotMultiply  ),2),Bid,Slippage,0,0,"",MagicID,0,clrRed); 
               bool LiB=false;
        LiB=OrderModify(ticket,OrderOpenPrice(),Bid+SL*g_Point,Bid-(TP*g_Point),0,clrRed); 
             return;
         }
     }
}
}

void myAvg1(){
         int      iCount      =  0;
         double   LastOP      =  0;
         double   LastLots    =  0;
         bool     LastIsBuy   =  false;
         int      iTotalBuy   =  0;
         int      iTotalSell  =  0;         

         double   Spread      = 0.0;   
         Spread= MarketInfo(Symbol(), MODE_SPREAD); 

   int pos = -1 ;
   for(int i = 0 ; i < BytesToRead - 1 ; i++)
     {
      if(!(data[i][0]<Time[0]))
         break;
      pos = i + 1;
     }

         for(iCount=0;iCount<OrdersTotal();iCount++){                  
           bool iCount1=false;
        iCount1=OrderSelect(iCount,SELECT_BY_POS,MODE_TRADES);          
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicID)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP>OrderOpenPrice()) {LastOP=OrderOpenPrice();}
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=true;
               iTotalBuy++;
             }

           if(OrderType()==OP_SELL && OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicID)
           {
               if(LastOP==0) {LastOP=OrderOpenPrice();}
               if(LastOP<OrderOpenPrice()) {LastOP=OrderOpenPrice();}         
               if(LastLots<OrderLots()) {LastLots=OrderLots();}
               LastIsBuy=false;
               iTotalSell++;
            }         
         }      

         /* Jika arah Price adalah DOWNTREND...., Periksa nilai Bid (*/
         if(LastIsBuy)
         {
         if(data[pos][1]>Open[0])
         {
            if(IsBuyPinbar() && Bid<=LastOP-(Jarak_OP*Point )){
               ticket=OrderSend(Symbol(),OP_BUY,NormalizeDouble((LastLots* LotMultiply  ),2),Ask,Slippage,0,0,"",MagicID,0,clrGreen);
               hitung();
               tpsl(); 
                LastIsBuy=false;   
               return;
            }
         }
         }
         /* Jika arah Price adalah Sell...., Periksa nilai Ask (*/
         else if(!LastIsBuy)
         {
         if(data[pos][1]<Open[0] )
         { 
            if(IsSellPinbar() && Ask>=LastOP+(Jarak_OP*Point )){
             ticket =OrderSend(Symbol(),OP_SELL,NormalizeDouble((LastLots* LotMultiply  ),2),Bid,Slippage,0,0,"",MagicID,0,clrRed); 
              hitung();
              tpsl(); 
             return;
         }
     }
}
}

void hitung()
{
    Buy    = 0; lotbuy = 0; lotsbuy = 0; Sell = 0; lotsell = 0; lotssell = 0; SUM = 0; SWAP = 0; profitbuy = 0; profitsell = 0;
    sumbuy = 0; sumsell = 0; bepbuy = 0; bepsell = 0; lowlotbuy = 9999; lowlotsell = 9999; hisell = 0; lobuy = 999999999;

    for (int i = 0; i < OrdersTotal(); i++)
    {
        bool hitung1=false;
        hitung1=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderSymbol() != Symbol() )
        {
            continue;
        }

        if (OrderType() == OP_BUY  )
        {
            Buy++; OP++; lotbuy = OrderLots();
            profitbuy          += OrderProfit(); lotsbuy += OrderLots(); lowlotbuy = MathMin(lowlotbuy, OrderLots());
            sumbuy             += OrderLots() * OrderOpenPrice(); lobuy = MathMin(lobuy, OrderOpenPrice());
        }

        if (OrderType() == OP_SELL )
        {
            Sell++; OP++; lotsell = OrderLots();
            profitsell           += OrderProfit(); lotssell += OrderLots(); lowlotsell = MathMin(lowlotsell, OrderLots());
            sumsell              += OrderLots() * OrderOpenPrice(); hisell = MathMax(hisell, OrderOpenPrice());
        }
    }

    if (lotsbuy > 0)
    {
        bepbuy = sumbuy / lotsbuy;
    }
    if (lotssell > 0)
    {
        bepsell = sumsell / lotssell;
    }
}  // end hitung

double ND(double p)
{
    return(NormalizeDouble(p, Digits));
}

void tpsl( )
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        bool TPSL1=false;
        TPSL1=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if (OrderSymbol() != Symbol() )
        {
            continue;
        }

        if (OrderType() == OP_BUY )
        {
            double oTPB = (bepbuy + TP * Point ) * (TP > 0);  double oSLB = OrderStopLoss();
            if (SL_BEP_minus > 0)
                oSLB = (bepbuy - SL_BEP_minus * Point );
            if (Buy == 1)
            {
                oTPB = ND(OrderOpenPrice() + TP   * Point ) * (TP > 0);  if ( StopLoss  > 0)
                    oSLB = (OrderOpenPrice() -  StopLoss  * Point );
            }
            oTPB = ND(oTPB); oSLB = ND(oSLB);
            if (Bid >= oTPB && oTPB > 0)
                bool BEPSL=false;
        BEPSL=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, CLR_NONE);
            if (Bid <= oSLB)
                bool OPbuyTPSL=false;
        OPbuyTPSL=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, CLR_NONE);

            if (ND(OrderTakeProfit()) != oTPB || ND(OrderStopLoss()) != oSLB)
            {
                if (!OrderModify(OrderTicket(), OrderOpenPrice(), oSLB, oTPB, OrderExpiration()))
                {
                    Print(OrderTicket() + " MODIFY TP  @ " + DoubleToStr(oTPB, Digits) + " SL @ " + DoubleToStr(oSLB, Digits) + " ");
                }
            }
          {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
          }
        }

        if (OrderType() == OP_SELL )
        {
            double oTPS = (bepsell - TP* Point ) * (TP> 0);  double oSLS = OrderStopLoss();
            if (SL_BEP_minus > 0)
                oSLS = (bepsell + SL_BEP_minus * Point );
            if (Sell == 1)
            {
                oTPS = (OrderOpenPrice() - TP * Point ) * (TP> 0); if ( StopLoss  > 0)
                    oSLS = (OrderOpenPrice() +  StopLoss  * Point );
            }
            oTPS = ND(oTPS); oSLS = ND(oSLS);
            if (Ask <= oTPS)
                bool BTPSL=false;
        BTPSL=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, CLR_NONE);
            if (Ask >= oSLS && oSLS > 0)
                bool OPsellTPSL=false;
        OPsellTPSL=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, CLR_NONE);

            if (ND(OrderTakeProfit()) != oTPS || ND(OrderStopLoss()) != oSLS)
            {
                if (!OrderModify(OrderTicket(), OrderOpenPrice(), oSLS, oTPS, OrderExpiration()))
                {
                    Print(OrderTicket() + "MODIFY TP  @ " + DoubleToStr(oTPS, Digits) + " SL @ " + DoubleToStr(oSLS, Digits) + " ");
                }
            }
            {
            Print("OrderSend() error - ", ErrorDescription(GetLastError()));
          }
        }
    }
}

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_pr

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

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

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

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

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

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

Стоимость полного кода
3 255,10₽ ≈ $39.78