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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.