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