dragon trade.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «dragon trade.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Dragon Trade — торговый советник для MetaTrader 4, работающий на основе технических индикаторов и ценовых данных. Советник анализирует текущие рыночные условия и автоматически открывает и управляет ордерами на торговом счёте.
Программа поддерживает управление сеткой ордеров с возможностью усреднения позиций и добавления ордеров по профиту. Встроена система сопровождения прибыли с трейлинг-стопом и тейк-профитом для контроля рисков.
Советник оснащён настраиваемой информационной панелью, отображающей баланс, эквити, профит и другую торговую информацию. Реализована фильтрация по спреду, времени работы и количеству сигналов. Встроена система лицензирования для защиты продукта.
Настройки программы
| Настройка | Описание |
|---|---|
| Комментарий (cmt) | Комментарий — Комментарий к ордерам |
| Размер текста в панели (FontSize) | Размер текста в панели — Размер текста в панели |
| Magic | Меджик — Меджик — идентификатор ордеров советника |
| Time (WorkTime) | Время работы — Время работы |
| Максимальный спред (0 - выкл) (MaxSpread) | Максимальный спред (0 - выкл) — Максимальный спред (0 — выключено) |
| Максимальное количество ордеров по сигналам (MaxSignals) | Максимальное количество ордеров по сигналам — Максимальное количество ордеров по сигналам |
| Инверсия сигналов (Inverse) | Инверсия сигналов — Инверсия сигналов |
| Lot (Lot) | Лот — Размер лота |
| Количество ордеров по профиту (0 - выкл) (MaxOrdersProfit) | Количество ордеров по профиту (0 - выкл) — Количество ордеров по профиту (0 — выключено) |
| Следующий ордер по профиту через (пт) (NextOrderProfit) | Следующий ордер по профиту через (пт) — Следующий ордер по профиту через (пт) |
| Множитель по профиту (ProfitLotMn) | Множитель по профиту — Множитель по профиту |
| Добавочный лот по профиту (ProfitLotAdd) | Добавочный лот по профиту — Добавочный лот по профиту |
| Максимальный лот по профиту (ProfitMaxLot) | Максимальный лот по профиту — Максимальный лот по профиту |
| Количество усредняющих ордеров (0 - выкл) (MaxOrdersMinus) | Количество усредняющих ордеров (0 - выкл) — Количество усредняющих ордеров (0 — выключено) |
| Усредняющий ордер через (пт) (NextOrderMinus) | Усредняющий ордер через (пт) — Усредняющий ордер через (пт) |
| Множитель при усреднении (MinusLotMn) | Множитель при усреднении — Множитель при усреднении |
| Добавочный лот при усреднении (MinusLotAdd) | Добавочный лот при усреднении — Добавочный лот при усреднении |
| Максимальный лот при усреднении (MinusMaxLot) | Максимальный лот при усреднении — Максимальный лот при усреднении |
| Тейк профит для сетки (0 - выкл) (TakeProfit) | Тейк профит для сетки (0 - выкл) — Тейк профит для сетки (0 — выключено) |
| Общий трейлинг старт ($) (TrailingStart) | Общий трейлинг старт ($) — Общий трейлинг старт ($) |
| Общий трейлинг стоп($) (TrailingStop) | Общий трейлинг стоп($) — Общий трейлинг стоп ($) |
| период быстрой средней (fast_ema_period) | период быстрой средней — Период быстрой средней |
| период медленной средней (slow_ema_period) | период медленной средней — Период медленной средней |
| период сигнальной линии (signal_period) | период сигнальной линии — Период сигнальной линии |
Поиск по коду файла
#property version "1.00"
#property strict
#include <sovetnikovGUI\Orders.mqh>
#include <sovetnikovGUI\Time.mqh>
#include <sovetnikovGUI\Button.mqh>
#include <Charts\Chart.mqh>
#define VALID_KEY "Эксперт активирован."
#define EMPTY_KEY "Отсутствует лицензия."
#define INVALID_KEY "Неверная лицензия."
#define EXPERIED "Закончилось время работы."
#define LICENSE_NAME "dragontrade_key"
#define FILE_EXT "dragon"
#resource "\\Images\\dragon\\panel_dragon.bmp"
#define PANEL_RESOURCE "::Images\\dragon\\panel_dragon.bmp"
#define PANEL_W 524
#define PANEL_H 474
S cmt=""; //Комментарий
I FontSize=11; //Размер текста в панели
I Magic=888;
S WorkTime="00:00-24:00"; //Time
D MaxSpread=0; //Максимальный спред (0 - выкл)
I MaxSignals=3; //Максимальное количество ордеров по сигналам
B Inverse=false; //Инверсия сигналов
D Lot=0.1; //Lot
SEP(10);//.
BLOCK(10,"Профит");//.
I MaxOrdersProfit=100; //Количество ордеров по профиту (0 - выкл)
D NextOrderProfit=20; //Следующий ордер по профиту через (пт)
D ProfitLotMn=1; //Множитель по профиту
D ProfitLotAdd=0;//Добавочный лот по профиту
D ProfitMaxLot=100; //Максимальный лот по профиту
SEP(11);//.
BLOCK(11,"Минус");//.
I MaxOrdersMinus=100; //Количество усредняющих ордеров (0 - выкл)
D NextOrderMinus=100; //Усредняющий ордер через (пт)
D MinusLotMn=1.53; //Множитель при усреднении
D MinusLotAdd=0;//Добавочный лот при усреднении
D MinusMaxLot=100; //Максимальный лот при усреднении
SEP(12);//.
BLOCK(12,"Сопровождение прибыли");//.
D TakeProfit=0; //Тейк профит для сетки (0 - выкл)
D TrailingStart=10;//Общий трейлинг старт ($)
D TrailingStop=5;//Общий трейлинг стоп($)
SEP(1);//.
BLOCK(1,"Indicator settings");//.
ENUM_TIMEFRAMES tf=PERIOD_CURRENT;
I fast_ema_period=12; // период быстрой средней
I slow_ema_period=24; // период медленной средней
I signal_period=9; //период сигнальной линии
int signal_bar=SIGNAL_BAR_OPEN;
int slippage=0;
class CMyOrders: public COrders
{
public:
int signal()
{
double dmacd[2],dmacds[2];
dmacd[0]=iMACD(_Symbol,tf,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_MAIN,signal_bar);
dmacd[1]=iMACD(_Symbol,tf,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_MAIN,signal_bar+1);
dmacds[0]=iMACD(_Symbol,tf,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_SIGNAL,signal_bar);
dmacds[1]=iMACD(_Symbol,tf,fast_ema_period,slow_ema_period,signal_period,PRICE_CLOSE,MODE_SIGNAL,signal_bar+1);
double dsar=iSAR(_Symbol,tf,0.002,0.02,1);
double dhigh=iHigh(_Symbol,tf,1);
double dlow=iLow(_Symbol,tf,1);
if(dmacd[0]>0 && dsar<dlow)
return OP_BUY;
if(dmacd[0]<0 && dsar>dhigh)
return OP_SELL;
return -1;
}
void CloseByMagic(long iMagic)
{
for(int i=::OrdersTotal()-1; i>=0; i--)
{
if(!::OrderSelect(i,SELECT_BY_POS))
continue;
if((::OrderMagicNumber()==iMagic || ::OrderTicket()==iMagic) && ::OrderSymbol()==m_name)
{
OrderClose(::OrderTicket());
}
}
}
double ControlByMagic(long iMagic,int itype,bool bclose,bool bspread,int &ib,int &is)
{
double array_order_buy[][2], array_order_sell[][2];/*0-price,1-ticket*/
ArrayResize(array_order_buy,0);
ArrayResize(array_order_sell,0);
int cb=0,cs=0;
double dprofit=0;
for(int i=::OrdersTotal()-1; i>=0; i--)
{
if(!::OrderSelect(i,SELECT_BY_POS))
continue;
if((::OrderMagicNumber()==iMagic || ::OrderTicket()==iMagic) && ::OrderSymbol()==m_name)
{
if(::OrderType()==OP_BUY && itype==OP_BUY)
{
if(ArrayResize(array_order_buy,cb+1)!=-1)
{
array_order_buy[cb][0]=::OrderOpenPrice();
array_order_buy[cb][1]=(double)::OrderTicket();
cb++;
ib++;
dprofit+=MacroProfit;
}
}
if(::OrderType()==OP_SELL && itype==OP_SELL)
{
if(ArrayResize(array_order_sell,cs+1)!=-1)
{
array_order_sell[cs][0]=::OrderOpenPrice();
array_order_sell[cs][1]=(double)::OrderTicket();
cs++;
is++;
dprofit+=MacroProfit;
}
}
}
}
if(!bclose && bspread)
{
if(itype==OP_BUY && cb>0)
{
ArraySort(array_order_buy,WHOLE_ARRAY,0,MODE_ASCEND);
int tup=(int)array_order_buy[cb-1][1];
int tdn=(int)array_order_buy[0][1];
int icountPlus=0,icountMinus=0;
for(int i=0; i<cb; i++)
{
if((int)array_order_buy[0][1]!=iMagic)
icountMinus++;
else
break;
}
icountPlus=cb-icountMinus;
if(NextOrderProfit>0 && icountPlus<MaxOrdersProfit)
{
if(::OrderSelect(tup,SELECT_BY_TICKET,MODE_TRADES))
{
if(::OrderCloseTime()==0)
{
double dpt=OrderStepPoint();
if(dpt>=NextOrderProfit)
{
double dnextlot=NLot(::OrderLots()*ProfitLotMn+ProfitLotAdd);
Magic(iMagic);
if(dnextlot>ProfitMaxLot)
dnextlot=ProfitMaxLot;
OrderSend(itype,dnextlot,-1,0,0,StringFormat("+%d",iMagic));
Magic(Magic);
}
}
}
}
if(NextOrderMinus>0 && icountMinus<MaxOrdersMinus)
{
if(::OrderSelect(tdn,SELECT_BY_TICKET,MODE_TRADES))
{
if(::OrderCloseTime()==0)
{
double dpt=OrderStepPoint();
if(dpt<=-NextOrderMinus)
{
double dnextlot=NLot(::OrderLots()*MinusLotMn+MinusLotAdd);
Magic(iMagic);
if(dnextlot>MinusMaxLot)
dnextlot=MinusMaxLot;
OrderSend(itype,dnextlot,-1,0,0,StringFormat("-%d",iMagic));
Magic(Magic);
}
}
}
}
}
else
if(itype==OP_SELL && cs>0)
{
ArraySort(array_order_sell,WHOLE_ARRAY,0,MODE_DESCEND);
int tup=(int)array_order_sell[0][1];
int tdn=(int)array_order_sell[cs-1][1];
int icountPlus=0,icountMinus=0;
for(int i=0; i<cs; i++)
{
if((int)array_order_sell[0][1]!=iMagic)
icountPlus++;
else
break;
}
icountMinus=cs-icountPlus;
if(NextOrderProfit>0 && icountPlus<MaxOrdersProfit)
{
if(::OrderSelect(tdn,SELECT_BY_TICKET,MODE_TRADES))
{
if(::OrderCloseTime()==0)
{
double dpt=OrderStepPoint();
if(dpt>=NextOrderProfit)
{
double dnextlot=NLot(::OrderLots()*ProfitLotMn+ProfitLotAdd);
Magic(iMagic);
if(dnextlot>ProfitMaxLot)
dnextlot=ProfitMaxLot;
OrderSend(itype,dnextlot,-1,0,0,StringFormat("+%d",iMagic));
Magic(Magic);
}
}
}
}
if(NextOrderMinus>0 && icountMinus<MaxOrdersMinus)
{
if(::OrderSelect(tup,SELECT_BY_TICKET,MODE_TRADES))
{
if(::OrderCloseTime()==0)
{
double dpt=OrderStepPoint();
if(dpt<=-NextOrderMinus)
{
double dnextlot=NLot(::OrderLots()*MinusLotMn+MinusLotAdd);
Magic(iMagic);
if(dnextlot>MinusMaxLot)
dnextlot=MinusMaxLot;
OrderSend(itype,dnextlot,-1,0,0,StringFormat("-%d",iMagic));
Magic(Magic);
}
}
}
}
}
}
return dprofit;//профит сетки
}
double get_AverageByMagic(long iMagic,int itype,int &idirect,double dProfit=0)
{
double dprofit[2]= {0,0},
m_lots[2]= {0,0},
icount[2]= {0,0};
idirect=0;
double dask=SymbolInfoDouble(m_name,SYMBOL_ASK);
double dbid=SymbolInfoDouble(m_name,SYMBOL_BID);
for(int i=::OrdersTotal()-1; i>=0; i--)
{
if(!::OrderSelect(i,SELECT_BY_POS))
continue;
if((::OrderMagicNumber()==iMagic || ::OrderTicket()==iMagic) && ::OrderSymbol()==m_name)
{
if(::OrderType()==OP_BUY && itype==OP_BUY)
{
m_lots[0]+=::OrderLots();
dprofit[0]+=MacroProfit;
icount[0]++;
}
if(::OrderType()==OP_SELL && itype==OP_SELL)
{
m_lots[1]+=::OrderLots();
dprofit[1]+=MacroProfit;
icount[1]++;
}
}
}
if(NormalizeDouble(m_lots[0],2)-NormalizeDouble(m_lots[1],2)==0.0)
return (0);
if(NormalizeDouble(m_lots[0],2)>NormalizeDouble(m_lots[1],2))
idirect=1;
if(NormalizeDouble(m_lots[0],2)<NormalizeDouble(m_lots[1],2))
idirect=-1;
double PriceLevel=0;
double TickValue=NormalizeDouble(SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE),3);
if(TickValue==0.0)
return 0;
double _dpoint=SymbolInfoDouble(m_name,SYMBOL_POINT);
if(_dpoint==0.0)
return 0;
double sp=ND1((dask-dbid)/p);
int idigits=(int)SymbolInfoInteger(m_name,SYMBOL_DIGITS);
if((m_lots[0]-m_lots[1])>0)
PriceLevel=nd(dbid-((dprofit[0]+dprofit[1]+dProfit)/(TickValue*(m_lots[0]-m_lots[1]))*_dpoint),m_name);
if((m_lots[1]-m_lots[0])>0)
PriceLevel=nd(dask+((dprofit[0]+dprofit[1]+dProfit)/(TickValue*(m_lots[1]-m_lots[0]))*_dpoint),m_name);
if(idigits>0)
{
if(idigits==5 || idigits==3 || SymbolInfoInteger(m_name,SYMBOL_TRADE_CALC_MODE)==1)
{
idigits=(int)(idigits-1);
return NormalizeDouble(PriceLevel,idigits);
}
}
return NormalizeDouble(PriceLevel,idigits);
}
void OrdersControl(bool bspread,int &ib,int &is)
{
/*
1. контроль усреднений по каждой сделке, вначале формируем список сделок с нашим меджиком
2. по каждой сделке отрабатываем логику усреднений и трала , паралельно учитываем их общий профит для вклчюения трала по общему профиту
*/
double dsumm=0;
ib=0;
is=0;
int icount=0;
for(int i=ArraySize(m_orders)-1; i>=0; i--)
{
if(m_orders[i].OrderCloseTime>0)
continue; //пропустим закрытые
if(m_orders[i].OrderMagicNumber==Magic && m_orders[i].OrderSymbol==m_name)
{
icount++;
long imagic=m_orders[i].OrderTicket;
int itype=m_orders[i].OrderType;
double dprofitsetka=ControlByMagic(imagic,itype,bClose,bspread,ib,is); //обработаем сетку каждого ордера
if(TakeProfit>0)
{
int idirect;
double davg=get_AverageByMagic(imagic,itype,idirect);
if(davg>0)
{
if(itype==OP_BUY && Bid>=davg+TakeProfit*p)
{
dprofitsetka=0;
CloseByMagic(imagic);Показано первые 50% кода (символов: 16496)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.