#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 и нажмите кнопку, чтобы перейти к оплате.