Unlocker EA
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «locks unlocker.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой торговый советник для платформы MetaTrader 4 (MQL4), реализующий систему управления позициями с механизмом локирования и стабилизации. При достижении заданного уровня убытка советник открывает противоположный ордер (лок), а при достижении минимального профита запускает процедуру стабилизации позиций.
Советник оснащён графическим интерфейсом с кнопками включения/отключения режимов локирования и стабилизации, а также отображает текущие данные по открытым ордерам и общему профиту. Встроена система проверки лицензии с шифрованием, ограничивающая использование без активации.
Поддерживается работа с отложенными ордерами, включая их корректировку и удаление. При критически низком уровне свободной маржи советник автоматически закрывает отложенные ордера и останавливает торговую логику. Доступна эмуляция позиций в стратег-тестере для отладки.
Настройки программы
| Настройка | Описание |
|---|---|
| tf | Таймфрейм, используемый для анализа ценовых данных и определения направления движения. |
| LockDD | Уровень убытка (просадки), при превышении которого активируется механизм локирования позиций путём открытия противоположного ордера. |
| Delta | Минимальный профит, при достижении которого активируется процедура стабилизации позиций. |
| HighLowOffset | Отступ от максимума/минимума цены при размещении отложенных ордеров в режиме стабилизации. |
| PendingOffset | Смещение для корректировки цены отложенных ордеров (трал отложки). При значении 0 функция отключена. |
| FreeMargin | Порог свободной маржи (0 — выключено). При падении свободной маржи ниже данного значения советник удаляет отложенные ордера и останавливает торговлю. |
| LockMagic | Магический номер для идентификации ордеров, связанных с локированием. |
Поиск по коду файла
#property version "1.00"
#property strict
#define POINTS_NEW
#include <sovetnikovGUI\Orders.mqh>
#include <sovetnikovGUI\Button.mqh>
#include <sovetnikovGUI\Time.mqh>
#define LICENSE_OFF
#define LICENSE_NAME "3v36oizf4y1nhrzysgwpb6w#08g$3v34"
#define LICENSE_FILE "unlocker"
#define VALID_KEY "Советник активен"
#define EMPTY_KEY "Необходимо активировать советник."
#define INVALID_KEY "Неверная лицензия."
#define EXPERIED "Лицензия истекла "
TF tf=PERIOD_M5; //Таймфрейм
D LockDD=500; //Убыток для активации лок
D Delta=1; //Минимальный профит
D HighLowOffset=10; //Отступ от хай\лоу
D PendingOffset=300; //Трал отложки (0 - выкл)
D FreeMargin=0; //Свободная маржа (0 - выкл)
I LockMagic=2020; //Меджик для лок ордера
C TextColor=clrBlack; //Цвет текста
class CMyOrders: public COrders
{
public:
void MovePending(long iLockMagic,double dPending_MinOffset)
{
if(dPending_MinOffset==0)
return;
Magic(iLockMagic);
double dOpen=0,dNewOpen=0;
long tbuy=getOrderTicket(OP_BUYSTOP);
if(OrderSelect(tbuy))
{
dOpen=OrderOpenPrice();
dNewOpen=Ask(m_name)+dPending_MinOffset*p;
if(dOpen>dNewOpen)
{
OrderModify(tbuy,dNewOpen,0,0);
}
}
long tsell=getOrderTicket(OP_SELLSTOP);
if(OrderSelect(tsell))
{
dOpen=OrderOpenPrice();
dNewOpen=Bid(m_name)-dPending_MinOffset*p;
if(dOpen<dNewOpen)
{
OrderModify(tsell,dNewOpen,0,0);
}
}
Magic(-1);
}
bool Stabilization(long iLockMagic,int iop,double dPending_MinOffset, double dMinProfit)
{
double array_order_buy[][4];
double array_order_sell[][4];
ArrayResize(array_order_buy,0);
ArrayResize(array_order_sell,0);
int cb=0,cs=0;
double dbuyprofit=0,dsellprofit=0;
for(int i=ArraySize(m_orders)-1; i>=0; i--)
{
if(m_orders[i].OrderCloseTime>0)
continue;
if(CheckMagic(m_orders[i].OrderMagicNumber,m_orders[i].OrderComment) && CheckSymbol(m_orders[i].OrderSymbol))
{
if(m_orders[i].OrderType==OP_BUY)
{
if(ArrayResize(array_order_buy,cb+1)!=-1)
{
array_order_buy[cb][0]=m_orders[i].OrderOpenPrice;
array_order_buy[cb][1]=(double)m_orders[i].OrderTicket;
array_order_buy[cb][2]=m_orders[i].OrderLots;
array_order_buy[cb][3]=m_orders[i].Profit;
if(array_order_buy[cb][3]>0)
{
dbuyprofit+=array_order_buy[cb][3];
}
cb++;
}
}
if(m_orders[i].OrderType==OP_SELL)
{
if(ArrayResize(array_order_sell,cs+1)!=-1)
{
array_order_sell[cs][0]=m_orders[i].OrderOpenPrice;
array_order_sell[cs][1]=(double)m_orders[i].OrderTicket;
array_order_sell[cs][2]=m_orders[i].OrderLots;
array_order_sell[cs][3]=m_orders[i].Profit;
if(array_order_sell[cs][3]>0)
{
dsellprofit+=array_order_sell[cs][3];
}
cs++;
}
}
}
}
double dlotstep=MarketInfo(_Symbol,MODE_LOTSTEP);
int ibuystop=Count(OP_BUYSTOP,iLockMagic);
int isellstop=Count(OP_SELLSTOP,iLockMagic);
if(dbuyprofit-dMinProfit>dsellprofit && dbuyprofit>dMinProfit && cs>0 && iop==OP_BUY && ibuystop+isellstop==0)
{
dbuyprofit-=dMinProfit;//уменьшаем на гарантированный профит
ArraySort(array_order_sell,WHOLE_ARRAY,0,MODE_ASCEND); //в сторону уветчения, нижний селл самый нижний
bool bclose=false;
for(int i=0; i<cs; i++)
{
double dprofit=array_order_sell[i][3];
if(dprofit<0)
{
double dlot=array_order_sell[i][2];
double dminuslot=NormalizeDouble(dprofit*dlotstep/dlot,2); //рассчитаем профит на минимальный шаг лота
int imaxlots=(int)(dlot/dlotstep); //рассчитаем профит на минимальный шаг лота
double dlotpart=0;
if(dminuslot<0)
{
for(int j=0; j<imaxlots; j++)
{
if(dbuyprofit+dminuslot>=0)
{
dlotpart+=dlotstep;
dbuyprofit+=dminuslot;
}
else
{
break;
}
}
if(dlotpart>0)
{
PrintFormat("Close sell part lot: %.2f minus: %.2f",dlotpart,dminuslot);
OrderClose((long)array_order_sell[i][1],dlotpart);
bclose=true;
}
else
{
break; //остановим поиск ордеров для закрытия так как исчерпали профит
}
}
}
}
bool bSetLock=false;
if(bclose)
{
for(int i=0; i<cb; i++)
{
if(array_order_buy[i][3]>0)
{
PrintFormat("Close profit order: %.2f",array_order_buy[i][3]);
OrderClose((long)array_order_buy[i][1]);
bSetLock=true;
}
}
}
}
if(ibuystop+isellstop==0)
{
double dprice=MathMin(iHigh(_Symbol,tf,1),iHigh(_Symbol,tf,2))+dPending_MinOffset*p;
Update();
int itype=-1;
double dlock=getLock(itype);
if(itype==OP_SELL)
{
Magic(iLockMagic);
long tt=OrderSend(OP_BUYSTOP,dlock,dprice,0,0,"lock");
Magic(-1);
DEBUG_OrderSend3(tt);
if(tt>0)
return true;
}
}
if(dsellprofit-dMinProfit>dbuyprofit && dsellprofit>dMinProfit && cb>0 && iop==OP_SELL && ibuystop+isellstop==0)
{
dsellprofit-=dMinProfit;
ArraySort(array_order_buy,WHOLE_ARRAY,0,MODE_DESCEND); //в сторону уменьшения, верхний это 0
bool bclose=false;
for(int i=0; i<cb; i++)
{
double dprofit=array_order_buy[i][3];
if(dprofit<0)
{
double dlot=array_order_buy[i][2];
double dminuslot=NormalizeDouble(dprofit*dlotstep/dlot,2); //рассчитаем профит на минимальный шаг лота
int imaxlots=(int)(dlot/dlotstep); //рассчитаем профит на минимальный шаг лота
double dlotpart=0;
if(dminuslot<0)
{
for(int j=0; j<imaxlots; j++)
{
if(dsellprofit+dminuslot>=0)
{
dlotpart+=dlotstep;
dsellprofit+=dminuslot;
}
else
{
break;
}
}
if(dlotpart>0)
{
PrintFormat("Close buy part lot: %.2f minus: %.2f",dlotpart,dminuslot);
OrderClose((long)array_order_buy[i][1],dlotpart);
bclose=true;
}
else
{
break; //остановим поиск ордеров для закрытия так как исчерпали профит
}
}
}
}
bool bSetLock=false;
if(bclose)
{
for(int i=0; i<cs; i++)
{
if(array_order_sell[i][3]>0)
{
PrintFormat("Close profit order: %.2f",array_order_sell[i][3]);
OrderClose((long)array_order_sell[i][1]);
bSetLock=true;
}
}
}
}
if(ibuystop+isellstop==0)
{
double dprice=MathMin(iLow(_Symbol,tf,1),iLow(_Symbol,tf,2))-dPending_MinOffset*p;
Update();
int itype=-1;
double dlock=getLock(itype);
if(itype==OP_BUY)
{
Magic(iLockMagic);
long tt=OrderSend(OP_SELLSTOP,dlock,dprice,0,0,"lock");
Magic(-1);
DEBUG_OrderSend3(tt);
if(tt>0)
return true;
}
}
return false;
}
};
class CMain: public CMainDefault
{
protected:
CMyOrders m_main;
CNewBar m_bar;
SNButton m_lock,m_stab;
CDraw m_draw;
CTimer m_timer;
CDrawPos m_pos;
bool bcheck;
public:
virtual int OnInit()
{
// код доступен только после оплаты
}
virtual void OnDeinit(const int reason)
{
m_timer.OnDeinit();
m_main.OnDeinit();
m_draw.OnDeinit();
m_lock.OnDeinit();
m_stab.OnDeinit();
}
virtual void OnTick()
{
// код доступен только после оплаты
}
string sLicense=VALID_KEY;
bcheck=checkAccount(sLicense,LICENSE_NAME);
m_pos.DrawStatus("status",sLicense,bcheck);
OnTimer();
if(!m_main.IsWork())
return; //отключена торговля
m_bar.Refresh();
m_main.OnTick();
m_main.Update(); //получим кол-во ордеров в структуре orders
m_main.MovePending(LockMagic,PendingOffset);
double dlots[2];
double dlock=m_main.get_lots(dlots);
bool bStatusLock=(bool)State("StatusLock");
bool bStatusStab=(bool)State("StatusStПоказано первые 50% кода (символов: 12944)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.